vgi-python 0.15.0__tar.gz → 0.16.1__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 (390) hide show
  1. {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/integration.yml +1 -1
  2. {vgi_python-0.15.0 → vgi_python-0.16.1}/PKG-INFO +1 -1
  3. {vgi_python-0.15.0 → vgi_python-0.16.1}/pyproject.toml +1 -1
  4. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/landing/describe.expected.json +277 -2
  5. vgi_python-0.16.1/tests/table_in_out/generator/test_substream_partial_sum_function.py +70 -0
  6. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +5 -5
  7. vgi_python-0.16.1/tests/table_in_out/test_blended_metadata.py +150 -0
  8. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_filter_pushdown.py +85 -0
  9. {vgi_python-0.15.0 → vgi_python-0.16.1}/uv.lock +1 -1
  10. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/__init__.py +6 -0
  11. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/arithmetic.py +77 -0
  12. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/__init__.py +8 -0
  13. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/cache.py +337 -2
  14. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table_in_out.py +743 -61
  15. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/worker.py +64 -42
  16. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/cache_control.py +10 -0
  17. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/catalog_interface.py +15 -0
  18. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/duckdb_statistics.py +129 -102
  19. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/metadata.py +73 -1
  20. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/protocol.py +102 -4
  21. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/scalar_function.py +10 -1
  22. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_filter_pushdown.py +75 -44
  23. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_function.py +43 -3
  24. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_in_out_function.py +49 -0
  25. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/worker.py +104 -17
  26. {vgi_python-0.15.0 → vgi_python-0.16.1}/.gitattributes +0 -0
  27. {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/dependabot.yml +0 -0
  28. {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  29. {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/ci.yml +0 -0
  30. {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/docs.yml +0 -0
  31. {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/release.yml +0 -0
  32. {vgi_python-0.15.0 → vgi_python-0.16.1}/.gitignore +0 -0
  33. {vgi_python-0.15.0 → vgi_python-0.16.1}/.python-version +0 -0
  34. {vgi_python-0.15.0 → vgi_python-0.16.1}/.vale.ini +0 -0
  35. {vgi_python-0.15.0 → vgi_python-0.16.1}/CLAUDE.md +0 -0
  36. {vgi_python-0.15.0 → vgi_python-0.16.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  37. {vgi_python-0.15.0 → vgi_python-0.16.1}/DOCS_REVIEW_RUBRIC.md +0 -0
  38. {vgi_python-0.15.0 → vgi_python-0.16.1}/DOCS_USABILITY_TEST.md +0 -0
  39. {vgi_python-0.15.0 → vgi_python-0.16.1}/LICENSE +0 -0
  40. {vgi_python-0.15.0 → vgi_python-0.16.1}/README.md +0 -0
  41. {vgi_python-0.15.0 → vgi_python-0.16.1}/SECURITY.md +0 -0
  42. {vgi_python-0.15.0 → vgi_python-0.16.1}/ci/README.md +0 -0
  43. {vgi_python-0.15.0 → vgi_python-0.16.1}/ci/preprocess-require.awk +0 -0
  44. {vgi_python-0.15.0 → vgi_python-0.16.1}/ci/run-integration.sh +0 -0
  45. {vgi_python-0.15.0 → vgi_python-0.16.1}/dist-vgi/.gitignore +0 -0
  46. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/aggregate-functions.md +0 -0
  47. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/arguments.md +0 -0
  48. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/auth.md +0 -0
  49. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/catalogs.md +0 -0
  50. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/client.md +0 -0
  51. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/exceptions.md +0 -0
  52. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/filters.md +0 -0
  53. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/functions.md +0 -0
  54. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/http.md +0 -0
  55. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/index.md +0 -0
  56. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/metadata.md +0 -0
  57. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/observability.md +0 -0
  58. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/storage.md +0 -0
  59. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/transactor.md +0 -0
  60. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/worker.md +0 -0
  61. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/argument-serialization.md +0 -0
  62. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/apple-touch-icon.png +0 -0
  63. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/favicon-16x16.png +0 -0
  64. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/favicon-32x32.png +0 -0
  65. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/favicon.ico +0 -0
  66. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/aggregate.svg +0 -0
  67. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/buffering.svg +0 -0
  68. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/scalar.svg +0 -0
  69. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/table-in-out.svg +0 -0
  70. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/table.svg +0 -0
  71. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/logo.png +0 -0
  72. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/social-card.png +0 -0
  73. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/authentication.md +0 -0
  74. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/catalog-interface.md +0 -0
  75. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/cli.md +0 -0
  76. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/column-statistics.md +0 -0
  77. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/concepts/index.md +0 -0
  78. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/contributing-docs.md +0 -0
  79. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/filter-pushdown.md +0 -0
  80. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/generator-api.md +0 -0
  81. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/catalogs.md +0 -0
  82. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/function-patterns.md +0 -0
  83. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/http-auth.md +0 -0
  84. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/index.md +0 -0
  85. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/pushdown-and-statistics.md +0 -0
  86. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/state-storage.md +0 -0
  87. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/index.md +0 -0
  88. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/lifecycle.md +0 -0
  89. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/metadata.md +0 -0
  90. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/overrides/main.html +0 -0
  91. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/robots.txt +0 -0
  92. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/shared-storage.md +0 -0
  93. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/stylesheets/extra.css +0 -0
  94. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/tutorial/index.md +0 -0
  95. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/tutorial/scalar.md +0 -0
  96. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/tutorial/table.md +0 -0
  97. {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/vgi-logo.png +0 -0
  98. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/calc_scalar_worker.py +0 -0
  99. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/calc_worker.py +0 -0
  100. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/filter_worker.py +0 -0
  101. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/greeting_scalar_worker.py +0 -0
  102. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/row_count_worker.py +0 -0
  103. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/series_streaming_worker.py +0 -0
  104. {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/sum_worker.py +0 -0
  105. {vgi_python-0.15.0 → vgi_python-0.16.1}/mkdocs.yml +0 -0
  106. {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/LICENSE +0 -0
  107. {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/README.md +0 -0
  108. {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  109. {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  110. {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/pyproject.toml +0 -0
  111. {vgi_python-0.15.0 → vgi_python-0.16.1}/scripts/measure_startup.py +0 -0
  112. {vgi_python-0.15.0 → vgi_python-0.16.1}/scripts/run_all_tests.sh +0 -0
  113. {vgi_python-0.15.0 → vgi_python-0.16.1}/test-data/generate.sh +0 -0
  114. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/__init__.py +0 -0
  115. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/_http_fixtures.py +0 -0
  116. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/__init__.py +0 -0
  117. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_catalog_interface.py +0 -0
  118. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_client_catalog.py +0 -0
  119. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_column_statistics.py +0 -0
  120. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_declarative.py +0 -0
  121. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_example_worker_catalog.py +0 -0
  122. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_integration.py +0 -0
  123. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_required_filters.py +0 -0
  124. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_scan_branches.py +0 -0
  125. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_serialization.py +0 -0
  126. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_setting.py +0 -0
  127. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_storage.py +0 -0
  128. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_time_travel.py +0 -0
  129. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_writable_table.py +0 -0
  130. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/__init__.py +0 -0
  131. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_broken_pipe.py +0 -0
  132. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_cli.py +0 -0
  133. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_cli_catalog_functions.py +0 -0
  134. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_worker_debug.py +0 -0
  135. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/__init__.py +0 -0
  136. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/_stub.py +0 -0
  137. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/conftest.py +0 -0
  138. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_accumulate.py +0 -0
  139. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_aggregate.py +0 -0
  140. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_attach.py +0 -0
  141. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_bearer_auth.py +0 -0
  142. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_const_param_enforcement.py +0 -0
  143. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_container.py +0 -0
  144. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_copy_from.py +0 -0
  145. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_copy_to.py +0 -0
  146. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_directory_parity.py +0 -0
  147. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_function_inventory.py +0 -0
  148. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_github.py +0 -0
  149. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_http_client.py +0 -0
  150. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_http_external_location.py +0 -0
  151. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_http_upload_url.py +0 -0
  152. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_macro.py +0 -0
  153. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_overload.py +0 -0
  154. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_protocol_inventory.py +0 -0
  155. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_protocol_version.py +0 -0
  156. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_resumable_scan.py +0 -0
  157. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_scalar.py +0 -0
  158. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  159. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_secret.py +0 -0
  160. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_settings.py +0 -0
  161. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_table.py +0 -0
  162. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_table_in_out.py +0 -0
  163. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_view.py +0 -0
  164. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_writable.py +0 -0
  165. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conftest.py +0 -0
  166. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/landing/_checker.py +0 -0
  167. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/landing/describe.schema.json +0 -0
  168. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/__init__.py +0 -0
  169. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_bernoulli_function.py +0 -0
  170. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_binary_packet_function.py +0 -0
  171. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_client.py +0 -0
  172. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_conditional_message_function.py +0 -0
  173. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_hash_seed_function.py +0 -0
  174. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  175. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_multiply_function.py +0 -0
  176. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_random_bytes_function.py +0 -0
  177. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_return_secret_value_function.py +0 -0
  178. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/__init__.py +0 -0
  179. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/__init__.py +0 -0
  180. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_constant_columns_function.py +0 -0
  181. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_double_sequence_function.py +0 -0
  182. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_exception_function.py +0 -0
  183. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_filter_echo_function.py +0 -0
  184. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_logging_function.py +0 -0
  185. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
  186. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_partitioned_function.py +0 -0
  187. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_projected_data_function.py +0 -0
  188. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_sequence_function.py +0 -0
  189. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_settings_function.py +0 -0
  190. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_struct_settings_function.py +0 -0
  191. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
  192. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/__init__.py +0 -0
  193. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/__init__.py +0 -0
  194. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  195. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
  196. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  197. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  198. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  199. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/test_client.py +0 -0
  200. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_access_log_audit.py +0 -0
  201. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_aggregate_function.py +0 -0
  202. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_argument_spec.py +0 -0
  203. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_auth.py +0 -0
  204. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_bind_exceptions.py +0 -0
  205. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_bind_request_at_clause.py +0 -0
  206. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_bound_storage_conformance.py +0 -0
  207. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_cache_control.py +0 -0
  208. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_catalog_auth_binding.py +0 -0
  209. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_copy_from_function.py +0 -0
  210. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_copy_to_function.py +0 -0
  211. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_docstrings.py +0 -0
  212. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_documentation_examples.py +0 -0
  213. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_example_function_arg_types.py +0 -0
  214. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_examples_workers.py +0 -0
  215. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_exception_handling.py +0 -0
  216. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_exceptions.py +0 -0
  217. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_filter_pushdown_extension.py +0 -0
  218. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage.py +0 -0
  219. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_azure_sql.py +0 -0
  220. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_cf_do.py +0 -0
  221. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_cf_do_integration.py +0 -0
  222. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_conformance.py +0 -0
  223. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_constants.py +0 -0
  224. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_protocol_version.py +0 -0
  225. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_request_builders.py +0 -0
  226. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_schemas.py +0 -0
  227. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_secret.py +0 -0
  228. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_go_schemas.py +0 -0
  229. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_protocol_version.py +0 -0
  230. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_schemas_cross_lang.py +0 -0
  231. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_ts_client.py +0 -0
  232. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_ts_schemas.py +0 -0
  233. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_http_demo_storage.py +0 -0
  234. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_http_s3_offload_input.py +0 -0
  235. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_http_s3_offload_output.py +0 -0
  236. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_landing_conformance.py +0 -0
  237. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_metadata.py +0 -0
  238. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_mypy_consolidated.py +0 -0
  239. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_nest_tensor.py +0 -0
  240. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_otel.py +0 -0
  241. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_projection_enforcement.py +0 -0
  242. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_projection_repro.py +0 -0
  243. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_protocol_classes.py +0 -0
  244. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_resolved_secrets.py +0 -0
  245. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_schema_utils.py +0 -0
  246. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_serve.py +0 -0
  247. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_setting_secret_annotations.py +0 -0
  248. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_table_buffering_function.py +0 -0
  249. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_table_function_dynamic_to_string.py +0 -0
  250. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_tcp_transport.py +0 -0
  251. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_type_bounds.py +0 -0
  252. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_union_argument.py +0 -0
  253. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_worker.py +0 -0
  254. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_worker_cli.py +0 -0
  255. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_worker_page.py +0 -0
  256. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/transactor/__init__.py +0 -0
  257. {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/transactor/test_transactor.py +0 -0
  258. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/__init__.py +0 -0
  259. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_duckdb.py +0 -0
  260. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_storage_profile.py +0 -0
  261. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/__init__.py +0 -0
  262. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  263. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  264. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  265. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  266. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  267. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  268. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  269. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  270. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  271. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  272. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  273. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  274. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
  275. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/attach_options.py +0 -0
  276. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/bad_enum.py +0 -0
  277. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
  278. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/cancellable.py +0 -0
  279. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/catalog.py +0 -0
  280. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/companion.py +0 -0
  281. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/copy_from.py +0 -0
  282. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/copy_to.py +0 -0
  283. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/http_server.py +0 -0
  284. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  285. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  286. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
  287. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  288. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  289. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  290. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
  291. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
  292. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  293. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
  294. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  295. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  296. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  297. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  298. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  299. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  300. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/simple_writable.py +0 -0
  301. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/_common.py +0 -0
  302. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
  303. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  304. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  305. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/filters.py +0 -0
  306. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  307. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/make_series.py +0 -0
  308. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/misc.py +0 -0
  309. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
  310. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/pairs.py +0 -0
  311. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  312. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  313. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  314. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
  315. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/sequence.py +0 -0
  316. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/settings.py +0 -0
  317. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  318. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  319. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  320. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/versioned.py +0 -0
  321. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/versioned.py +0 -0
  322. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
  323. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
  324. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/generic.py +0 -0
  325. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/table.py +0 -0
  326. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/worker.py +0 -0
  327. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/aggregate_function.py +0 -0
  328. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/argument_spec.py +0 -0
  329. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/arguments.py +0 -0
  330. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/auth.py +0 -0
  331. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/__init__.py +0 -0
  332. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/_descriptor_spec.py +0 -0
  333. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/attach_option.py +0 -0
  334. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/descriptors.py +0 -0
  335. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/secret_type.py +0 -0
  336. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/setting.py +0 -0
  337. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/storage.py +0 -0
  338. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/__init__.py +0 -0
  339. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/catalog_mixin.py +0 -0
  340. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli.py +0 -0
  341. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_catalog.py +0 -0
  342. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_schema.py +0 -0
  343. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_table.py +0 -0
  344. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_transaction.py +0 -0
  345. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_utils.py +0 -0
  346. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_view.py +0 -0
  347. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/client.py +0 -0
  348. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/__init__.py +0 -0
  349. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/_common.py +0 -0
  350. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_constants.py +0 -0
  351. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_protocol_version.py +0 -0
  352. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_request_builders.py +0 -0
  353. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_schemas.py +0 -0
  354. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  355. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  356. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
  357. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/go_schemas.py +0 -0
  358. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/protocol_version.py +0 -0
  359. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/ts_client.py +0 -0
  360. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/ts_schemas.py +0 -0
  361. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/copy_from_function.py +0 -0
  362. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/copy_to_function.py +0 -0
  363. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/exceptions.py +0 -0
  364. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function.py +0 -0
  365. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function_storage.py +0 -0
  366. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function_storage_azure_sql.py +0 -0
  367. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function_storage_cf_do.py +0 -0
  368. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/__init__.py +0 -0
  369. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/demo_storage.py +0 -0
  370. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/describe_json.py +0 -0
  371. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/landing.html +0 -0
  372. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/landing_page.py +0 -0
  373. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/worker_page.py +0 -0
  374. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/invocation.py +0 -0
  375. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/logging_config.py +0 -0
  376. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/meta_worker.py +0 -0
  377. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/otel.py +0 -0
  378. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/protocol_version.txt +0 -0
  379. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/py.typed +0 -0
  380. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/schema_utils.py +0 -0
  381. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/secret_protocol.py +0 -0
  382. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/secret_service.py +0 -0
  383. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/serve.py +0 -0
  384. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_buffering_function.py +0 -0
  385. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/__init__.py +0 -0
  386. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/_duckdb_compat.py +0 -0
  387. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/client.py +0 -0
  388. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/protocol.py +0 -0
  389. {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/server.py +0 -0
  390. {vgi_python-0.15.0 → vgi_python-0.16.1}/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-rc1
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.15.0
3
+ Version: 0.16.1
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.15.0"
3
+ version = "0.16.1"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "attach_options": [],
5
5
  "counts": {
6
- "functions": 183,
6
+ "functions": 203,
7
7
  "schemas": 2,
8
8
  "tables": 59,
9
9
  "views": 3
@@ -655,6 +655,50 @@
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
+ },
658
702
  {
659
703
  "args": [
660
704
  {
@@ -1247,6 +1291,30 @@
1247
1291
  "returns": "string",
1248
1292
  "type": "scalar"
1249
1293
  },
1294
+ {
1295
+ "args": [
1296
+ {
1297
+ "desc": "Input column (ignored)",
1298
+ "name": "x",
1299
+ "type": "double"
1300
+ }
1301
+ ],
1302
+ "doc": "Blended 1->0 map emitting a single 0-row batch (literal scan-mode)",
1303
+ "name": "blended_drop",
1304
+ "type": "table"
1305
+ },
1306
+ {
1307
+ "args": [
1308
+ {
1309
+ "desc": "Fan-out count: emit rows 0..n-1 for this input row",
1310
+ "name": "n",
1311
+ "type": "int64"
1312
+ }
1313
+ ],
1314
+ "doc": "Blended 1->N fan-out (emit 0..n-1 per input row) with row provenance",
1315
+ "name": "blended_explode",
1316
+ "type": "table"
1317
+ },
1250
1318
  {
1251
1319
  "args": [
1252
1320
  {
@@ -1456,6 +1524,54 @@
1456
1524
  "name": "cache_parallel",
1457
1525
  "type": "table"
1458
1526
  },
1527
+ {
1528
+ "args": [
1529
+ {
1530
+ "desc": "Rows per (region, year) partition",
1531
+ "name": "rows_per_partition",
1532
+ "type": "int64"
1533
+ }
1534
+ ],
1535
+ "doc": "Per-partition cacheable over (region, year) SINGLE_VALUE partition columns",
1536
+ "name": "cache_partition_multicol",
1537
+ "type": "table"
1538
+ },
1539
+ {
1540
+ "args": [
1541
+ {
1542
+ "desc": "Rows per country partition",
1543
+ "name": "rows_per_country",
1544
+ "type": "int64"
1545
+ }
1546
+ ],
1547
+ "doc": "Per-partition cacheable; work-queue fan-out (parallel capture); one NULL partition",
1548
+ "name": "cache_partition_parallel",
1549
+ "type": "table"
1550
+ },
1551
+ {
1552
+ "args": [
1553
+ {
1554
+ "desc": "Rows per country partition",
1555
+ "name": "rows_per_country",
1556
+ "type": "int64"
1557
+ }
1558
+ ],
1559
+ "doc": "Per-partition cacheable with projection pushdown + explicit partition_values",
1560
+ "name": "cache_partition_proj",
1561
+ "type": "table"
1562
+ },
1563
+ {
1564
+ "args": [
1565
+ {
1566
+ "desc": "Rows per country partition",
1567
+ "name": "rows_per_country",
1568
+ "type": "int64"
1569
+ }
1570
+ ],
1571
+ "doc": "Per-partition cacheable single-value-partitioned result (vgi.cache.partition_scope)",
1572
+ "name": "cache_partition_scope",
1573
+ "type": "table"
1574
+ },
1459
1575
  {
1460
1576
  "args": [
1461
1577
  {
@@ -1551,6 +1667,42 @@
1551
1667
  "name": "cacheable_numbers",
1552
1668
  "type": "table"
1553
1669
  },
1670
+ {
1671
+ "args": [
1672
+ {
1673
+ "desc": "Input column",
1674
+ "name": "x",
1675
+ "type": "int64"
1676
+ }
1677
+ ],
1678
+ "doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl)",
1679
+ "name": "cached_double",
1680
+ "type": "table"
1681
+ },
1682
+ {
1683
+ "args": [],
1684
+ "doc": "Cacheable classic (TABLE-input) passthrough (advertises vgi.cache.ttl)",
1685
+ "name": "cached_echo",
1686
+ "type": "table"
1687
+ },
1688
+ {
1689
+ "args": [
1690
+ {
1691
+ "desc": "Input column",
1692
+ "name": "x",
1693
+ "type": "int64"
1694
+ }
1695
+ ],
1696
+ "doc": "Blended map x->x*2 with always-revalidate (304 not_modified) contract",
1697
+ "name": "cached_reval_double",
1698
+ "type": "table"
1699
+ },
1700
+ {
1701
+ "args": [],
1702
+ "doc": "Classic passthrough with always-revalidate (304 not_modified) contract",
1703
+ "name": "cached_reval_echo",
1704
+ "type": "table"
1705
+ },
1554
1706
  {
1555
1707
  "args": [],
1556
1708
  "doc": "Scan colors table (ENUM column)",
@@ -1820,6 +1972,78 @@
1820
1972
  "name": "generator_exception",
1821
1973
  "type": "table"
1822
1974
  },
1975
+ {
1976
+ "args": [
1977
+ {
1978
+ "desc": "Latitude input column",
1979
+ "name": "latitude",
1980
+ "type": "double"
1981
+ },
1982
+ {
1983
+ "desc": "Longitude input column",
1984
+ "name": "longitude",
1985
+ "type": "double"
1986
+ },
1987
+ {
1988
+ "default": "4",
1989
+ "desc": "Rounding precision",
1990
+ "name": "precision",
1991
+ "named": true,
1992
+ "type": "int64"
1993
+ }
1994
+ ],
1995
+ "doc": "Blended per-row geo encoder (lat, lon -> geohash)",
1996
+ "name": "geo_encode",
1997
+ "type": "table"
1998
+ },
1999
+ {
2000
+ "args": [
2001
+ {
2002
+ "desc": "Latitude input column",
2003
+ "name": "latitude",
2004
+ "type": "double"
2005
+ },
2006
+ {
2007
+ "desc": "Longitude input column",
2008
+ "name": "longitude",
2009
+ "type": "double"
2010
+ },
2011
+ {
2012
+ "desc": "Altitude input column",
2013
+ "name": "altitude",
2014
+ "type": "double"
2015
+ },
2016
+ {
2017
+ "default": "4",
2018
+ "desc": "Rounding precision",
2019
+ "name": "precision",
2020
+ "named": true,
2021
+ "type": "int64"
2022
+ }
2023
+ ],
2024
+ "doc": "Blended per-row geo encoder (lat, lon, alt -> geohash)",
2025
+ "name": "geo_encode",
2026
+ "type": "table"
2027
+ },
2028
+ {
2029
+ "args": [
2030
+ {
2031
+ "desc": "Input column (echoed as output)",
2032
+ "name": "x",
2033
+ "type": "int64"
2034
+ },
2035
+ {
2036
+ "default": "\"range\"",
2037
+ "desc": "range | length | base64",
2038
+ "name": "mode",
2039
+ "named": true,
2040
+ "type": "string"
2041
+ }
2042
+ ],
2043
+ "doc": "Adversarial blended fixture emitting malformed vgi_rpc.parent_row",
2044
+ "name": "hostile_provenance",
2045
+ "type": "table"
2046
+ },
1823
2047
  {
1824
2048
  "args": [
1825
2049
  {
@@ -2237,6 +2461,18 @@
2237
2461
  "name": "profiling_demo",
2238
2462
  "type": "table"
2239
2463
  },
2464
+ {
2465
+ "args": [
2466
+ {
2467
+ "desc": "Input column",
2468
+ "name": "x",
2469
+ "type": "int64"
2470
+ }
2471
+ ],
2472
+ "doc": "Blended 1->1 map with projection_pushdown + two output columns",
2473
+ "name": "projectable_blended",
2474
+ "type": "table"
2475
+ },
2240
2476
  {
2241
2477
  "args": [
2242
2478
  {
@@ -2349,6 +2585,25 @@
2349
2585
  "name": "rff_struct_scan",
2350
2586
  "type": "table"
2351
2587
  },
2588
+ {
2589
+ "args": [
2590
+ {
2591
+ "desc": "Numeric input columns",
2592
+ "name": "values",
2593
+ "type": "double"
2594
+ },
2595
+ {
2596
+ "default": "false",
2597
+ "desc": "Sum absolute values",
2598
+ "name": "absolute",
2599
+ "named": true,
2600
+ "type": "bool"
2601
+ }
2602
+ ],
2603
+ "doc": "Blended per-row varargs sum",
2604
+ "name": "row_sum",
2605
+ "type": "table"
2606
+ },
2352
2607
  {
2353
2608
  "args": [
2354
2609
  {
@@ -2731,6 +2986,20 @@
2731
2986
  "name": "buffer_input",
2732
2987
  "type": "table_in_out"
2733
2988
  },
2989
+ {
2990
+ "args": [
2991
+ {
2992
+ "default": "false",
2993
+ "desc": "Whether to log during processing",
2994
+ "name": "logging",
2995
+ "named": true,
2996
+ "type": "bool"
2997
+ }
2998
+ ],
2999
+ "doc": "Cacheable column-wise sum across all input (advertises vgi.cache.ttl)",
3000
+ "name": "cached_sum_all",
3001
+ "type": "table_in_out"
3002
+ },
2734
3003
  {
2735
3004
  "args": [],
2736
3005
  "doc": "Worker raises during combine (test)",
@@ -2943,6 +3212,12 @@
2943
3212
  "name": "slow_cancellable_buffering",
2944
3213
  "type": "table_in_out"
2945
3214
  },
3215
+ {
3216
+ "args": [],
3217
+ "doc": "Per-substream partial sum emitted at finalize (parallel streaming finalize)",
3218
+ "name": "substream_partial_sum",
3219
+ "type": "table_in_out"
3220
+ },
2946
3221
  {
2947
3222
  "args": [
2948
3223
  {
@@ -2959,7 +3234,7 @@
2959
3234
  },
2960
3235
  {
2961
3236
  "args": [],
2962
- "doc": "Distributed sum using simple callback API",
3237
+ "doc": "Distributed sum using the buffered (Sink+Combine+Source) model",
2963
3238
  "name": "sum_all_columns_simple_distributed",
2964
3239
  "type": "table_in_out"
2965
3240
  }
@@ -0,0 +1,70 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Tests for SubstreamPartialSumFunction (parallel streaming finalize, A4).
4
+
5
+ At the single-worker client level there is exactly one substream, so ``finish()``
6
+ sees all input and emits one partial row equal to the whole sum. The per-substream
7
+ fan-out (many partials re-aggregated by an outer ``SELECT sum()``) is exercised by
8
+ the C++ integration test ``table_in_out/parallel_finalize.test`` over both
9
+ transports; here we assert the worker-side transform/finish contract in isolation.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import pyarrow as pa
15
+
16
+ from tests.conftest import filter_non_empty, make_schema
17
+ from vgi.client import Client
18
+
19
+
20
+ class TestSubstreamPartialSumFunction:
21
+ """Worker-side contract for substream_partial_sum."""
22
+
23
+ def test_partial_sum_single_batch(self, fixture_worker: str) -> None:
24
+ """One substream (single client worker) → one partial = the whole sum."""
25
+ schema = make_schema([pa.field("n", pa.int64())])
26
+ batch = pa.RecordBatch.from_pydict({"n": [1, 2, 3, 4, 5]}, schema=schema)
27
+ with Client(fixture_worker) as client:
28
+ output = list(
29
+ client.table_in_out_function(
30
+ function_name="substream_partial_sum",
31
+ input=iter([batch]),
32
+ )
33
+ )
34
+ non_empty = filter_non_empty(output)
35
+ assert len(non_empty) == 1
36
+ assert non_empty[0].to_pydict() == {"n": [15]}
37
+
38
+ def test_partial_sum_many_batches(self, fixture_worker: str) -> None:
39
+ """Accumulates across many input batches, emits one partial at finalize."""
40
+ schema = make_schema([pa.field("n", pa.int64())])
41
+ batches = [
42
+ pa.RecordBatch.from_pydict({"n": list(range(i * 100, (i + 1) * 100))}, schema=schema) for i in range(20)
43
+ ]
44
+ expected = sum(range(0, 2000))
45
+ with Client(fixture_worker) as client:
46
+ output = list(
47
+ client.table_in_out_function(
48
+ function_name="substream_partial_sum",
49
+ input=iter(batches),
50
+ )
51
+ )
52
+ non_empty = filter_non_empty(output)
53
+ assert len(non_empty) == 1
54
+ assert non_empty[0].to_pydict() == {"n": [expected]}
55
+
56
+ def test_partial_sum_empty_input(self, fixture_worker: str) -> None:
57
+ """No input rows → the single substream's partial is 0."""
58
+ schema = make_schema([pa.field("n", pa.int64())])
59
+ empty = pa.RecordBatch.from_pydict({"n": []}, schema=schema)
60
+ with Client(fixture_worker) as client:
61
+ output = list(
62
+ client.table_in_out_function(
63
+ function_name="substream_partial_sum",
64
+ input=iter([empty]),
65
+ )
66
+ )
67
+ non_empty = filter_non_empty(output)
68
+ # A single substream with zero rows still finalizes → one 0 partial.
69
+ assert len(non_empty) == 1
70
+ assert non_empty[0].to_pydict() == {"n": [0]}
@@ -197,13 +197,13 @@ class TestSumAllColumnsFunctionDistributed:
197
197
 
198
198
 
199
199
  class TestSumAllColumnsSimpleDistributed:
200
- """Tests for sum_all_columns_simple_distributed (TableInOutFunction)."""
200
+ """Tests for sum_all_columns_simple_distributed (buffered global reduction)."""
201
201
 
202
202
  def test_sum_simple_distributed_basic(self, fixture_worker: str, numeric_batches: list[pa.RecordBatch]) -> None:
203
203
  """Should sum all numeric columns across all batches."""
204
204
  with Client(fixture_worker) as client:
205
205
  output_batches = list(
206
- client.table_in_out_function(
206
+ client.table_buffering_function(
207
207
  function_name="sum_all_columns_simple_distributed",
208
208
  input=iter(numeric_batches),
209
209
  )
@@ -238,7 +238,7 @@ class TestSumAllColumnsSimpleDistributed:
238
238
 
239
239
  with Client(fixture_worker) as client:
240
240
  output_batches = list(
241
- client.table_in_out_function(
241
+ client.table_buffering_function(
242
242
  function_name="sum_all_columns_simple_distributed",
243
243
  input=iter(batches),
244
244
  )
@@ -256,7 +256,7 @@ class TestSumAllColumnsSimpleDistributed:
256
256
  """Should exclude non-numeric columns from output."""
257
257
  with Client(fixture_worker) as client:
258
258
  output_batches = list(
259
- client.table_in_out_function(
259
+ client.table_buffering_function(
260
260
  function_name="sum_all_columns_simple_distributed",
261
261
  input=iter(simple_batches),
262
262
  )
@@ -276,7 +276,7 @@ class TestSumAllColumnsSimpleDistributed:
276
276
 
277
277
  with Client(fixture_worker) as client:
278
278
  output_batches = list(
279
- client.table_in_out_function(
279
+ client.table_buffering_function(
280
280
  function_name="sum_all_columns_simple_distributed",
281
281
  input=iter([empty_batch]),
282
282
  )
@@ -0,0 +1,150 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Metadata resolution + foot-gun guards for blended RowTransformFunction (Phase B)."""
4
+
5
+ from __future__ import annotations
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Annotated
9
+
10
+ import pyarrow as pa
11
+ import pytest
12
+
13
+ from vgi.arguments import Arg, TableInput
14
+ from vgi.invocation import BindResponse
15
+ from vgi.metadata import (
16
+ CatalogFunctionType,
17
+ ResolvedMetadata,
18
+ arrow_to_metadata,
19
+ metadata_to_arrow,
20
+ resolve_metadata,
21
+ )
22
+ from vgi.schema_utils import schema
23
+ from vgi.table_function import BindParams
24
+ from vgi.table_in_out_function import RowTransformFunction
25
+
26
+
27
+ @dataclass(slots=True, frozen=True, kw_only=True)
28
+ class _XYArgs:
29
+ """Two positional input columns + one named option."""
30
+
31
+ x: Annotated[float, Arg(0)]
32
+ y: Annotated[float, Arg(1)]
33
+ opt: Annotated[int, Arg("opt", default=1)] = 1
34
+
35
+
36
+ class _GoodBlended(RowTransformFunction[_XYArgs]):
37
+ """A valid blended function."""
38
+
39
+ class Meta:
40
+ """Metadata."""
41
+
42
+ name = "good_blended"
43
+
44
+ @classmethod
45
+ def on_bind(cls, params: BindParams[_XYArgs]) -> BindResponse:
46
+ """Fixed output schema."""
47
+ return BindResponse(output_schema=schema({"z": pa.float64()}))
48
+
49
+
50
+ class TestBlendedResolution:
51
+ """Happy-path resolution of a blended function."""
52
+
53
+ def test_resolves_as_blended_table(self) -> None:
54
+ """input_from_args=True, function_type=TABLE, no finalize."""
55
+ m = resolve_metadata(_GoodBlended)
56
+ assert m.function_type is CatalogFunctionType.TABLE
57
+ assert m.input_from_args is True
58
+ assert m.has_finalize is False
59
+ positions = {p.position for p in m.parameters}
60
+ assert 0 in positions and 1 in positions and "opt" in positions
61
+
62
+ def test_arrow_roundtrip_preserves_input_from_args(self) -> None:
63
+ """input_from_args survives the Arrow + dict round-trips."""
64
+ m = resolve_metadata(_GoodBlended)
65
+ assert arrow_to_metadata(metadata_to_arrow(m)).input_from_args is True
66
+ assert ResolvedMetadata.from_dict(m.to_dict()).input_from_args is True
67
+
68
+
69
+ class TestBlendedFootguns:
70
+ """resolve_metadata rejects the invalid blended shapes."""
71
+
72
+ def test_reject_finalize_override(self) -> None:
73
+ """A blended fn that overrides finish()/finalize() is rejected."""
74
+
75
+ class _WithFinalize(RowTransformFunction[_XYArgs]):
76
+ """Illegal: blended with a finalize."""
77
+
78
+ class Meta:
79
+ """Metadata."""
80
+
81
+ name = "blended_finalize"
82
+
83
+ @classmethod
84
+ def finish(cls, params, states): # noqa: ANN001, ANN206, D102
85
+ return []
86
+
87
+ with pytest.raises(TypeError, match="cannot override finalize"):
88
+ resolve_metadata(_WithFinalize)
89
+
90
+ def test_reject_table_input(self) -> None:
91
+ """A blended fn that declares a TableInput arg is rejected."""
92
+
93
+ @dataclass(slots=True, frozen=True, kw_only=True)
94
+ class _TblArgs:
95
+ """Illegal: a TableInput on a blended fn."""
96
+
97
+ x: Annotated[float, Arg(0)]
98
+ data: Annotated[TableInput, Arg(1)]
99
+
100
+ class _WithTable(RowTransformFunction[_TblArgs]):
101
+ """Illegal: blended with TableInput."""
102
+
103
+ class Meta:
104
+ """Metadata."""
105
+
106
+ name = "blended_table"
107
+
108
+ with pytest.raises(TypeError, match="must not declare a TableInput"):
109
+ resolve_metadata(_WithTable)
110
+
111
+ def test_reject_positional_const(self) -> None:
112
+ """A blended fn with a positional const arg is rejected."""
113
+
114
+ @dataclass(slots=True, frozen=True, kw_only=True)
115
+ class _ConstArgs:
116
+ """Illegal: a positional const on a blended fn."""
117
+
118
+ k: Annotated[int, Arg(0, const=True)]
119
+ x: Annotated[float, Arg(1)]
120
+
121
+ class _WithConst(RowTransformFunction[_ConstArgs]):
122
+ """Illegal: blended with a positional const."""
123
+
124
+ class Meta:
125
+ """Metadata."""
126
+
127
+ name = "blended_const"
128
+
129
+ with pytest.raises(TypeError, match="cannot take a positional const"):
130
+ resolve_metadata(_WithConst)
131
+
132
+ def test_reject_zero_positional(self) -> None:
133
+ """A blended fn with no positional args is rejected."""
134
+
135
+ @dataclass(slots=True, frozen=True, kw_only=True)
136
+ class _NamedOnlyArgs:
137
+ """Illegal: no positional input columns."""
138
+
139
+ opt: Annotated[int, Arg("opt", default=1)] = 1
140
+
141
+ class _NamedOnly(RowTransformFunction[_NamedOnlyArgs]):
142
+ """Illegal: blended with no positional args."""
143
+
144
+ class Meta:
145
+ """Metadata."""
146
+
147
+ name = "blended_named_only"
148
+
149
+ with pytest.raises(TypeError, match="at least one positional Arg"):
150
+ resolve_metadata(_NamedOnly)