vgi-python 0.30.0__tar.gz → 0.31.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 (444) hide show
  1. {vgi_python-0.30.0 → vgi_python-0.31.0}/PKG-INFO +1 -1
  2. {vgi_python-0.30.0 → vgi_python-0.31.0}/pyproject.toml +1 -1
  3. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_serialization.py +65 -0
  4. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_protocol_version.py +3 -3
  5. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_wire_record_schema_parity.py +2 -0
  6. {vgi_python-0.30.0 → vgi_python-0.31.0}/uv.lock +1 -1
  7. vgi_python-0.31.0/vgi/_test_fixtures/table/same_name_schemas.py +136 -0
  8. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/worker.py +63 -0
  9. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/catalog_interface.py +51 -0
  10. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/descriptors.py +15 -4
  11. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/protocol.py +1 -1
  12. vgi_python-0.31.0/vgi/protocol_version.txt +1 -0
  13. vgi_python-0.30.0/vgi/protocol_version.txt +0 -1
  14. {vgi_python-0.30.0 → vgi_python-0.31.0}/.gitattributes +0 -0
  15. {vgi_python-0.30.0 → vgi_python-0.31.0}/.github/dependabot.yml +0 -0
  16. {vgi_python-0.30.0 → vgi_python-0.31.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  17. {vgi_python-0.30.0 → vgi_python-0.31.0}/.github/workflows/ci.yml +0 -0
  18. {vgi_python-0.30.0 → vgi_python-0.31.0}/.github/workflows/docs.yml +0 -0
  19. {vgi_python-0.30.0 → vgi_python-0.31.0}/.github/workflows/integration.yml +0 -0
  20. {vgi_python-0.30.0 → vgi_python-0.31.0}/.github/workflows/release.yml +0 -0
  21. {vgi_python-0.30.0 → vgi_python-0.31.0}/.gitignore +0 -0
  22. {vgi_python-0.30.0 → vgi_python-0.31.0}/.python-version +0 -0
  23. {vgi_python-0.30.0 → vgi_python-0.31.0}/.vale.ini +0 -0
  24. {vgi_python-0.30.0 → vgi_python-0.31.0}/CLAUDE.md +0 -0
  25. {vgi_python-0.30.0 → vgi_python-0.31.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  26. {vgi_python-0.30.0 → vgi_python-0.31.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  27. {vgi_python-0.30.0 → vgi_python-0.31.0}/DOCS_USABILITY_TEST.md +0 -0
  28. {vgi_python-0.30.0 → vgi_python-0.31.0}/LICENSE +0 -0
  29. {vgi_python-0.30.0 → vgi_python-0.31.0}/README.md +0 -0
  30. {vgi_python-0.30.0 → vgi_python-0.31.0}/RELEASE-RUNBOOK.md +0 -0
  31. {vgi_python-0.30.0 → vgi_python-0.31.0}/SECURITY.md +0 -0
  32. {vgi_python-0.30.0 → vgi_python-0.31.0}/ci/README.md +0 -0
  33. {vgi_python-0.30.0 → vgi_python-0.31.0}/ci/preprocess-require.awk +0 -0
  34. {vgi_python-0.30.0 → vgi_python-0.31.0}/ci/run-integration.sh +0 -0
  35. {vgi_python-0.30.0 → vgi_python-0.31.0}/dist-vgi/.gitignore +0 -0
  36. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/aggregate-functions.md +0 -0
  37. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/arguments.md +0 -0
  38. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/auth.md +0 -0
  39. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/catalogs.md +0 -0
  40. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/client.md +0 -0
  41. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/exceptions.md +0 -0
  42. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/filters.md +0 -0
  43. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/functions.md +0 -0
  44. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/http.md +0 -0
  45. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/index.md +0 -0
  46. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/metadata.md +0 -0
  47. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/observability.md +0 -0
  48. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/storage.md +0 -0
  49. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/transactor.md +0 -0
  50. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/api/worker.md +0 -0
  51. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/argument-serialization.md +0 -0
  52. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/apple-touch-icon.png +0 -0
  53. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/favicon-16x16.png +0 -0
  54. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/favicon-32x32.png +0 -0
  55. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/favicon.ico +0 -0
  56. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/kinds/aggregate.svg +0 -0
  57. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/kinds/buffering.svg +0 -0
  58. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/kinds/scalar.svg +0 -0
  59. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/kinds/table-in-out.svg +0 -0
  60. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/kinds/table.svg +0 -0
  61. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/logo.png +0 -0
  62. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/assets/social-card.png +0 -0
  63. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/authentication.md +0 -0
  64. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/catalog-interface.md +0 -0
  65. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/cli.md +0 -0
  66. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/column-statistics.md +0 -0
  67. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/concepts/index.md +0 -0
  68. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/contributing-docs.md +0 -0
  69. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/filter-pushdown.md +0 -0
  70. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/generator-api.md +0 -0
  71. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/global-functions.md +0 -0
  72. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/how-to/catalogs.md +0 -0
  73. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/how-to/function-patterns.md +0 -0
  74. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/how-to/http-auth.md +0 -0
  75. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/how-to/index.md +0 -0
  76. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  77. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/how-to/state-storage.md +0 -0
  78. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/index.md +0 -0
  79. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/lifecycle.md +0 -0
  80. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/metadata.md +0 -0
  81. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/overrides/main.html +0 -0
  82. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/robots.txt +0 -0
  83. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/shared-storage.md +0 -0
  84. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/stylesheets/extra.css +0 -0
  85. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/tutorial/index.md +0 -0
  86. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/tutorial/scalar.md +0 -0
  87. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/tutorial/table.md +0 -0
  88. {vgi_python-0.30.0 → vgi_python-0.31.0}/docs/vgi-logo.png +0 -0
  89. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/batch_index_worker.py +0 -0
  90. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/cache_worker.py +0 -0
  91. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/calc_scalar_worker.py +0 -0
  92. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/calc_worker.py +0 -0
  93. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/copy_format_worker.py +0 -0
  94. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/filter_worker.py +0 -0
  95. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/greeting_scalar_worker.py +0 -0
  96. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/row_count_worker.py +0 -0
  97. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/series_streaming_worker.py +0 -0
  98. {vgi_python-0.30.0 → vgi_python-0.31.0}/examples/sum_worker.py +0 -0
  99. {vgi_python-0.30.0 → vgi_python-0.31.0}/mkdocs.yml +0 -0
  100. {vgi_python-0.30.0 → vgi_python-0.31.0}/packages/vgi-fixtures/LICENSE +0 -0
  101. {vgi_python-0.30.0 → vgi_python-0.31.0}/packages/vgi-fixtures/README.md +0 -0
  102. {vgi_python-0.30.0 → vgi_python-0.31.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  103. {vgi_python-0.30.0 → vgi_python-0.31.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  104. {vgi_python-0.30.0 → vgi_python-0.31.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  105. {vgi_python-0.30.0 → vgi_python-0.31.0}/scripts/measure_startup.py +0 -0
  106. {vgi_python-0.30.0 → vgi_python-0.31.0}/scripts/run_all_tests.sh +0 -0
  107. {vgi_python-0.30.0 → vgi_python-0.31.0}/test-data/generate.sh +0 -0
  108. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/__init__.py +0 -0
  109. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/_http_fixtures.py +0 -0
  110. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/__init__.py +0 -0
  111. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_attach_option.py +0 -0
  112. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_catalog_interface.py +0 -0
  113. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_client_catalog.py +0 -0
  114. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_column_statistics.py +0 -0
  115. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_declarative.py +0 -0
  116. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  117. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_integration.py +0 -0
  118. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_required_filters.py +0 -0
  119. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_scan_branches.py +0 -0
  120. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_setting.py +0 -0
  121. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_storage.py +0 -0
  122. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_time_travel.py +0 -0
  123. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/catalog/test_writable_table.py +0 -0
  124. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/__init__.py +0 -0
  125. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_aggregate_client.py +0 -0
  126. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_batch_metadata_callback.py +0 -0
  127. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_broken_pipe.py +0 -0
  128. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_cli.py +0 -0
  129. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_cli_catalog_functions.py +0 -0
  130. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_copy_client.py +0 -0
  131. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_scan_branches_client.py +0 -0
  132. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_split_client.py +0 -0
  133. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_stop_force.py +0 -0
  134. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_table_column_statistics.py +0 -0
  135. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_time_travel_client.py +0 -0
  136. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/client/test_worker_debug.py +0 -0
  137. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/__init__.py +0 -0
  138. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/_stub.py +0 -0
  139. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/conftest.py +0 -0
  140. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_accumulate.py +0 -0
  141. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_aggregate.py +0 -0
  142. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_attach.py +0 -0
  143. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_bearer_auth.py +0 -0
  144. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  145. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_container.py +0 -0
  146. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_copy_from.py +0 -0
  147. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_copy_to.py +0 -0
  148. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_directory_parity.py +0 -0
  149. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_function_inventory.py +0 -0
  150. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_github.py +0 -0
  151. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_http_client.py +0 -0
  152. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_http_external_location.py +0 -0
  153. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_http_upload_url.py +0 -0
  154. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_macro.py +0 -0
  155. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_overload.py +0 -0
  156. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_protocol_inventory.py +0 -0
  157. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_resumable_scan.py +0 -0
  158. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_scalar.py +0 -0
  159. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  160. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_secret.py +0 -0
  161. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_settings.py +0 -0
  162. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_splits.py +0 -0
  163. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_table.py +0 -0
  164. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_table_in_out.py +0 -0
  165. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_view.py +0 -0
  166. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conformance/test_writable.py +0 -0
  167. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/conftest.py +0 -0
  168. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  169. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  170. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  171. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/bad_version.bin +0 -0
  172. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/generate.py +0 -0
  173. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/manifest.json +0 -0
  174. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  175. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
  176. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/truncated.bin +0 -0
  177. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
  178. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  179. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/__init__.py +0 -0
  180. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_bernoulli_function.py +0 -0
  181. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_binary_packet_function.py +0 -0
  182. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_client.py +0 -0
  183. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_conditional_message_function.py +0 -0
  184. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_hash_seed_function.py +0 -0
  185. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  186. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_multiply_function.py +0 -0
  187. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_random_bytes_function.py +0 -0
  188. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  189. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/__init__.py +0 -0
  190. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/__init__.py +0 -0
  191. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  192. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  193. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_exception_function.py +0 -0
  194. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  195. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_logging_function.py +0 -0
  196. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  197. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_partitioned_function.py +0 -0
  198. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_projected_data_function.py +0 -0
  199. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_sequence_function.py +0 -0
  200. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_settings_function.py +0 -0
  201. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  202. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  203. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table/test_wide_columns.py +0 -0
  204. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/__init__.py +0 -0
  205. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/__init__.py +0 -0
  206. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  207. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  208. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  209. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  210. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  211. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  212. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  213. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/test_blended_exchange.py +0 -0
  214. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  215. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/table_in_out/test_client.py +0 -0
  216. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_access_log_audit.py +0 -0
  217. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_aggregate_function.py +0 -0
  218. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_argument_spec.py +0 -0
  219. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_auth.py +0 -0
  220. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_bind_exceptions.py +0 -0
  221. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_bind_request_at_clause.py +0 -0
  222. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_bound_storage_conformance.py +0 -0
  223. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_cache_control.py +0 -0
  224. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_call_state_attach.py +0 -0
  225. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_catalog_auth_binding.py +0 -0
  226. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_client_oauth.py +0 -0
  227. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_copy_from_function.py +0 -0
  228. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_copy_to_function.py +0 -0
  229. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_docstrings.py +0 -0
  230. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_documentation_examples.py +0 -0
  231. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_example_function_arg_types.py +0 -0
  232. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_examples_workers.py +0 -0
  233. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_exception_handling.py +0 -0
  234. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_exceptions.py +0 -0
  235. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_filter_pushdown.py +0 -0
  236. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_filter_pushdown_extension.py +0 -0
  237. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_fixture_catalog_parity.py +0 -0
  238. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_function_storage.py +0 -0
  239. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_function_storage_azure_sql.py +0 -0
  240. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_function_storage_cf_do.py +0 -0
  241. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  242. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_function_storage_conformance.py +0 -0
  243. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_cpp_constants.py +0 -0
  244. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  245. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_cpp_request_builders.py +0 -0
  246. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_cpp_schemas.py +0 -0
  247. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_cpp_secret.py +0 -0
  248. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_go_schemas.py +0 -0
  249. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_java_schemas.py +0 -0
  250. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_protocol_version.py +0 -0
  251. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_rust_request_builders.py +0 -0
  252. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_rust_schemas.py +0 -0
  253. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  254. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_ts_client.py +0 -0
  255. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_generated_ts_schemas.py +0 -0
  256. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_http_demo_storage.py +0 -0
  257. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_http_s3_offload_input.py +0 -0
  258. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_http_s3_offload_output.py +0 -0
  259. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_launch_transport.py +0 -0
  260. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_metadata.py +0 -0
  261. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_mypy_consolidated.py +0 -0
  262. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_nest_tensor.py +0 -0
  263. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_otel.py +0 -0
  264. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_projection_enforcement.py +0 -0
  265. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_projection_repro.py +0 -0
  266. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_protocol_classes.py +0 -0
  267. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_resolved_secrets.py +0 -0
  268. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_schema_scoped_functions.py +0 -0
  269. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_schema_utils.py +0 -0
  270. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_serve.py +0 -0
  271. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_setting_secret_annotations.py +0 -0
  272. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_signing_key.py +0 -0
  273. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_split_token.py +0 -0
  274. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_table_buffering_function.py +0 -0
  275. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  276. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_tcp_transport.py +0 -0
  277. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_type_bounds.py +0 -0
  278. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_union_argument.py +0 -0
  279. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_worker.py +0 -0
  280. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_worker_cli.py +0 -0
  281. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/test_worker_page.py +0 -0
  282. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/transactor/__init__.py +0 -0
  283. {vgi_python-0.30.0 → vgi_python-0.31.0}/tests/transactor/test_transactor.py +0 -0
  284. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/__init__.py +0 -0
  285. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_duckdb.py +0 -0
  286. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_storage_profile.py +0 -0
  287. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/__init__.py +0 -0
  288. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  289. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  290. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  291. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  292. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  293. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  294. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  295. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  296. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  297. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  298. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  299. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  300. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  301. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  302. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/attach_options.py +0 -0
  303. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  304. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  305. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/cancellable.py +0 -0
  306. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/catalog.py +0 -0
  307. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/companion.py +0 -0
  308. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/copy_from.py +0 -0
  309. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/copy_to.py +0 -0
  310. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/global_functions.py +0 -0
  311. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/http_server.py +0 -0
  312. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  313. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  314. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  315. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  316. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  317. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  318. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  319. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  320. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  321. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  322. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  323. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  324. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  325. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  326. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  327. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  328. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  329. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  330. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  331. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  332. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  333. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  334. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/_common.py +0 -0
  335. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  336. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  337. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/cache.py +0 -0
  338. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  339. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/filters.py +0 -0
  340. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  341. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  342. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/misc.py +0 -0
  343. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  344. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  345. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  346. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  347. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  348. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  349. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  350. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  351. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/settings.py +0 -0
  352. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/splits.py +0 -0
  353. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  354. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  355. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  356. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  357. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table/wide.py +0 -0
  358. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  359. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  360. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  361. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/versioned.py +0 -0
  362. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  363. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  364. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  365. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/writable/table.py +0 -0
  366. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  367. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/aggregate_function.py +0 -0
  368. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/argument_spec.py +0 -0
  369. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/arguments.py +0 -0
  370. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/attach_header.py +0 -0
  371. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/auth.py +0 -0
  372. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/cache_control.py +0 -0
  373. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/__init__.py +0 -0
  374. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/_descriptor_spec.py +0 -0
  375. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/attach_option.py +0 -0
  376. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/duckdb_statistics.py +0 -0
  377. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/secret_type.py +0 -0
  378. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/setting.py +0 -0
  379. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/catalog/storage.py +0 -0
  380. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/__init__.py +0 -0
  381. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/aggregate.py +0 -0
  382. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/catalog_mixin.py +0 -0
  383. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli.py +0 -0
  384. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli_catalog.py +0 -0
  385. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli_schema.py +0 -0
  386. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli_table.py +0 -0
  387. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli_transaction.py +0 -0
  388. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli_utils.py +0 -0
  389. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/cli_view.py +0 -0
  390. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/client.py +0 -0
  391. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/client/errors.py +0 -0
  392. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/__init__.py +0 -0
  393. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/_common.py +0 -0
  394. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_constants.py +0 -0
  395. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  396. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_request_builders.py +0 -0
  397. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_schemas.py +0 -0
  398. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  399. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  400. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  401. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/go_schemas.py +0 -0
  402. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/java_schemas.py +0 -0
  403. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/protocol_version.py +0 -0
  404. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/rust_request_builders.py +0 -0
  405. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/rust_schemas.py +0 -0
  406. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/ts_client.py +0 -0
  407. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/codegen/ts_schemas.py +0 -0
  408. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/copy_from_function.py +0 -0
  409. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/copy_to_function.py +0 -0
  410. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/exceptions.py +0 -0
  411. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/function.py +0 -0
  412. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/function_storage.py +0 -0
  413. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/function_storage_azure_sql.py +0 -0
  414. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/function_storage_cf_do.py +0 -0
  415. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/http/__init__.py +0 -0
  416. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/http/demo_storage.py +0 -0
  417. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/http/landing.html +0 -0
  418. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/http/landing_page.py +0 -0
  419. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/http/vgi-client.js +0 -0
  420. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/http/worker_page.py +0 -0
  421. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/invocation.py +0 -0
  422. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/logging_config.py +0 -0
  423. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/meta_worker.py +0 -0
  424. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/metadata.py +0 -0
  425. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/otel.py +0 -0
  426. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/profiling.py +0 -0
  427. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/py.typed +0 -0
  428. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/scalar_function.py +0 -0
  429. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/schema_utils.py +0 -0
  430. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/secret_protocol.py +0 -0
  431. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/secret_service.py +0 -0
  432. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/serve.py +0 -0
  433. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/split_token.py +0 -0
  434. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/table_buffering_function.py +0 -0
  435. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/table_filter_pushdown.py +0 -0
  436. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/table_function.py +0 -0
  437. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/table_in_out_function.py +0 -0
  438. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/transactor/__init__.py +0 -0
  439. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/transactor/_duckdb_compat.py +0 -0
  440. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/transactor/client.py +0 -0
  441. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/transactor/protocol.py +0 -0
  442. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/transactor/server.py +0 -0
  443. {vgi_python-0.30.0 → vgi_python-0.31.0}/vgi/worker.py +0 -0
  444. {vgi_python-0.30.0 → vgi_python-0.31.0}/wrangler.jsonc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.30.0
3
+ Version: 0.31.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.30.0"
3
+ version = "0.31.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -1008,6 +1008,33 @@ class TestScanFunctionResultSerialization:
1008
1008
 
1009
1009
  assert restored.required_extensions == ["iceberg", "parquet", "httpfs"]
1010
1010
 
1011
+ def test_schema_name_round_trip(self) -> None:
1012
+ """schema_name (protocol 1.5.0) round-trips when set."""
1013
+ original = ScanFunctionResult(
1014
+ function_name="rowid_sequence",
1015
+ positional_arguments=[],
1016
+ named_arguments={},
1017
+ schema_name="main",
1018
+ )
1019
+ serialized = original.serialize()
1020
+ batch, _ = deserialize_record_batch(serialized)
1021
+ restored = ScanFunctionResult.deserialize(batch)
1022
+
1023
+ assert restored.schema_name == "main"
1024
+
1025
+ def test_schema_name_defaults_to_none(self) -> None:
1026
+ """schema_name is None when the caller doesn't set it (e.g. a pre-1.5.0 peer)."""
1027
+ original = ScanFunctionResult(
1028
+ function_name="read_parquet",
1029
+ positional_arguments=[],
1030
+ named_arguments={},
1031
+ )
1032
+ serialized = original.serialize()
1033
+ batch, _ = deserialize_record_batch(serialized)
1034
+ restored = ScanFunctionResult.deserialize(batch)
1035
+
1036
+ assert restored.schema_name is None
1037
+
1011
1038
 
1012
1039
  class TestSettingSpecSerialization:
1013
1040
  """Test SettingSpec serialization round-trip."""
@@ -1176,6 +1203,10 @@ class TestArrowSchemaCorrectness:
1176
1203
  assert schema.field("function_name").type == pa.string()
1177
1204
  assert schema.field("arguments").type == pa.binary()
1178
1205
  assert schema.field("required_extensions").type == pa.list_(pa.string())
1206
+ # Added in protocol 1.5.0 — nullable so a pre-1.5.0 peer's payload
1207
+ # still deserializes (the column is simply absent there).
1208
+ assert schema.field("schema_name").type == pa.string()
1209
+ assert schema.field("schema_name").nullable is True
1179
1210
 
1180
1211
 
1181
1212
  class TestScanBranchSerialization:
@@ -1192,6 +1223,10 @@ class TestScanBranchSerialization:
1192
1223
  assert schema.field("branch_filter").nullable is True
1193
1224
  assert schema.field("writable").type == pa.bool_()
1194
1225
  assert schema.field("writable").nullable is False
1226
+ # Added in protocol 1.5.0 — function-branch only; None for a
1227
+ # catalog-table/format branch or a pre-1.5.0 peer.
1228
+ assert schema.field("schema_name").type == pa.string()
1229
+ assert schema.field("schema_name").nullable is True
1195
1230
 
1196
1231
  def test_scan_branches_result_schema(self) -> None:
1197
1232
  """ScanBranchesResult Arrow schema: branches as list<binary>, required_extensions hoisted to top-level."""
@@ -1249,6 +1284,36 @@ class TestScanBranchSerialization:
1249
1284
  assert restored.branch_filter == "ts >= TIMESTAMP '2026-05-15 00:00:00'"
1250
1285
  assert len(restored.positional_arguments) == 2
1251
1286
 
1287
+ def test_scan_branch_schema_name_round_trip(self) -> None:
1288
+ """A function branch's schema_name (protocol 1.5.0) round-trips when set."""
1289
+ from vgi.catalog import ScanBranch
1290
+
1291
+ original = ScanBranch(
1292
+ function_name="rowid_sequence",
1293
+ positional_arguments=[],
1294
+ named_arguments={},
1295
+ schema_name="main",
1296
+ )
1297
+ batch, _ = deserialize_record_batch(original.serialize())
1298
+ restored = ScanBranch.deserialize(batch)
1299
+ assert restored.schema_name == "main"
1300
+
1301
+ def test_scan_branch_schema_name_defaults_to_none(self) -> None:
1302
+ """schema_name is None for a branch that doesn't set it (e.g. a catalog-table branch)."""
1303
+ from vgi.catalog import ScanBranch
1304
+
1305
+ original = ScanBranch(
1306
+ function_name="",
1307
+ positional_arguments=[],
1308
+ named_arguments={},
1309
+ source_catalog="lakehouse",
1310
+ source_schema="bronze",
1311
+ source_table="orders",
1312
+ )
1313
+ batch, _ = deserialize_record_batch(original.serialize())
1314
+ restored = ScanBranch.deserialize(batch)
1315
+ assert restored.schema_name is None
1316
+
1252
1317
  def test_scan_branches_result_round_trip(self) -> None:
1253
1318
  """ScanBranchesResult round-trips two heterogeneous branches + required_extensions."""
1254
1319
  from vgi.catalog import ScanBranch, ScanBranchesResult
@@ -32,14 +32,14 @@ CLIENT_PROTOCOL_VERSION = VgiProtocol.protocol_version
32
32
 
33
33
  def test_client_protocol_version_is_canonical() -> None:
34
34
  """Sanity-check the constants this test reasons about haven't drifted apart."""
35
- assert CLIENT_PROTOCOL_VERSION == "1.4.0"
35
+ assert CLIENT_PROTOCOL_VERSION == "1.5.0"
36
36
  # The fixture must be a genuine mismatch in the major/minor that the
37
37
  # framework compares; a patch-only difference would (correctly) pass.
38
38
  assert BAD_PROTOCOL_VERSION.split(".")[:2] != CLIENT_PROTOCOL_VERSION.split(".")[:2]
39
39
 
40
40
 
41
41
  def test_mismatched_worker_protocol_version_raises() -> None:
42
- """A worker enforcing 99.0.0 must reject the 1.4.0 client at dispatch."""
42
+ """A worker enforcing 99.0.0 must reject the 1.5.0 client at dispatch."""
43
43
  with Client("vgi-fixture-bad-protocol-worker") as client, pytest.raises(ClientError) as exc_info:
44
44
  list(
45
45
  client.table_function(
@@ -54,5 +54,5 @@ def test_mismatched_worker_protocol_version_raises() -> None:
54
54
  assert "protocol_version mismatch" in message
55
55
  assert CLIENT_PROTOCOL_VERSION in message
56
56
  assert BAD_PROTOCOL_VERSION in message
57
- # Directional hint: the client (1.3.0) is older than the worker (99.0.0).
57
+ # Directional hint: the client (1.5.0) is older than the worker (99.0.0).
58
58
  assert "upgrade the VGI extension/client" in message
@@ -81,6 +81,7 @@ def _scan_function_result() -> ScanFunctionResult:
81
81
  positional_arguments=positional,
82
82
  named_arguments=named,
83
83
  required_extensions=["parquet"],
84
+ schema_name="main",
84
85
  )
85
86
 
86
87
 
@@ -98,6 +99,7 @@ def _scan_branch() -> ScanBranch:
98
99
  format_name="parquet",
99
100
  format_locations=["s3://bucket/a.parquet"],
100
101
  format_options={"delim": pa.scalar("|", pa.string())},
102
+ schema_name="main",
101
103
  )
102
104
 
103
105
 
@@ -2569,7 +2569,7 @@ requires-dist = [
2569
2569
 
2570
2570
  [[package]]
2571
2571
  name = "vgi-python"
2572
- version = "0.30.0"
2572
+ version = "0.31.0"
2573
2573
  source = { editable = "." }
2574
2574
  dependencies = [
2575
2575
  { name = "click" },
@@ -0,0 +1,136 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Same-name-in-two-schemas producer, backing a DECLARATIVE TABLE in each schema.
4
+
5
+ The table-dispatch member of the schema-disambiguation family (see
6
+ ``scalar/same_name.py``, ``table_in_out_same_name.py``, ``aggregate/same_name.py``,
7
+ and ``table/same_name_cached.py`` for the result-cache member). Those probe a
8
+ function called directly (or the result cache); this one probes
9
+ ``catalog_table_scan_function_get``/``catalog_table_scan_branches_get`` — the RPC
10
+ pair that tells a client which function backs a *declarative catalog table*.
11
+
12
+ ``test_same_name_table_scan`` is a one-row producer registered under the SAME
13
+ NAME in BOTH the ``main`` and ``data`` schemas of the ``example`` catalog, each
14
+ emitting a single row tagged with its own schema. A declarative ``Table``
15
+ descriptor named ``test_same_name_table`` is registered in each schema too, each
16
+ backed by that schema's own implementation.
17
+
18
+ This is also the end-to-end regression guard for protocol 1.5.0's
19
+ ``ScanFunctionResult.schema_name``/``ScanBranch.schema_name``: the C++ extension
20
+ now prefers the worker-declared schema over its old table-schema/default-schema
21
+ heuristic when resolving which catalog entry ``function_name`` refers to. A
22
+ worker that regressed to leaving ``schema_name`` unset, or a client that stopped
23
+ consuming it, would silently fall back to the old heuristic — which still
24
+ happens to get *this* two-schema case right (the table's own schema is tried
25
+ first and always matches here), so a regression here would show up not as a
26
+ wrong row, but as the exact filter/projection-pushdown breakage this session's
27
+ own investigation traced to passing the wire-parsed schema string somewhere the
28
+ resolver couldn't safely reuse it — see ``cache/filter_pushdown_keys.test`` and
29
+ this table family's own pushdown assertions below. Driven by
30
+ ``table/same_name_schemas.test``.
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ from dataclasses import dataclass
36
+ from typing import ClassVar
37
+
38
+ import pyarrow as pa
39
+ from vgi_rpc import ArrowSerializableDataclass
40
+ from vgi_rpc.rpc import OutputCollector
41
+
42
+ from vgi.metadata import FunctionExample
43
+ from vgi.schema_utils import schema
44
+ from vgi.table_function import (
45
+ ProcessParams,
46
+ TableFunctionGenerator,
47
+ bind_fixed_schema,
48
+ init_single_worker,
49
+ )
50
+
51
+ FUNCTION_NAME = "test_same_name_table_scan"
52
+ TABLE_NAME = "test_same_name_table"
53
+
54
+
55
+ @dataclass(slots=True, frozen=True)
56
+ class _SameNameTableArgs:
57
+ """Arguments for the same-name table producer (none)."""
58
+
59
+
60
+ @dataclass(kw_only=True)
61
+ class _SameNameTableState(ArrowSerializableDataclass):
62
+ """One-shot emit latch for the single output row."""
63
+
64
+ done: bool = False
65
+
66
+
67
+ class _SameNameTableScan(TableFunctionGenerator[_SameNameTableArgs, _SameNameTableState]):
68
+ """Shared body; each subclass supplies the schema it is declared in."""
69
+
70
+ #: Schema this implementation is declared in — the tag it stamps.
71
+ OWNING_SCHEMA: ClassVar[str] = ""
72
+
73
+ FunctionArguments = _SameNameTableArgs
74
+ FIXED_SCHEMA: ClassVar[pa.Schema] = schema(tag=pa.string())
75
+
76
+ @classmethod
77
+ def initial_state(cls, params: ProcessParams[_SameNameTableArgs]) -> _SameNameTableState:
78
+ """Fresh latch per invocation."""
79
+ return _SameNameTableState()
80
+
81
+ @classmethod
82
+ def process(
83
+ cls,
84
+ params: ProcessParams[_SameNameTableArgs],
85
+ state: _SameNameTableState,
86
+ out: OutputCollector,
87
+ ) -> None:
88
+ """Emit the single schema-tagged row once."""
89
+ if state.done:
90
+ out.finish()
91
+ return
92
+ batch = pa.RecordBatch.from_pydict({"tag": [cls.OWNING_SCHEMA]}, schema=params.output_schema)
93
+ out.emit(batch)
94
+ state.done = True
95
+
96
+
97
+ @init_single_worker
98
+ @bind_fixed_schema
99
+ class SameNameTableMainScan(_SameNameTableScan):
100
+ """``test_same_name_table_scan`` as declared in the ``main`` schema."""
101
+
102
+ OWNING_SCHEMA = "main"
103
+
104
+ class Meta:
105
+ """Function metadata."""
106
+
107
+ name = FUNCTION_NAME
108
+ description = "Schema-disambiguation probe; the main-schema table producer"
109
+ categories = ["generator", "testing"]
110
+ examples = [
111
+ FunctionExample(
112
+ sql="SELECT * FROM example.main.test_same_name_table",
113
+ description="One row tagged 'main'",
114
+ ),
115
+ ]
116
+
117
+
118
+ @init_single_worker
119
+ @bind_fixed_schema
120
+ class SameNameTableDataScan(_SameNameTableScan):
121
+ """``test_same_name_table_scan`` as declared in the ``data`` schema."""
122
+
123
+ OWNING_SCHEMA = "data"
124
+
125
+ class Meta:
126
+ """Function metadata."""
127
+
128
+ name = FUNCTION_NAME
129
+ description = "Schema-disambiguation probe; the data-schema table producer"
130
+ categories = ["generator", "testing"]
131
+ examples = [
132
+ FunctionExample(
133
+ sql="SELECT * FROM example.data.test_same_name_table",
134
+ description="One row tagged 'data'",
135
+ ),
136
+ ]
@@ -254,6 +254,10 @@ from vgi._test_fixtures.table.same_name_cached import (
254
254
  SameNameDataCached,
255
255
  SameNameMainCached,
256
256
  )
257
+ from vgi._test_fixtures.table.same_name_schemas import (
258
+ SameNameTableDataScan,
259
+ SameNameTableMainScan,
260
+ )
257
261
  from vgi._test_fixtures.table.tt_pushdown import (
258
262
  _TT_SCHEMA,
259
263
  TimeTravelPushdownFunction,
@@ -648,6 +652,7 @@ _EXAMPLE_CATALOG = Catalog(
648
652
  SameNameMainBuffered,
649
653
  SameNameMainAgg,
650
654
  SameNameMainCached,
655
+ SameNameTableMainScan,
651
656
  ScaleBySettingFunction,
652
657
  SecretFieldFunction,
653
658
  SmartFormatPrefixFunction,
@@ -733,6 +738,17 @@ _EXAMPLE_CATALOG = Catalog(
733
738
  parameter_docs={"n": "Number of rows to generate"},
734
739
  ),
735
740
  ],
741
+ tables=[
742
+ # Schema-disambiguation probe (table dispatch): same registered
743
+ # table name as the -schema table below, backed by this
744
+ # schema's own scan-function implementation — see
745
+ # same_name_schemas.py.
746
+ Table(
747
+ name="test_same_name_table",
748
+ function=SameNameTableMainScan,
749
+ comment="Schema-disambiguation probe; the main-schema table",
750
+ ),
751
+ ],
736
752
  ),
737
753
  Schema(
738
754
  name="data",
@@ -747,8 +763,17 @@ _EXAMPLE_CATALOG = Catalog(
747
763
  SameNameDataBuffered,
748
764
  SameNameDataAgg,
749
765
  SameNameDataCached,
766
+ SameNameTableDataScan,
750
767
  ],
751
768
  tables=[
769
+ # Schema-disambiguation probe (table dispatch): same registered
770
+ # table name as the main-schema table above, backed by this
771
+ # schema's own scan-function implementation.
772
+ Table(
773
+ name="test_same_name_table",
774
+ function=SameNameTableDataScan,
775
+ comment="Schema-disambiguation probe; the data-schema table",
776
+ ),
752
777
  # Function-backed table: schema derived via bind()
753
778
  Table(
754
779
  name="large_sequence",
@@ -1577,11 +1602,13 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1577
1602
  function_name="sequence",
1578
1603
  positional_arguments=[pa.scalar(50)],
1579
1604
  named_arguments={},
1605
+ schema_name="main",
1580
1606
  ),
1581
1607
  ScanBranch(
1582
1608
  function_name="sequence",
1583
1609
  positional_arguments=[pa.scalar(50)],
1584
1610
  named_arguments={},
1611
+ schema_name="main",
1585
1612
  ),
1586
1613
  ],
1587
1614
  required_extensions=[],
@@ -1598,11 +1625,13 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1598
1625
  function_name="split_sequence",
1599
1626
  positional_arguments=[],
1600
1627
  named_arguments={"n": pa.scalar(30), "splits": pa.scalar(6)},
1628
+ schema_name="main",
1601
1629
  ),
1602
1630
  ScanBranch(
1603
1631
  function_name="sequence",
1604
1632
  positional_arguments=[pa.scalar(20)],
1605
1633
  named_arguments={},
1634
+ schema_name="main",
1606
1635
  ),
1607
1636
  ],
1608
1637
  required_extensions=[],
@@ -1619,12 +1648,14 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1619
1648
  positional_arguments=[pa.scalar(100)],
1620
1649
  named_arguments={},
1621
1650
  branch_filter="n < 50",
1651
+ schema_name="main",
1622
1652
  ),
1623
1653
  ScanBranch(
1624
1654
  function_name="sequence",
1625
1655
  positional_arguments=[pa.scalar(100)],
1626
1656
  named_arguments={},
1627
1657
  branch_filter="n >= 50",
1658
+ schema_name="main",
1628
1659
  ),
1629
1660
  ],
1630
1661
  required_extensions=[],
@@ -1641,11 +1672,15 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1641
1672
  function_name="sequence",
1642
1673
  positional_arguments=[pa.scalar(50)],
1643
1674
  named_arguments={},
1675
+ schema_name="main",
1644
1676
  ),
1645
1677
  ScanBranch(
1646
1678
  function_name="read_parquet",
1647
1679
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/vgi_hetero_branch.parquet", pa.string())],
1648
1680
  named_arguments={},
1681
+ # read_parquet is a native DuckDB function delegated straight
1682
+ # through — it has no VGI-side schema of its own to report.
1683
+ schema_name=None,
1649
1684
  ),
1650
1685
  ],
1651
1686
  required_extensions=[],
@@ -1684,6 +1719,9 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1684
1719
  # non-null count moves.
1685
1720
  "nullstr": pa.scalar("row_2", pa.string()),
1686
1721
  },
1722
+ # Format branch, not a function branch — schema_name is
1723
+ # function-branch-only and doesn't apply here.
1724
+ schema_name=None,
1687
1725
  ),
1688
1726
  ],
