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.
Files changed (369) hide show
  1. {vgi_python-0.8.9 → vgi_python-0.8.10}/PKG-INFO +1 -1
  2. {vgi_python-0.8.9 → vgi_python-0.8.10}/ci/run-integration.sh +12 -1
  3. {vgi_python-0.8.9 → vgi_python-0.8.10}/pyproject.toml +1 -1
  4. {vgi_python-0.8.9 → vgi_python-0.8.10}/uv.lock +1 -1
  5. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/arithmetic.py +10 -2
  6. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/arguments.py +41 -0
  7. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/scalar_function.py +45 -3
  8. {vgi_python-0.8.9 → vgi_python-0.8.10}/.gitattributes +0 -0
  9. {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/dependabot.yml +0 -0
  10. {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  11. {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/ci.yml +0 -0
  12. {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/docs.yml +0 -0
  13. {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/integration.yml +0 -0
  14. {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/release.yml +0 -0
  15. {vgi_python-0.8.9 → vgi_python-0.8.10}/.gitignore +0 -0
  16. {vgi_python-0.8.9 → vgi_python-0.8.10}/.python-version +0 -0
  17. {vgi_python-0.8.9 → vgi_python-0.8.10}/.vale.ini +0 -0
  18. {vgi_python-0.8.9 → vgi_python-0.8.10}/CLAUDE.md +0 -0
  19. {vgi_python-0.8.9 → vgi_python-0.8.10}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  20. {vgi_python-0.8.9 → vgi_python-0.8.10}/DOCS_REVIEW_RUBRIC.md +0 -0
  21. {vgi_python-0.8.9 → vgi_python-0.8.10}/DOCS_USABILITY_TEST.md +0 -0
  22. {vgi_python-0.8.9 → vgi_python-0.8.10}/LICENSE +0 -0
  23. {vgi_python-0.8.9 → vgi_python-0.8.10}/README.md +0 -0
  24. {vgi_python-0.8.9 → vgi_python-0.8.10}/SECURITY.md +0 -0
  25. {vgi_python-0.8.9 → vgi_python-0.8.10}/ci/README.md +0 -0
  26. {vgi_python-0.8.9 → vgi_python-0.8.10}/ci/preprocess-require.awk +0 -0
  27. {vgi_python-0.8.9 → vgi_python-0.8.10}/dist-vgi/.gitignore +0 -0
  28. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/aggregate-functions.md +0 -0
  29. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/arguments.md +0 -0
  30. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/auth.md +0 -0
  31. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/catalogs.md +0 -0
  32. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/client.md +0 -0
  33. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/exceptions.md +0 -0
  34. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/filters.md +0 -0
  35. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/functions.md +0 -0
  36. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/http.md +0 -0
  37. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/index.md +0 -0
  38. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/metadata.md +0 -0
  39. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/observability.md +0 -0
  40. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/storage.md +0 -0
  41. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/transactor.md +0 -0
  42. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/worker.md +0 -0
  43. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/argument-serialization.md +0 -0
  44. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/apple-touch-icon.png +0 -0
  45. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/favicon-16x16.png +0 -0
  46. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/favicon-32x32.png +0 -0
  47. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/favicon.ico +0 -0
  48. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/aggregate.svg +0 -0
  49. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/buffering.svg +0 -0
  50. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/scalar.svg +0 -0
  51. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/table-in-out.svg +0 -0
  52. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/table.svg +0 -0
  53. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/logo.png +0 -0
  54. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/social-card.png +0 -0
  55. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/authentication.md +0 -0
  56. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/catalog-interface.md +0 -0
  57. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/cli.md +0 -0
  58. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/column-statistics.md +0 -0
  59. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/concepts/index.md +0 -0
  60. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/contributing-docs.md +0 -0
  61. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/filter-pushdown.md +0 -0
  62. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/generator-api.md +0 -0
  63. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/catalogs.md +0 -0
  64. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/function-patterns.md +0 -0
  65. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/http-auth.md +0 -0
  66. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/index.md +0 -0
  67. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/pushdown-and-statistics.md +0 -0
  68. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/state-storage.md +0 -0
  69. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/index.md +0 -0
  70. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/lifecycle.md +0 -0
  71. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/metadata.md +0 -0
  72. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/overrides/main.html +0 -0
  73. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/robots.txt +0 -0
  74. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/shared-storage.md +0 -0
  75. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/stylesheets/extra.css +0 -0
  76. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/tutorial/index.md +0 -0
  77. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/tutorial/scalar.md +0 -0
  78. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/tutorial/table.md +0 -0
  79. {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/vgi-logo.png +0 -0
  80. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/calc_scalar_worker.py +0 -0
  81. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/calc_worker.py +0 -0
  82. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/filter_worker.py +0 -0
  83. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/greeting_scalar_worker.py +0 -0
  84. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/row_count_worker.py +0 -0
  85. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/series_streaming_worker.py +0 -0
  86. {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/sum_worker.py +0 -0
  87. {vgi_python-0.8.9 → vgi_python-0.8.10}/mkdocs.yml +0 -0
  88. {vgi_python-0.8.9 → vgi_python-0.8.10}/packages/vgi-fixtures/LICENSE +0 -0
  89. {vgi_python-0.8.9 → vgi_python-0.8.10}/packages/vgi-fixtures/README.md +0 -0
  90. {vgi_python-0.8.9 → vgi_python-0.8.10}/packages/vgi-fixtures/pyproject.toml +0 -0
  91. {vgi_python-0.8.9 → vgi_python-0.8.10}/scripts/measure_startup.py +0 -0
  92. {vgi_python-0.8.9 → vgi_python-0.8.10}/scripts/run_all_tests.sh +0 -0
  93. {vgi_python-0.8.9 → vgi_python-0.8.10}/test-data/generate.sh +0 -0
  94. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/__init__.py +0 -0
  95. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/_http_fixtures.py +0 -0
  96. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/__init__.py +0 -0
  97. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_catalog_interface.py +0 -0
  98. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_client_catalog.py +0 -0
  99. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_column_statistics.py +0 -0
  100. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_declarative.py +0 -0
  101. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_example_worker_catalog.py +0 -0
  102. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_integration.py +0 -0
  103. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_required_field_filter_paths.py +0 -0
  104. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_scan_branches.py +0 -0
  105. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_serialization.py +0 -0
  106. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_setting.py +0 -0
  107. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_storage.py +0 -0
  108. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_time_travel.py +0 -0
  109. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_writable_table.py +0 -0
  110. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/__init__.py +0 -0
  111. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_broken_pipe.py +0 -0
  112. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_cli.py +0 -0
  113. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_cli_catalog_functions.py +0 -0
  114. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_worker_debug.py +0 -0
  115. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/__init__.py +0 -0
  116. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/_stub.py +0 -0
  117. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/conftest.py +0 -0
  118. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_accumulate.py +0 -0
  119. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_aggregate.py +0 -0
  120. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_attach.py +0 -0
  121. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_bearer_auth.py +0 -0
  122. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_directory_parity.py +0 -0
  123. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_function_inventory.py +0 -0
  124. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_http_client.py +0 -0
  125. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_http_external_location.py +0 -0
  126. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_http_upload_url.py +0 -0
  127. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_macro.py +0 -0
  128. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_overload.py +0 -0
  129. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_protocol_inventory.py +0 -0
  130. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_protocol_version.py +0 -0
  131. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_resumable_scan.py +0 -0
  132. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_scalar.py +0 -0
  133. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  134. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_secret.py +0 -0
  135. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_settings.py +0 -0
  136. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_table.py +0 -0
  137. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_table_in_out.py +0 -0
  138. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_view.py +0 -0
  139. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_writable.py +0 -0
  140. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conftest.py +0 -0
  141. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/__init__.py +0 -0
  142. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_bernoulli_function.py +0 -0
  143. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_binary_packet_function.py +0 -0
  144. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_client.py +0 -0
  145. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_conditional_message_function.py +0 -0
  146. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_hash_seed_function.py +0 -0
  147. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  148. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_multiply_function.py +0 -0
  149. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_random_bytes_function.py +0 -0
  150. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_return_secret_value_function.py +0 -0
  151. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/__init__.py +0 -0
  152. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/__init__.py +0 -0
  153. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_constant_columns_function.py +0 -0
  154. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_double_sequence_function.py +0 -0
  155. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_exception_function.py +0 -0
  156. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_filter_echo_function.py +0 -0
  157. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_logging_function.py +0 -0
  158. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_nested_sequence_function.py +0 -0
  159. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_partitioned_function.py +0 -0
  160. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_projected_data_function.py +0 -0
  161. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_sequence_function.py +0 -0
  162. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_settings_function.py +0 -0
  163. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_struct_settings_function.py +0 -0
  164. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_ten_thousand_function.py +0 -0
  165. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/__init__.py +0 -0
  166. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/__init__.py +0 -0
  167. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  168. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_echo_function.py +0 -0
  169. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  170. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  171. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  172. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  173. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/test_client.py +0 -0
  174. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_access_log_audit.py +0 -0
  175. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_aggregate_function.py +0 -0
  176. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_argument_spec.py +0 -0
  177. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_auth.py +0 -0
  178. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_bind_exceptions.py +0 -0
  179. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_bind_request_at_clause.py +0 -0
  180. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_bound_storage_conformance.py +0 -0
  181. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_catalog_auth_binding.py +0 -0
  182. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_copy_from_function.py +0 -0
  183. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_copy_to_function.py +0 -0
  184. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_docstrings.py +0 -0
  185. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_documentation_examples.py +0 -0
  186. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_example_function_arg_types.py +0 -0
  187. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_examples_workers.py +0 -0
  188. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_exception_handling.py +0 -0
  189. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_exceptions.py +0 -0
  190. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_filter_pushdown.py +0 -0
  191. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_filter_pushdown_extension.py +0 -0
  192. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage.py +0 -0
  193. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_azure_sql.py +0 -0
  194. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_cf_do.py +0 -0
  195. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_cf_do_integration.py +0 -0
  196. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_conformance.py +0 -0
  197. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_constants.py +0 -0
  198. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_protocol_version.py +0 -0
  199. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_request_builders.py +0 -0
  200. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_schemas.py +0 -0
  201. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_secret.py +0 -0
  202. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_go_schemas.py +0 -0
  203. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_protocol_version.py +0 -0
  204. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_schemas_cross_lang.py +0 -0
  205. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_ts_client.py +0 -0
  206. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_ts_schemas.py +0 -0
  207. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_http_demo_storage.py +0 -0
  208. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_http_s3_offload_input.py +0 -0
  209. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_http_s3_offload_output.py +0 -0
  210. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_metadata.py +0 -0
  211. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_mypy_consolidated.py +0 -0
  212. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_nest_tensor.py +0 -0
  213. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_otel.py +0 -0
  214. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_projection_enforcement.py +0 -0
  215. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_projection_repro.py +0 -0
  216. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_protocol_classes.py +0 -0
  217. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_resolved_secrets.py +0 -0
  218. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_schema_utils.py +0 -0
  219. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_serve.py +0 -0
  220. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_setting_secret_annotations.py +0 -0
  221. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_table_buffering_function.py +0 -0
  222. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_table_function_dynamic_to_string.py +0 -0
  223. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_tcp_transport.py +0 -0
  224. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_type_bounds.py +0 -0
  225. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_union_argument.py +0 -0
  226. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_worker.py +0 -0
  227. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_worker_cli.py +0 -0
  228. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_worker_page.py +0 -0
  229. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/transactor/__init__.py +0 -0
  230. {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/transactor/test_transactor.py +0 -0
  231. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/__init__.py +0 -0
  232. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_duckdb.py +0 -0
  233. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_storage_profile.py +0 -0
  234. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/__init__.py +0 -0
  235. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  236. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  237. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  238. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  239. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  240. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  241. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  242. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  243. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  244. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  245. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  246. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/window.py +0 -0
  247. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/attach_options.py +0 -0
  248. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/bad_enum.py +0 -0
  249. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/bad_protocol.py +0 -0
  250. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/cancellable.py +0 -0
  251. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/catalog.py +0 -0
  252. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/copy_from.py +0 -0
  253. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/copy_to.py +0 -0
  254. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/http_server.py +0 -0
  255. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  256. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  257. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/nest_tensor.py +0 -0
  258. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  259. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  260. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  261. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  262. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/_common.py +0 -0
  263. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/binary.py +0 -0
  264. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  265. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/geo.py +0 -0
  266. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  267. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  268. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  269. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  270. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  271. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  272. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/simple_writable.py +0 -0
  273. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/__init__.py +0 -0
  274. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/_common.py +0 -0
  275. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/batch_index.py +0 -0
  276. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  277. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  278. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/filters.py +0 -0
  279. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  280. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/make_series.py +0 -0
  281. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/misc.py +0 -0
  282. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/order_modes.py +0 -0
  283. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/pairs.py +0 -0
  284. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  285. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  286. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  287. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/required_filters.py +0 -0
  288. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/sequence.py +0 -0
  289. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/settings.py +0 -0
  290. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  291. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  292. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  293. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/versioned.py +0 -0
  294. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table_in_out.py +0 -0
  295. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/versioned.py +0 -0
  296. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/versioned_tables.py +0 -0
  297. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/worker.py +0 -0
  298. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/__init__.py +0 -0
  299. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/generic.py +0 -0
  300. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/table.py +0 -0
  301. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/worker.py +0 -0
  302. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/aggregate_function.py +0 -0
  303. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/argument_spec.py +0 -0
  304. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/auth.py +0 -0
  305. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/__init__.py +0 -0
  306. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/_descriptor_spec.py +0 -0
  307. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/attach_option.py +0 -0
  308. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/catalog_interface.py +0 -0
  309. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/descriptors.py +0 -0
  310. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/duckdb_statistics.py +0 -0
  311. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/secret_type.py +0 -0
  312. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/setting.py +0 -0
  313. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/storage.py +0 -0
  314. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/__init__.py +0 -0
  315. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/catalog_mixin.py +0 -0
  316. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli.py +0 -0
  317. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_catalog.py +0 -0
  318. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_schema.py +0 -0
  319. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_table.py +0 -0
  320. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_transaction.py +0 -0
  321. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_utils.py +0 -0
  322. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_view.py +0 -0
  323. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/client.py +0 -0
  324. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/__init__.py +0 -0
  325. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/_common.py +0 -0
  326. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_constants.py +0 -0
  327. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_protocol_version.py +0 -0
  328. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_request_builders.py +0 -0
  329. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_schemas.py +0 -0
  330. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  331. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  332. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_secret_schemas.py +0 -0
  333. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/go_schemas.py +0 -0
  334. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/protocol_version.py +0 -0
  335. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/ts_client.py +0 -0
  336. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/ts_schemas.py +0 -0
  337. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/copy_from_function.py +0 -0
  338. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/copy_to_function.py +0 -0
  339. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/exceptions.py +0 -0
  340. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function.py +0 -0
  341. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function_storage.py +0 -0
  342. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function_storage_azure_sql.py +0 -0
  343. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function_storage_cf_do.py +0 -0
  344. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/http/__init__.py +0 -0
  345. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/http/demo_storage.py +0 -0
  346. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/http/worker_page.py +0 -0
  347. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/invocation.py +0 -0
  348. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/logging_config.py +0 -0
  349. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/meta_worker.py +0 -0
  350. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/metadata.py +0 -0
  351. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/otel.py +0 -0
  352. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/protocol.py +0 -0
  353. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/protocol_version.txt +0 -0
  354. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/py.typed +0 -0
  355. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/schema_utils.py +0 -0
  356. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/secret_protocol.py +0 -0
  357. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/secret_service.py +0 -0
  358. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/serve.py +0 -0
  359. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_buffering_function.py +0 -0
  360. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_filter_pushdown.py +0 -0
  361. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_function.py +0 -0
  362. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_in_out_function.py +0 -0
  363. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/__init__.py +0 -0
  364. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/_duckdb_compat.py +0 -0
  365. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/client.py +0 -0
  366. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/protocol.py +0 -0
  367. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/server.py +0 -0
  368. {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/worker.py +0 -0
  369. {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.9
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.8.9"
3
+ version = "0.8.10"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -2228,7 +2228,7 @@ requires-dist = [
2228
2228
 
2229
2229
  [[package]]
2230
2230
  name = "vgi-python"
2231
- version = "0.8.9"
2231
+ version = "0.8.10"
2232
2232
  source = { editable = "." }
2233
2233
  dependencies = [
2234
2234
  { name = "click" },
@@ -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[int, ConstParam("Multiplication factor")],
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 scalar values from arguments
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
- # Convert to Python value
1061
- kwargs[name] = scalar.as_py() if scalar is not None else None
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