vgi-python 0.16.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.16.0 → vgi_python-0.16.1}/.github/workflows/integration.yml +1 -1
  2. {vgi_python-0.16.0 → vgi_python-0.16.1}/PKG-INFO +1 -1
  3. {vgi_python-0.16.0 → vgi_python-0.16.1}/pyproject.toml +1 -1
  4. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/landing/describe.expected.json +186 -1
  5. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_filter_pushdown.py +85 -0
  6. {vgi_python-0.16.0 → vgi_python-0.16.1}/uv.lock +1 -1
  7. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/__init__.py +6 -0
  8. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/arithmetic.py +77 -0
  9. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/__init__.py +8 -0
  10. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/cache.py +337 -2
  11. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table_in_out.py +6 -10
  12. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/worker.py +49 -53
  13. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/cache_control.py +10 -0
  14. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/catalog_interface.py +7 -0
  15. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/duckdb_statistics.py +129 -102
  16. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/metadata.py +4 -0
  17. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/protocol.py +21 -4
  18. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/scalar_function.py +10 -1
  19. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/table_filter_pushdown.py +75 -44
  20. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/table_function.py +5 -2
  21. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/table_in_out_function.py +2 -2
  22. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/worker.py +35 -8
  23. {vgi_python-0.16.0 → vgi_python-0.16.1}/.gitattributes +0 -0
  24. {vgi_python-0.16.0 → vgi_python-0.16.1}/.github/dependabot.yml +0 -0
  25. {vgi_python-0.16.0 → vgi_python-0.16.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  26. {vgi_python-0.16.0 → vgi_python-0.16.1}/.github/workflows/ci.yml +0 -0
  27. {vgi_python-0.16.0 → vgi_python-0.16.1}/.github/workflows/docs.yml +0 -0
  28. {vgi_python-0.16.0 → vgi_python-0.16.1}/.github/workflows/release.yml +0 -0
  29. {vgi_python-0.16.0 → vgi_python-0.16.1}/.gitignore +0 -0
  30. {vgi_python-0.16.0 → vgi_python-0.16.1}/.python-version +0 -0
  31. {vgi_python-0.16.0 → vgi_python-0.16.1}/.vale.ini +0 -0
  32. {vgi_python-0.16.0 → vgi_python-0.16.1}/CLAUDE.md +0 -0
  33. {vgi_python-0.16.0 → vgi_python-0.16.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  34. {vgi_python-0.16.0 → vgi_python-0.16.1}/DOCS_REVIEW_RUBRIC.md +0 -0
  35. {vgi_python-0.16.0 → vgi_python-0.16.1}/DOCS_USABILITY_TEST.md +0 -0
  36. {vgi_python-0.16.0 → vgi_python-0.16.1}/LICENSE +0 -0
  37. {vgi_python-0.16.0 → vgi_python-0.16.1}/README.md +0 -0
  38. {vgi_python-0.16.0 → vgi_python-0.16.1}/SECURITY.md +0 -0
  39. {vgi_python-0.16.0 → vgi_python-0.16.1}/ci/README.md +0 -0
  40. {vgi_python-0.16.0 → vgi_python-0.16.1}/ci/preprocess-require.awk +0 -0
  41. {vgi_python-0.16.0 → vgi_python-0.16.1}/ci/run-integration.sh +0 -0
  42. {vgi_python-0.16.0 → vgi_python-0.16.1}/dist-vgi/.gitignore +0 -0
  43. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/aggregate-functions.md +0 -0
  44. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/arguments.md +0 -0
  45. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/auth.md +0 -0
  46. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/catalogs.md +0 -0
  47. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/client.md +0 -0
  48. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/exceptions.md +0 -0
  49. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/filters.md +0 -0
  50. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/functions.md +0 -0
  51. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/http.md +0 -0
  52. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/index.md +0 -0
  53. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/metadata.md +0 -0
  54. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/observability.md +0 -0
  55. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/storage.md +0 -0
  56. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/transactor.md +0 -0
  57. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/api/worker.md +0 -0
  58. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/argument-serialization.md +0 -0
  59. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/apple-touch-icon.png +0 -0
  60. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/favicon-16x16.png +0 -0
  61. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/favicon-32x32.png +0 -0
  62. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/favicon.ico +0 -0
  63. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/kinds/aggregate.svg +0 -0
  64. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/kinds/buffering.svg +0 -0
  65. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/kinds/scalar.svg +0 -0
  66. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/kinds/table-in-out.svg +0 -0
  67. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/kinds/table.svg +0 -0
  68. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/logo.png +0 -0
  69. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/assets/social-card.png +0 -0
  70. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/authentication.md +0 -0
  71. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/catalog-interface.md +0 -0
  72. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/cli.md +0 -0
  73. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/column-statistics.md +0 -0
  74. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/concepts/index.md +0 -0
  75. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/contributing-docs.md +0 -0
  76. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/filter-pushdown.md +0 -0
  77. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/generator-api.md +0 -0
  78. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/how-to/catalogs.md +0 -0
  79. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/how-to/function-patterns.md +0 -0
  80. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/how-to/http-auth.md +0 -0
  81. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/how-to/index.md +0 -0
  82. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/how-to/pushdown-and-statistics.md +0 -0
  83. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/how-to/state-storage.md +0 -0
  84. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/index.md +0 -0
  85. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/lifecycle.md +0 -0
  86. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/metadata.md +0 -0
  87. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/overrides/main.html +0 -0
  88. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/robots.txt +0 -0
  89. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/shared-storage.md +0 -0
  90. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/stylesheets/extra.css +0 -0
  91. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/tutorial/index.md +0 -0
  92. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/tutorial/scalar.md +0 -0
  93. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/tutorial/table.md +0 -0
  94. {vgi_python-0.16.0 → vgi_python-0.16.1}/docs/vgi-logo.png +0 -0
  95. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/calc_scalar_worker.py +0 -0
  96. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/calc_worker.py +0 -0
  97. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/filter_worker.py +0 -0
  98. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/greeting_scalar_worker.py +0 -0
  99. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/row_count_worker.py +0 -0
  100. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/series_streaming_worker.py +0 -0
  101. {vgi_python-0.16.0 → vgi_python-0.16.1}/examples/sum_worker.py +0 -0
  102. {vgi_python-0.16.0 → vgi_python-0.16.1}/mkdocs.yml +0 -0
  103. {vgi_python-0.16.0 → vgi_python-0.16.1}/packages/vgi-fixtures/LICENSE +0 -0
  104. {vgi_python-0.16.0 → vgi_python-0.16.1}/packages/vgi-fixtures/README.md +0 -0
  105. {vgi_python-0.16.0 → vgi_python-0.16.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  106. {vgi_python-0.16.0 → vgi_python-0.16.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  107. {vgi_python-0.16.0 → vgi_python-0.16.1}/packages/vgi-fixtures/pyproject.toml +0 -0
  108. {vgi_python-0.16.0 → vgi_python-0.16.1}/scripts/measure_startup.py +0 -0
  109. {vgi_python-0.16.0 → vgi_python-0.16.1}/scripts/run_all_tests.sh +0 -0
  110. {vgi_python-0.16.0 → vgi_python-0.16.1}/test-data/generate.sh +0 -0
  111. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/__init__.py +0 -0
  112. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/_http_fixtures.py +0 -0
  113. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/__init__.py +0 -0
  114. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_catalog_interface.py +0 -0
  115. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_client_catalog.py +0 -0
  116. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_column_statistics.py +0 -0
  117. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_declarative.py +0 -0
  118. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_example_worker_catalog.py +0 -0
  119. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_integration.py +0 -0
  120. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_required_filters.py +0 -0
  121. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_scan_branches.py +0 -0
  122. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_serialization.py +0 -0
  123. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_setting.py +0 -0
  124. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_storage.py +0 -0
  125. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_time_travel.py +0 -0
  126. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/catalog/test_writable_table.py +0 -0
  127. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/client/__init__.py +0 -0
  128. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/client/test_broken_pipe.py +0 -0
  129. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/client/test_cli.py +0 -0
  130. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/client/test_cli_catalog_functions.py +0 -0
  131. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/client/test_worker_debug.py +0 -0
  132. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/__init__.py +0 -0
  133. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/_stub.py +0 -0
  134. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/conftest.py +0 -0
  135. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_accumulate.py +0 -0
  136. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_aggregate.py +0 -0
  137. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_attach.py +0 -0
  138. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_bearer_auth.py +0 -0
  139. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_const_param_enforcement.py +0 -0
  140. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_container.py +0 -0
  141. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_copy_from.py +0 -0
  142. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_copy_to.py +0 -0
  143. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_directory_parity.py +0 -0
  144. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_function_inventory.py +0 -0
  145. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_github.py +0 -0
  146. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_http_client.py +0 -0
  147. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_http_external_location.py +0 -0
  148. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_http_upload_url.py +0 -0
  149. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_macro.py +0 -0
  150. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_overload.py +0 -0
  151. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_protocol_inventory.py +0 -0
  152. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_protocol_version.py +0 -0
  153. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_resumable_scan.py +0 -0
  154. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_scalar.py +0 -0
  155. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  156. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_secret.py +0 -0
  157. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_settings.py +0 -0
  158. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_table.py +0 -0
  159. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_table_in_out.py +0 -0
  160. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_view.py +0 -0
  161. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conformance/test_writable.py +0 -0
  162. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/conftest.py +0 -0
  163. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/landing/_checker.py +0 -0
  164. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/landing/describe.schema.json +0 -0
  165. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/__init__.py +0 -0
  166. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_bernoulli_function.py +0 -0
  167. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_binary_packet_function.py +0 -0
  168. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_client.py +0 -0
  169. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_conditional_message_function.py +0 -0
  170. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_hash_seed_function.py +0 -0
  171. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  172. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_multiply_function.py +0 -0
  173. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_random_bytes_function.py +0 -0
  174. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/scalar/test_return_secret_value_function.py +0 -0
  175. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/__init__.py +0 -0
  176. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/__init__.py +0 -0
  177. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_constant_columns_function.py +0 -0
  178. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_double_sequence_function.py +0 -0
  179. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_exception_function.py +0 -0
  180. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_filter_echo_function.py +0 -0
  181. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_logging_function.py +0 -0
  182. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
  183. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_partitioned_function.py +0 -0
  184. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_projected_data_function.py +0 -0
  185. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_sequence_function.py +0 -0
  186. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_settings_function.py +0 -0
  187. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_struct_settings_function.py +0 -0
  188. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
  189. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/__init__.py +0 -0
  190. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/__init__.py +0 -0
  191. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  192. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
  193. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  194. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  195. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  196. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  197. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  198. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/test_blended_metadata.py +0 -0
  199. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/table_in_out/test_client.py +0 -0
  200. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_access_log_audit.py +0 -0
  201. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_aggregate_function.py +0 -0
  202. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_argument_spec.py +0 -0
  203. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_auth.py +0 -0
  204. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_bind_exceptions.py +0 -0
  205. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_bind_request_at_clause.py +0 -0
  206. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_bound_storage_conformance.py +0 -0
  207. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_cache_control.py +0 -0
  208. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_catalog_auth_binding.py +0 -0
  209. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_copy_from_function.py +0 -0
  210. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_copy_to_function.py +0 -0
  211. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_docstrings.py +0 -0
  212. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_documentation_examples.py +0 -0
  213. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_example_function_arg_types.py +0 -0
  214. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_examples_workers.py +0 -0
  215. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_exception_handling.py +0 -0
  216. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_exceptions.py +0 -0
  217. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_filter_pushdown_extension.py +0 -0
  218. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_function_storage.py +0 -0
  219. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_function_storage_azure_sql.py +0 -0
  220. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_function_storage_cf_do.py +0 -0
  221. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_function_storage_cf_do_integration.py +0 -0
  222. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_function_storage_conformance.py +0 -0
  223. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_cpp_constants.py +0 -0
  224. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_cpp_protocol_version.py +0 -0
  225. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_cpp_request_builders.py +0 -0
  226. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_cpp_schemas.py +0 -0
  227. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_cpp_secret.py +0 -0
  228. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_go_schemas.py +0 -0
  229. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_protocol_version.py +0 -0
  230. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_schemas_cross_lang.py +0 -0
  231. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_ts_client.py +0 -0
  232. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_generated_ts_schemas.py +0 -0
  233. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_http_demo_storage.py +0 -0
  234. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_http_s3_offload_input.py +0 -0
  235. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_http_s3_offload_output.py +0 -0
  236. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_landing_conformance.py +0 -0
  237. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_metadata.py +0 -0
  238. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_mypy_consolidated.py +0 -0
  239. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_nest_tensor.py +0 -0
  240. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_otel.py +0 -0
  241. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_projection_enforcement.py +0 -0
  242. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_projection_repro.py +0 -0
  243. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_protocol_classes.py +0 -0
  244. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_resolved_secrets.py +0 -0
  245. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_schema_utils.py +0 -0
  246. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_serve.py +0 -0
  247. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_setting_secret_annotations.py +0 -0
  248. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_table_buffering_function.py +0 -0
  249. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_table_function_dynamic_to_string.py +0 -0
  250. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_tcp_transport.py +0 -0
  251. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_type_bounds.py +0 -0
  252. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_union_argument.py +0 -0
  253. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_worker.py +0 -0
  254. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_worker_cli.py +0 -0
  255. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/test_worker_page.py +0 -0
  256. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/transactor/__init__.py +0 -0
  257. {vgi_python-0.16.0 → vgi_python-0.16.1}/tests/transactor/test_transactor.py +0 -0
  258. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/__init__.py +0 -0
  259. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_duckdb.py +0 -0
  260. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_storage_profile.py +0 -0
  261. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/__init__.py +0 -0
  262. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  263. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  264. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  265. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  266. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  267. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  268. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  269. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  270. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  271. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  272. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  273. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  274. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
  275. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/attach_options.py +0 -0
  276. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/bad_enum.py +0 -0
  277. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
  278. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/cancellable.py +0 -0
  279. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/catalog.py +0 -0
  280. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/companion.py +0 -0
  281. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/copy_from.py +0 -0
  282. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/copy_to.py +0 -0
  283. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/http_server.py +0 -0
  284. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  285. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  286. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
  287. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  288. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  289. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  290. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
  291. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
  292. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  293. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
  294. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  295. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  296. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  297. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  298. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  299. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  300. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/simple_writable.py +0 -0
  301. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/_common.py +0 -0
  302. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
  303. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  304. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  305. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/filters.py +0 -0
  306. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  307. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/make_series.py +0 -0
  308. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/misc.py +0 -0
  309. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
  310. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/pairs.py +0 -0
  311. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  312. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  313. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  314. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
  315. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/sequence.py +0 -0
  316. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/settings.py +0 -0
  317. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  318. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  319. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  320. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/versioned.py +0 -0
  321. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/versioned.py +0 -0
  322. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
  323. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
  324. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/generic.py +0 -0
  325. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/table.py +0 -0
  326. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/worker.py +0 -0
  327. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/aggregate_function.py +0 -0
  328. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/argument_spec.py +0 -0
  329. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/arguments.py +0 -0
  330. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/auth.py +0 -0
  331. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/__init__.py +0 -0
  332. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/_descriptor_spec.py +0 -0
  333. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/attach_option.py +0 -0
  334. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/descriptors.py +0 -0
  335. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/secret_type.py +0 -0
  336. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/setting.py +0 -0
  337. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/catalog/storage.py +0 -0
  338. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/__init__.py +0 -0
  339. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/catalog_mixin.py +0 -0
  340. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli.py +0 -0
  341. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli_catalog.py +0 -0
  342. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli_schema.py +0 -0
  343. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli_table.py +0 -0
  344. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli_transaction.py +0 -0
  345. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli_utils.py +0 -0
  346. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/cli_view.py +0 -0
  347. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/client/client.py +0 -0
  348. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/__init__.py +0 -0
  349. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/_common.py +0 -0
  350. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_constants.py +0 -0
  351. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_protocol_version.py +0 -0
  352. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_request_builders.py +0 -0
  353. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_schemas.py +0 -0
  354. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  355. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  356. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
  357. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/go_schemas.py +0 -0
  358. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/protocol_version.py +0 -0
  359. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/ts_client.py +0 -0
  360. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/codegen/ts_schemas.py +0 -0
  361. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/copy_from_function.py +0 -0
  362. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/copy_to_function.py +0 -0
  363. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/exceptions.py +0 -0
  364. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/function.py +0 -0
  365. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/function_storage.py +0 -0
  366. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/function_storage_azure_sql.py +0 -0
  367. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/function_storage_cf_do.py +0 -0
  368. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/http/__init__.py +0 -0
  369. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/http/demo_storage.py +0 -0
  370. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/http/describe_json.py +0 -0
  371. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/http/landing.html +0 -0
  372. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/http/landing_page.py +0 -0
  373. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/http/worker_page.py +0 -0
  374. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/invocation.py +0 -0
  375. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/logging_config.py +0 -0
  376. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/meta_worker.py +0 -0
  377. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/otel.py +0 -0
  378. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/protocol_version.txt +0 -0
  379. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/py.typed +0 -0
  380. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/schema_utils.py +0 -0
  381. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/secret_protocol.py +0 -0
  382. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/secret_service.py +0 -0
  383. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/serve.py +0 -0
  384. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/table_buffering_function.py +0 -0
  385. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/transactor/__init__.py +0 -0
  386. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/transactor/_duckdb_compat.py +0 -0
  387. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/transactor/client.py +0 -0
  388. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/transactor/protocol.py +0 -0
  389. {vgi_python-0.16.0 → vgi_python-0.16.1}/vgi/transactor/server.py +0 -0
  390. {vgi_python-0.16.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.16.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.16.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": 188,
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
  {
@@ -1259,6 +1303,18 @@
1259
1303
  "name": "blended_drop",
1260
1304
  "type": "table"
1261
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
+ },
1262
1318
  {
1263
1319
  "args": [
1264
1320
  {
@@ -1468,6 +1524,54 @@
1468
1524
  "name": "cache_parallel",
1469
1525
  "type": "table"
1470
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
+ },
1471
1575
  {
1472
1576
  "args": [
1473
1577
  {
@@ -1563,6 +1667,42 @@
1563
1667
  "name": "cacheable_numbers",
1564
1668
  "type": "table"
1565
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
+ },
1566
1706
  {
1567
1707
  "args": [],
1568
1708
  "doc": "Scan colors table (ENUM column)",
@@ -1885,6 +2025,25 @@
1885
2025
  "name": "geo_encode",
1886
2026
  "type": "table"
1887
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
+ },
1888
2047
  {
1889
2048
  "args": [
1890
2049
  {
@@ -2302,6 +2461,18 @@
2302
2461
  "name": "profiling_demo",
2303
2462
  "type": "table"
2304
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
+ },
2305
2476
  {
2306
2477
  "args": [
2307
2478
  {
@@ -2815,6 +2986,20 @@
2815
2986
  "name": "buffer_input",
2816
2987
  "type": "table_in_out"
2817
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
+ },
2818
3003
  {
2819
3004
  "args": [],
2820
3005
  "doc": "Worker raises during combine (test)",
@@ -1404,3 +1404,88 @@ class TestJoinKeysBatch:
1404
1404
  assert merged.num_columns == 2
1405
1405
  assert merged.column("a").to_pylist() == [1, 2, 3]
1406
1406
  assert merged.column("b").to_pylist() == [10, 20, 30]
1407
+
1408
+
1409
+ # =============================================================================
1410
+ # TestDegenerateConjunctions
1411
+ # =============================================================================
1412
+
1413
+
1414
+ class TestDegenerateConjunctions:
1415
+ """An AND whose children all degrade must not render as `WHERE ()`.
1416
+
1417
+ `_parse_filter` returns None for a join-key filter whose keys column cannot
1418
+ be resolved ("graceful degradation — DuckDB filters client-side"). Dropping
1419
+ such a child from an AND is safe on its own, but when *every* child drops the
1420
+ conjunction is left empty, and `f"({' AND '.join([])})"` yields `()` — which
1421
+ reaches the backend as the syntactically invalid `... WHERE () LIMIT n`.
1422
+ """
1423
+
1424
+ def _and_of_join_keys_batch(self) -> pa.RecordBatch:
1425
+ """A filter spec of one AND whose only children are join-key filters.
1426
+
1427
+ No `join_keys` batches are supplied to `deserialize_filters`, so every
1428
+ child resolves to None — the shape observed in production.
1429
+ """
1430
+ spec = json.dumps(
1431
+ [
1432
+ {
1433
+ "column_name": "trade_canceled",
1434
+ "column_index": 0,
1435
+ "type": "and",
1436
+ "children": [
1437
+ {
1438
+ "column_name": "trade_canceled",
1439
+ "column_index": 0,
1440
+ "type": "join_keys",
1441
+ "keys_column": "missing_keys_a",
1442
+ },
1443
+ {
1444
+ "column_name": "_partition_date",
1445
+ "column_index": 1,
1446
+ "type": "join_keys",
1447
+ "keys_column": "missing_keys_b",
1448
+ },
1449
+ ],
1450
+ }
1451
+ ]
1452
+ )
1453
+ s = pa.schema([pa.field("filter_spec", pa.string(), metadata={b"vgi_filter_version": b"1"})])
1454
+ return pa.RecordBatch.from_pydict({"filter_spec": [spec]}, schema=s)
1455
+
1456
+ def test_and_with_all_children_dropped_yields_no_filter(self) -> None:
1457
+ """All conjuncts unresolvable -> the AND is dropped entirely, not emptied."""
1458
+ pf = deserialize_filters(self._and_of_join_keys_batch())
1459
+ assert len(pf) == 0
1460
+ assert pf.to_sql() == ("", [])
1461
+
1462
+ def test_and_with_all_children_dropped_never_emits_empty_parens(self) -> None:
1463
+ """Regression: the rendered clause must never be the invalid `()`."""
1464
+ where, params = deserialize_filters(self._and_of_join_keys_batch()).to_sql()
1465
+ assert where != "()"
1466
+ assert not params
1467
+ # A caller appending `WHERE {where}` only when truthy must produce no WHERE.
1468
+ assert not where
1469
+
1470
+ def test_empty_and_renders_as_true(self) -> None:
1471
+ """An empty conjunction is AND's identity: it constrains nothing."""
1472
+ f = AndFilter(column_name="c", column_index=0, children=())
1473
+ assert _filter_to_sql(f, lambda s: f'"{s}"', "?", 0) == ("TRUE", [])
1474
+ assert _filters(f).to_sql() == ("TRUE", [])
1475
+
1476
+ def test_empty_or_renders_as_false(self) -> None:
1477
+ """An empty disjunction admits nothing — it must not widen the result set."""
1478
+ f = OrFilter(column_name="c", column_index=0, children=())
1479
+ assert _filter_to_sql(f, lambda s: f'"{s}"', "?", 0) == ("FALSE", [])
1480
+ assert _filters(f).to_sql() == ("FALSE", [])
1481
+
1482
+ def test_and_keeps_resolvable_children(self) -> None:
1483
+ """Partial degradation still yields a usable (weaker) conjunction."""
1484
+ f = AndFilter(
1485
+ column_name="c",
1486
+ column_index=0,
1487
+ children=(_eq("a", 0, 1), _eq("b", 1, 2)),
1488
+ )
1489
+ where, params = _filters(f).to_sql()
1490
+ assert where == '("a" = ? AND "b" = ?)'
1491
+ assert params == [1, 2]
@@ -2228,7 +2228,7 @@ requires-dist = [
2228
2228
 
2229
2229
  [[package]]
2230
2230
  name = "vgi-python"
2231
- version = "0.16.0"
2231
+ version = "0.16.1"
2232
2232
  source = { editable = "." }
2233
2233
  dependencies = [
2234
2234
  { name = "click" },
@@ -19,6 +19,9 @@ unchanged.
19
19
 
20
20
  from vgi._test_fixtures.scalar.arithmetic import (
21
21
  AddValuesFunction,
22
+ CachedAddConstScalarFunction,
23
+ CachedDoubleScalarFunction,
24
+ CachedLabelScalarFunction,
22
25
  ConcatValuesIntFunction,
23
26
  ConcatValuesStrFunction,
24
27
  DoubleFunction,
@@ -83,6 +86,9 @@ __all__ = [
83
86
  "AnyMixedStrFunction",
84
87
  "BernoulliFunction",
85
88
  "BinaryPacketFunction",
89
+ "CachedAddConstScalarFunction",
90
+ "CachedDoubleScalarFunction",
91
+ "CachedLabelScalarFunction",
86
92
  "ConcatValuesIntFunction",
87
93
  "ConcatValuesStrFunction",
88
94
  "ConditionalMessageFunction",
@@ -11,6 +11,7 @@ import pyarrow.compute as pc
11
11
 
12
12
  from vgi._test_fixtures.scalar._common import _is_addable_type, _is_multipliable_type, _promote_for_addition
13
13
  from vgi.arguments import ConstParam, Param, Returns
14
+ from vgi.cache_control import CacheControl
14
15
  from vgi.metadata import FunctionExample
15
16
  from vgi.scalar_function import BindParameters, BindResult, ScalarFunction
16
17
 
@@ -131,6 +132,82 @@ class DoubleFunction(ScalarFunction):
131
132
  return result
132
133
 
133
134
 
135
+ class CachedDoubleScalarFunction(ScalarFunction):
136
+ """Doubles a BIGINT value and advertises vgi.cache.* — backs scalar per-value memo tests.
137
+
138
+ A deterministic 1:1 map, so opting into the result cache is sound: the extension
139
+ memoizes the output per distinct input value and serves a fully-warm distinct set
140
+ without the worker.
141
+ """
142
+
143
+ # Opt into the result cache (per-value memoization on the C++ side).
144
+ CACHE_CONTROL = CacheControl(ttl=300)
145
+
146
+ class Meta:
147
+ """Function metadata."""
148
+
149
+ name = "cached_double_scalar"
150
+ description = "Doubles a BIGINT value (advertises vgi.cache.ttl for per-value memo)"
151
+
152
+ @classmethod
153
+ def compute(
154
+ cls,
155
+ value: Annotated[pa.Int64Array, Param(doc="Value to double")],
156
+ ) -> Annotated[pa.Int64Array, Returns(pa.int64())]:
157
+ """Double the input values."""
158
+ return pc.multiply(value, 2)
159
+
160
+
161
+ class CachedAddConstScalarFunction(ScalarFunction):
162
+ """value + addend (a CONST param), cacheable — backs per-value const-param keying tests.
163
+
164
+ Two calls with the same ``value`` but different ``addend`` must NOT cross-serve: the
165
+ const arg is folded into the cache key.
166
+ """
167
+
168
+ CACHE_CONTROL = CacheControl(ttl=300)
169
+
170
+ class Meta:
171
+ """Function metadata."""
172
+
173
+ name = "cached_add_const"
174
+ description = "value + const addend (advertises vgi.cache.ttl)"
175
+
176
+ @classmethod
177
+ def compute(
178
+ cls,
179
+ value: Annotated[pa.Int64Array, Param(doc="Value")],
180
+ addend: Annotated[pa.Int64Scalar, ConstParam("Constant addend")],
181
+ ) -> Annotated[pa.Int64Array, Returns(pa.int64())]:
182
+ """Add the const addend to each value."""
183
+ return pc.add(value, addend)
184
+
185
+
186
+ class CachedLabelScalarFunction(ScalarFunction):
187
+ """VARCHAR output with NULLs, cacheable — exercises string/null round-trip through the cache.
188
+
189
+ Returns ``lbl-<value>`` for value >= 0, NULL otherwise, so a cached per-value entry must
190
+ round-trip both a heap string and a null.
191
+ """
192
+
193
+ CACHE_CONTROL = CacheControl(ttl=300)
194
+
195
+ class Meta:
196
+ """Function metadata."""
197
+
198
+ name = "cached_label"
199
+ description = "value -> 'lbl-<value>' or NULL for negatives (advertises vgi.cache.ttl)"
200
+
201
+ @classmethod
202
+ def compute(
203
+ cls,
204
+ value: Annotated[pa.Int64Array, Param(doc="Value")],
205
+ ) -> Annotated[pa.StringArray, Returns(pa.string())]:
206
+ """Label non-negative values; NULL for negatives."""
207
+ labels = ["lbl-" + str(v.as_py()) if (v.is_valid and v.as_py() >= 0) else None for v in value]
208
+ return pa.array(labels, type=pa.string())
209
+
210
+
134
211
  class AddValuesFunction(ScalarFunction):
135
212
  """Adds two numeric values together.
136
213
 
@@ -44,6 +44,10 @@ from vgi._test_fixtures.table.cache import (
44
44
  CacheOrderedFunction,
45
45
  CacheParallelFunction,
46
46
  CachePartitionedFunction,
47
+ CachePartitionMultiColFunction,
48
+ CachePartitionParallelFunction,
49
+ CachePartitionProjFunction,
50
+ CachePartitionScopeFunction,
47
51
  CachePoisonFunction,
48
52
  CacheProjectionFunction,
49
53
  CacheRevalidatableFunction,
@@ -182,6 +186,10 @@ __all__ = [
182
186
  "CacheOrderedFunction",
183
187
  "CacheParallelFunction",
184
188
  "CachePartitionedFunction",
189
+ "CachePartitionScopeFunction",
190
+ "CachePartitionParallelFunction",
191
+ "CachePartitionMultiColFunction",
192
+ "CachePartitionProjFunction",
185
193
  "CachePoisonFunction",
186
194
  "CacheProjectionFunction",
187
195
  "CacheTypesFunction",