1689
1727
  required_extensions=[],
@@ -1701,11 +1739,15 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1701
1739
  function_name="sequence",
1702
1740
  positional_arguments=[pa.scalar(50)],
1703
1741
  named_arguments={},
1742
+ schema_name="main",
1704
1743
  ),
1705
1744
  ScanBranch(
1706
1745
  function_name="iceberg_scan",
1707
1746
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/vgi_iceberg_branch", pa.string())],
1708
1747
  named_arguments={},
1748
+ # iceberg_scan is a native DuckDB function delegated
1749
+ # straight through — no VGI-side schema of its own.
1750
+ schema_name=None,
1709
1751
  ),
1710
1752
  ],
1711
1753
  required_extensions=["iceberg"],
@@ -1729,12 +1771,14 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1729
1771
  positional_arguments=[pa.scalar(10)],
1730
1772
  named_arguments={},
1731
1773
  writable=True,
1774
+ schema_name="main",
1732
1775
  ),
1733
1776
  ScanBranch(
1734
1777
  function_name="sequence",
1735
1778
  positional_arguments=[pa.scalar(10)],
1736
1779
  named_arguments={},
1737
1780
  writable=True,
1781
+ schema_name="main",
1738
1782
  ),
1739
1783
  ],
1740
1784
  required_extensions=[],
