vgi-python 0.16.0__tar.gz → 0.17.0__tar.gz

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