@@ -1751,11 +1795,15 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1751
1795
  function_name="sequence",
1752
1796
  positional_arguments=[pa.scalar(50)],
1753
1797
  named_arguments={},
1798
+ schema_name="main",
1754
1799
  ),
1755
1800
  ScanBranch(
1756
1801
  function_name="read_csv_auto",
1757
1802
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/vgi_nopushdown_branch.csv", pa.string())],
1758
1803
  named_arguments={},
1804
+ # read_csv_auto is a native DuckDB function delegated
1805
+ # straight through — no VGI-side schema of its own.
1806
+ schema_name=None,
1759
1807
  ),
1760
1808
  ],
1761
1809
  required_extensions=[],
@@ -1773,16 +1821,19 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1773
1821
  function_name="read_parquet",
1774
1822
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/vgi_recon_a_b.parquet", pa.string())],
1775
1823
  named_arguments={},
1824
+ schema_name=None,
1776
1825
  ),
1777
1826
  ScanBranch(
1778
1827
  function_name="read_parquet",
1779
1828
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/vgi_recon_b_a.parquet", pa.string())],
1780
1829
  named_arguments={},
1830
+ schema_name=None,
1781
1831
  ),
1782
1832
  ScanBranch(
1783
1833
  function_name="read_parquet",
1784
1834
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/vgi_recon_a_only.parquet", pa.string())],
1785
1835
  named_arguments={},
1836
+ schema_name=None,
1786
1837
  ),
1787
1838
  ],
1788
1839
  required_extensions=[],
@@ -1823,6 +1874,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1823
1874
  function_name="versioned_data_scan",
1824
1875
  positional_arguments=[pa.scalar(version)],
1825
1876
  named_arguments={},
1877
+ schema_name="main",
1826
1878
  )
1827
1879
 
1828
1880
  # cache_versioned: AT → version arg, same as versioned_data but the scan
@@ -1833,6 +1885,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1833
1885
  function_name="cache_versioned_scan",
1834
1886
  positional_arguments=[pa.scalar(version)],
1835
1887
  named_arguments={},
1888
+ schema_name="main",
1836
1889
  )
1837
1890
 
1838
1891
  # Columns-based time-travel + pushdown: resolve AT → version and pass it
@@ -1843,6 +1896,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1843
1896
  function_name="tt_pushdown_cols_scan",
1844
1897
  positional_arguments=[pa.scalar(version)],
1845
1898
  named_arguments={},
1899
+ schema_name="main",
1846
1900
  )
1847
1901
 
1848
1902
  # Handle the versioned_constraints table with time travel
@@ -1852,6 +1906,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1852
1906
  function_name="versioned_constraints_scan",
1853
1907
  positional_arguments=[pa.scalar(version)],
1854
1908
  named_arguments={},
1909
+ schema_name="main",
1855
1910
  )
1856
1911
 
1857
1912
  # rff_parquet — single-branch native read_parquet delegation.
@@ -1860,6 +1915,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1860
1915
  function_name="read_parquet",
1861
1916
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/rff_seg.parquet", pa.string())],
1862
1917
  named_arguments={},
1918
+ schema_name=None,
1863
1919
  )
1864
1920
 
1865
1921
  # rff_hive / rff_hive_mixed — native read_parquet over a Hive glob.
@@ -1868,6 +1924,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1868
1924
  function_name="read_parquet",
1869
1925
  positional_arguments=[pa.scalar(f"{_BRANCH_DIR}/rff_hive/*/*/*.parquet", pa.string())],
1870
1926
  named_arguments={"hive_partitioning": pa.scalar(True)},
1927
+ schema_name=None,
1871
1928
  )
1872
1929
 
1873
1930
  # Reject AT clause on tables that don't support time travel
@@ -1880,6 +1937,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1880
1937
  function_name="sequence",
1881
1938
  positional_arguments=[pa.scalar(10)],
1882
1939
  named_arguments={},
1940
+ schema_name="main",
1883
1941
  )
1884
1942
 
1885
1943
  # Handle "numbers" and "volatile_numbers" — both use sequence(100)
@@ -1888,6 +1946,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1888
1946
  function_name="sequence",
1889
1947
  positional_arguments=[pa.scalar(100)],
1890
1948
  named_arguments={},
1949
+ schema_name="main",
1891
1950
  )
1892
1951
 
1893
1952
  # funny_numbers — 123456 rows from sequence; statistics deliberately NOT set on
@@ -1897,6 +1956,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1897
1956
  function_name="sequence",
1898
1957
  positional_arguments=[pa.scalar(123456)],
1899
1958
  named_arguments={},
1959
+ schema_name="main",
1900
1960
  )
1901
1961
 
1902
1962
  # Constraint example tables — simple static scan functions
@@ -1923,6 +1983,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1923
1983
  function_name=_static_scan_tables[name.lower()],
1924
1984
  positional_arguments=[],
1925
1985
  named_arguments={},
1986
+ schema_name="main",
1926
1987
  )
1927
1988
 
1928
1989
  # Row ID test tables
@@ -1942,6 +2003,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1942
2003
  "layout": pa.scalar(opts["layout"]),
1943
2004
  "row_id_type": pa.scalar(opts["row_id_type"]),
1944
2005
  },
2006
+ schema_name="main",
1945
2007
  )
1946
2008
 
1947
2009
  # Late-materialization tables → late_materialization scan function.
@@ -1957,6 +2019,7 @@ class ExampleCatalog(ReadOnlyCatalogInterface):
1957
2019
  function_name="late_materialization",
1958
2020
  positional_arguments=[pa.scalar(1000)],
1959
2021
  named_arguments=late_mat_tables[name.lower()],
2022
+ schema_name="main",
1960
2023
  )
1961
2024
 
1962
2025
  return super().table_scan_function_get(