vgi-python 0.48.0__tar.gz → 0.48.2__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 (891) hide show
  1. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/workflows/ci.yml +22 -2
  2. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/workflows/integration.yml +1 -1
  3. {vgi_python-0.48.0 → vgi_python-0.48.2}/PKG-INFO +2 -1
  4. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/catalog-interface.md +152 -16
  5. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/python-contracts.md +1 -1
  6. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/alerts.md +1 -1
  7. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/common.md +1 -1
  8. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/delegations.md +1 -1
  9. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/discovery.md +1 -1
  10. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/notify.md +1 -1
  11. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/objects.md +2 -2
  12. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/ownership.md +1 -1
  13. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/render.md +1 -1
  14. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/reports.md +1 -1
  15. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/resource_identity.md +2 -2
  16. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/resource_ownership.md +2 -2
  17. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/schedules.md +1 -1
  18. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/schedules_v2.md +1 -1
  19. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/sources.md +1 -1
  20. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reference/sql_tasks.md +1 -1
  21. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/cache_worker.py +1 -1
  22. {vgi_python-0.48.0 → vgi_python-0.48.2}/pyproject.toml +5 -1
  23. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/check_duckdb2_manifest.py +2 -1
  24. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_constraint_contract.py +7 -1
  25. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_constraint_example_cross_sdk.py +15 -10
  26. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_constraint_public_contract.py +21 -8
  27. vgi_python-0.48.2/tests/catalog/test_constraint_records.py +309 -0
  28. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_declarative.py +17 -225
  29. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_generated_columns_protocol.py +7 -0
  30. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_statement_socket.py +29 -8
  31. vgi_python-0.48.2/tests/catalog/test_v3_regressions.py +562 -0
  32. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_cli_catalog_functions.py +3 -2
  33. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_argument_metadata.py +2 -0
  34. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_documentation_examples.py +2 -1
  35. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_http_demo_storage.py +4 -0
  36. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/transactor/test_completion_lifecycle.py +5 -0
  37. {vgi_python-0.48.0 → vgi_python-0.48.2}/uv.lock +4 -2
  38. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/catalog.py +4 -1
  39. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/worker.py +2 -19
  40. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/__init__.py +26 -2
  41. vgi_python-0.48.2/vgi/catalog/_dispatch.py +179 -0
  42. vgi_python-0.48.2/vgi/catalog/_expression_grammar.py +243 -0
  43. vgi_python-0.48.2/vgi/catalog/_legacy.py +46 -0
  44. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/capabilities.py +16 -0
  45. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/catalog_interface.py +122 -2
  46. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/constraints.py +362 -6
  47. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/descriptors.py +67 -99
  48. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/indexes.py +48 -1
  49. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/sql.py +136 -0
  50. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/__init__.py +7 -1
  51. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/catalog_mixin.py +37 -4
  52. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli_utils.py +5 -27
  53. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/reporting_docs.py +8 -3
  54. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/typed_values.py +18 -0
  55. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/worker.py +95 -26
  56. {vgi_python-0.48.0 → vgi_python-0.48.2}/.dockerignore +0 -0
  57. {vgi_python-0.48.0 → vgi_python-0.48.2}/.gitattributes +0 -0
  58. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/dependabot.yml +0 -0
  59. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  60. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/workflows/docs.yml +0 -0
  61. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/workflows/release.yml +0 -0
  62. {vgi_python-0.48.0 → vgi_python-0.48.2}/.github/workflows/tailnet-integration.yml +0 -0
  63. {vgi_python-0.48.0 → vgi_python-0.48.2}/.gitignore +0 -0
  64. {vgi_python-0.48.0 → vgi_python-0.48.2}/.python-version +0 -0
  65. {vgi_python-0.48.0 → vgi_python-0.48.2}/.vale.ini +0 -0
  66. {vgi_python-0.48.0 → vgi_python-0.48.2}/CLAUDE.md +0 -0
  67. {vgi_python-0.48.0 → vgi_python-0.48.2}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  68. {vgi_python-0.48.0 → vgi_python-0.48.2}/DOCS_REVIEW_RUBRIC.md +0 -0
  69. {vgi_python-0.48.0 → vgi_python-0.48.2}/DOCS_USABILITY_TEST.md +0 -0
  70. {vgi_python-0.48.0 → vgi_python-0.48.2}/LICENSE +0 -0
  71. {vgi_python-0.48.0 → vgi_python-0.48.2}/PROTOCOL.md +0 -0
  72. {vgi_python-0.48.0 → vgi_python-0.48.2}/README.md +0 -0
  73. {vgi_python-0.48.0 → vgi_python-0.48.2}/RELEASE-RUNBOOK.md +0 -0
  74. {vgi_python-0.48.0 → vgi_python-0.48.2}/SECURITY.md +0 -0
  75. {vgi_python-0.48.0 → vgi_python-0.48.2}/ci/README.md +0 -0
  76. {vgi_python-0.48.0 → vgi_python-0.48.2}/ci/preprocess-require.awk +0 -0
  77. {vgi_python-0.48.0 → vgi_python-0.48.2}/ci/run-integration.sh +0 -0
  78. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/catalog-contracts.json +0 -0
  79. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/README.md +0 -0
  80. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  81. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  82. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  83. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  84. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  85. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  86. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  87. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  88. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  89. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
  90. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  91. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  92. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  93. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  94. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/filter-v2.schema.json +0 -0
  95. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/generate_runtime.py +0 -0
  96. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/manifest.json +0 -0
  97. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/run_worker.py +0 -0
  98. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  99. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  100. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  101. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  102. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  103. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  104. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  105. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  106. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  107. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  108. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  109. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  110. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  111. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  112. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  113. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  114. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  115. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  116. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  117. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  118. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  119. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  120. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  121. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  122. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  123. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  124. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  125. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  126. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  127. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  128. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  129. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  130. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  131. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  132. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  133. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  134. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  135. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  136. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  137. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  138. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  139. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  140. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  141. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  142. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  143. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  144. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  145. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  146. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  147. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  148. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  149. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  150. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  151. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  152. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  153. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  154. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  155. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  156. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  157. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  158. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  159. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  160. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  161. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  162. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  163. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  164. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  165. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  166. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  167. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  168. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  169. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  170. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  171. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  172. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  173. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  174. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  175. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  176. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  177. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  178. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  179. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  180. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  181. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  182. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  183. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  184. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  185. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  186. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  187. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  188. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  189. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  190. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  191. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  192. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  193. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  194. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  195. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  196. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  197. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  198. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  199. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  200. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  201. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  202. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  203. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  204. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  205. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  206. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  207. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  208. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  209. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  210. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  211. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  212. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  213. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  214. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  215. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  216. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  217. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  218. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  219. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  220. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  221. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  222. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  223. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  224. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  225. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  226. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  227. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  228. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  229. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  230. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  231. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  232. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  233. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  234. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  235. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  236. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  237. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  238. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  239. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  240. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  241. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  242. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  243. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  244. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  245. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  246. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  247. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  248. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  249. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  250. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  251. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  252. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  253. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  254. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  255. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/filter-v2/runtime-manifest.json +0 -0
  256. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/projection-expressions/README.md +0 -0
  257. {vgi_python-0.48.0 → vgi_python-0.48.2}/conformance/projection-expressions/run_worker.py +0 -0
  258. {vgi_python-0.48.0 → vgi_python-0.48.2}/dist-vgi/.gitignore +0 -0
  259. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/aggregate-functions.md +0 -0
  260. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/arguments.md +0 -0
  261. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/auth.md +0 -0
  262. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/catalogs.md +0 -0
  263. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/client.md +0 -0
  264. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/exceptions.md +0 -0
  265. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/filters.md +0 -0
  266. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/functions.md +0 -0
  267. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/http.md +0 -0
  268. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/index.md +0 -0
  269. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/metadata.md +0 -0
  270. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/observability.md +0 -0
  271. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/storage.md +0 -0
  272. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/transactor.md +0 -0
  273. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/api/worker.md +0 -0
  274. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/argument-serialization.md +0 -0
  275. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/apple-touch-icon.png +0 -0
  276. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/favicon-16x16.png +0 -0
  277. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/favicon-32x32.png +0 -0
  278. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/favicon.ico +0 -0
  279. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/kinds/aggregate.svg +0 -0
  280. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/kinds/buffering.svg +0 -0
  281. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/kinds/scalar.svg +0 -0
  282. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/kinds/table-in-out.svg +0 -0
  283. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/kinds/table.svg +0 -0
  284. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/logo.png +0 -0
  285. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/social-card.png +0 -0
  286. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/assets/video-thumbnail.jpg +0 -0
  287. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/authentication.md +0 -0
  288. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/catalog_publication.md +0 -0
  289. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/cli.md +0 -0
  290. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/column-statistics.md +0 -0
  291. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/concepts/index.md +0 -0
  292. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/contributing-docs.md +0 -0
  293. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/IMPLEMENTATION.md +0 -0
  294. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/README.md +0 -0
  295. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/alerts.md +0 -0
  296. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/attach-tickets-plan.md +0 -0
  297. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/credentials.md +0 -0
  298. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/notify.md +0 -0
  299. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/prerequisites.md +0 -0
  300. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/render.md +0 -0
  301. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reporting-protocols.html +0 -0
  302. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/reports.md +0 -0
  303. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/schedules.md +0 -0
  304. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/design/reporting-protocols/sql_tasks.md +0 -0
  305. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/filter-pushdown.md +0 -0
  306. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/generator-api.md +0 -0
  307. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/global-functions.md +0 -0
  308. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/catalogs.md +0 -0
  309. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/function-patterns.md +0 -0
  310. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/http-auth.md +0 -0
  311. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/index.md +0 -0
  312. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/iroh.md +0 -0
  313. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/pushdown-and-statistics.md +0 -0
  314. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/state-storage.md +0 -0
  315. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/how-to/tailnet.md +0 -0
  316. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/index.md +0 -0
  317. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/lifecycle.md +0 -0
  318. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/metadata.md +0 -0
  319. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/overrides/main.html +0 -0
  320. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/duckdb-2.0-main-integration-2026-10-24.md +0 -0
  321. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/duckdb-2.0-manifest.json +0 -0
  322. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/index.md +0 -0
  323. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/logical-types.md +0 -0
  324. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/macro-contract.md +0 -0
  325. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/projection-expressions.md +0 -0
  326. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/scan-repeatability.md +0 -0
  327. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/shared-catalog-values.md +0 -0
  328. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-attach-tickets.md +0 -0
  329. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  330. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  331. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  332. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-opaque-data-sealing.md +0 -0
  333. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  334. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  335. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/vgi-secrets.md +0 -0
  336. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/view-metadata.md +0 -0
  337. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/protocol/view-security.md +0 -0
  338. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/robots.txt +0 -0
  339. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/shared-storage.md +0 -0
  340. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/stylesheets/extra.css +0 -0
  341. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/tutorial/index.md +0 -0
  342. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/tutorial/scalar.md +0 -0
  343. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/tutorial/table.md +0 -0
  344. {vgi_python-0.48.0 → vgi_python-0.48.2}/docs/vgi-logo.png +0 -0
  345. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/batch_index_worker.py +0 -0
  346. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/calc_scalar_worker.py +0 -0
  347. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/calc_worker.py +0 -0
  348. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/copy_format_worker.py +0 -0
  349. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/filter_worker.py +0 -0
  350. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/greeting_scalar_worker.py +0 -0
  351. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/paged_api_worker.py +0 -0
  352. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/row_count_worker.py +0 -0
  353. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/series_streaming_worker.py +0 -0
  354. {vgi_python-0.48.0 → vgi_python-0.48.2}/examples/sum_worker.py +0 -0
  355. {vgi_python-0.48.0 → vgi_python-0.48.2}/identity.png +0 -0
  356. {vgi_python-0.48.0 → vgi_python-0.48.2}/mkdocs.yml +0 -0
  357. {vgi_python-0.48.0 → vgi_python-0.48.2}/packages/vgi-fixtures/LICENSE +0 -0
  358. {vgi_python-0.48.0 → vgi_python-0.48.2}/packages/vgi-fixtures/README.md +0 -0
  359. {vgi_python-0.48.0 → vgi_python-0.48.2}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  360. {vgi_python-0.48.0 → vgi_python-0.48.2}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  361. {vgi_python-0.48.0 → vgi_python-0.48.2}/packages/vgi-fixtures/pyproject.toml +0 -0
  362. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/build_reporting_protocols_html.py +0 -0
  363. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/catalog_publication_fixture.py +0 -0
  364. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/gen_attach_ticket_vectors.py +0 -0
  365. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/hosted_protocols_conformance.sh +0 -0
  366. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/measure_startup.py +0 -0
  367. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/regen_generated.py +0 -0
  368. {vgi_python-0.48.0 → vgi_python-0.48.2}/scripts/run_all_tests.sh +0 -0
  369. {vgi_python-0.48.0 → vgi_python-0.48.2}/test-data/generate.sh +0 -0
  370. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/__init__.py +0 -0
  371. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/_hosted_protocols_worker.py +0 -0
  372. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/_http_fixtures.py +0 -0
  373. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/__init__.py +0 -0
  374. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/column_native_reference.py +0 -0
  375. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/column_paths_reference.py +0 -0
  376. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/constraints_protocol_reference.py +0 -0
  377. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/constraints_reference.py +0 -0
  378. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/dependencies_native.py +0 -0
  379. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/dependencies_reference.py +0 -0
  380. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/expression_reference.py +0 -0
  381. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/generated_columns_reference.py +0 -0
  382. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/index_protocol_reference.py +0 -0
  383. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/query_native.py +0 -0
  384. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/query_reference.py +0 -0
  385. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/required_filters_native.py +0 -0
  386. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/schema_options_reference.py +0 -0
  387. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/statement_reference.py +0 -0
  388. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/table_layout_reference.py +0 -0
  389. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_attach_option.py +0 -0
  390. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_catalog_contents.py +0 -0
  391. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_catalog_interface.py +0 -0
  392. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_catalog_publication.py +0 -0
  393. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_client_capabilities.py +0 -0
  394. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_client_catalog.py +0 -0
  395. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_client_load_catalog.py +0 -0
  396. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_column_expression_cli.py +0 -0
  397. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_column_metadata.py +0 -0
  398. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_column_paths_protocol.py +0 -0
  399. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_column_statistics.py +0 -0
  400. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_constraint_fixture_boundaries.py +0 -0
  401. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_constraints_public_lifecycle.py +0 -0
  402. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_constraints_reference.py +0 -0
  403. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_dependencies.py +0 -0
  404. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_dependencies_protocol.py +0 -0
  405. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_dependency_alter_lifecycle.py +0 -0
  406. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_dependency_alter_negotiation.py +0 -0
  407. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_example_worker_catalog.py +0 -0
  408. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_expression_contract.py +0 -0
  409. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_function_info_binary_dictionary.py +0 -0
  410. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_index_example_cross_sdk.py +0 -0
  411. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_index_public_contract.py +0 -0
  412. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_index_public_lifecycle.py +0 -0
  413. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_integration.py +0 -0
  414. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_logical_type_gates.py +0 -0
  415. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_macro_contract.py +0 -0
  416. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_macro_overload_protocol.py +0 -0
  417. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_metadata_changes.py +0 -0
  418. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_nullable_default_schema.py +0 -0
  419. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_options.py +0 -0
  420. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_query_contract.py +0 -0
  421. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_query_parameters.py +0 -0
  422. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_query_protocol.py +0 -0
  423. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_required_filters.py +0 -0
  424. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_scan_branches.py +0 -0
  425. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_schema_metadata_protocol.py +0 -0
  426. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_schema_options_protocol.py +0 -0
  427. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_serialization.py +0 -0
  428. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_setting.py +0 -0
  429. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_statement_contract.py +0 -0
  430. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_statement_protocol.py +0 -0
  431. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_storage.py +0 -0
  432. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_table_layout_protocol.py +0 -0
  433. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_time_travel.py +0 -0
  434. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_variant_capabilities.py +0 -0
  435. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_view_metadata_cross_sdk.py +0 -0
  436. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_view_metadata_protocol.py +0 -0
  437. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_view_security_protocol.py +0 -0
  438. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_writable_signed_transactions.py +0 -0
  439. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/test_writable_table.py +0 -0
  440. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/transaction_begin_probe.py +0 -0
  441. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/transaction_cleanup_probe.py +0 -0
  442. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/transactional_write_reference.py +0 -0
  443. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/typing_helpers.py +0 -0
  444. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/view_alias_native.py +0 -0
  445. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/view_security_reference.py +0 -0
  446. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/catalog/write_finalize_probe.py +0 -0
  447. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/__init__.py +0 -0
  448. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_aggregate_client.py +0 -0
  449. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_batch_metadata_callback.py +0 -0
  450. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_bind_and_join_keys.py +0 -0
  451. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_broken_pipe.py +0 -0
  452. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_cli.py +0 -0
  453. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_copy_client.py +0 -0
  454. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_http_response_budget.py +0 -0
  455. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_iroh_client.py +0 -0
  456. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_scan_branches_client.py +0 -0
  457. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_split_client.py +0 -0
  458. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_stop_force.py +0 -0
  459. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_table_column_statistics.py +0 -0
  460. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_time_travel_client.py +0 -0
  461. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/client/test_worker_debug.py +0 -0
  462. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/__init__.py +0 -0
  463. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/_stub.py +0 -0
  464. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/conftest.py +0 -0
  465. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_accumulate.py +0 -0
  466. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_aggregate.py +0 -0
  467. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_attach.py +0 -0
  468. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_bearer_auth.py +0 -0
  469. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_const_param_enforcement.py +0 -0
  470. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_container.py +0 -0
  471. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_copy_from.py +0 -0
  472. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_copy_to.py +0 -0
  473. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_directory_parity.py +0 -0
  474. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_function_inventory.py +0 -0
  475. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_github.py +0 -0
  476. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_http_client.py +0 -0
  477. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_http_external_location.py +0 -0
  478. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_http_upload_url.py +0 -0
  479. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_macro.py +0 -0
  480. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_overload.py +0 -0
  481. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_protocol_inventory.py +0 -0
  482. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_protocol_version.py +0 -0
  483. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_resumable_scan.py +0 -0
  484. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_scalar.py +0 -0
  485. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  486. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_secret.py +0 -0
  487. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_settings.py +0 -0
  488. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_splits.py +0 -0
  489. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_table.py +0 -0
  490. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_table_in_out.py +0 -0
  491. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_view.py +0 -0
  492. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conformance/test_writable.py +0 -0
  493. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/conftest.py +0 -0
  494. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  495. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  496. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  497. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/bad_version.bin +0 -0
  498. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/generate.py +0 -0
  499. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/manifest.json +0 -0
  500. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  501. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/stale_anchor.bin +0 -0
  502. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/truncated.bin +0 -0
  503. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/valid_sealed.bin +0 -0
  504. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  505. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/projection_reference.py +0 -0
  506. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/repeatability_reference.py +0 -0
  507. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/__init__.py +0 -0
  508. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_bernoulli_function.py +0 -0
  509. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_binary_packet_function.py +0 -0
  510. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_client.py +0 -0
  511. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_conditional_message_function.py +0 -0
  512. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_hash_seed_function.py +0 -0
  513. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  514. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_multiply_function.py +0 -0
  515. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_random_bytes_function.py +0 -0
  516. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scalar/test_return_secret_value_function.py +0 -0
  517. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/scan_truncation_probe.py +0 -0
  518. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/sdk_conformance/__init__.py +0 -0
  519. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/sdk_conformance/test_opaque_sealing.py +0 -0
  520. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/sdk_conformance/test_opaque_sealing_stdio.py +0 -0
  521. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/__init__.py +0 -0
  522. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/__init__.py +0 -0
  523. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_constant_columns_function.py +0 -0
  524. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_double_sequence_function.py +0 -0
  525. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_exception_function.py +0 -0
  526. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_filter_echo_function.py +0 -0
  527. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_logging_function.py +0 -0
  528. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_nested_sequence_function.py +0 -0
  529. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_partitioned_function.py +0 -0
  530. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_projected_data_function.py +0 -0
  531. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_sequence_function.py +0 -0
  532. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_settings_function.py +0 -0
  533. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_struct_settings_function.py +0 -0
  534. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/generator/test_ten_thousand_function.py +0 -0
  535. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table/test_wide_columns.py +0 -0
  536. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/__init__.py +0 -0
  537. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/__init__.py +0 -0
  538. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  539. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_echo_function.py +0 -0
  540. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  541. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  542. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  543. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  544. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  545. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/test_blended_exchange.py +0 -0
  546. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/test_blended_metadata.py +0 -0
  547. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/test_client.py +0 -0
  548. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/test_continuation.py +0 -0
  549. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
  550. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/Dockerfile +0 -0
  551. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/__init__.py +0 -0
  552. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/compose.yaml +0 -0
  553. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/probe.py +0 -0
  554. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/run.sh +0 -0
  555. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/test_worker.py +0 -0
  556. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/tailnet/worker.py +0 -0
  557. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_access_log_audit.py +0 -0
  558. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_aggregate_function.py +0 -0
  559. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_argument_spec.py +0 -0
  560. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_attach_ticket.py +0 -0
  561. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_auth.py +0 -0
  562. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_bind_exceptions.py +0 -0
  563. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_bind_request_at_clause.py +0 -0
  564. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_bound_storage_conformance.py +0 -0
  565. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_cache_control.py +0 -0
  566. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_call_state_attach.py +0 -0
  567. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_catalog_auth_binding.py +0 -0
  568. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_catalog_contract_fixtures.py +0 -0
  569. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_client_oauth.py +0 -0
  570. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_client_reflection.py +0 -0
  571. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_codegen_request_inventory.py +0 -0
  572. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_column_path.py +0 -0
  573. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_copy_from_function.py +0 -0
  574. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_copy_to_function.py +0 -0
  575. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_docstrings.py +0 -0
  576. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_duckdb2_manifest.py +0 -0
  577. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_dynamic_filter_http_turns.py +0 -0
  578. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_error_codes.py +0 -0
  579. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_example_function_arg_types.py +0 -0
  580. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_examples_workers.py +0 -0
  581. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_exception_handling.py +0 -0
  582. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_exceptions.py +0 -0
  583. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_filter_pushdown.py +0 -0
  584. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_filter_pushdown_extension.py +0 -0
  585. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_filter_v2.py +0 -0
  586. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_filter_v2_builder.py +0 -0
  587. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_filter_v2_runtime_corpus.py +0 -0
  588. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_filter_v2_spec_schema.py +0 -0
  589. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_fixture_catalog_parity.py +0 -0
  590. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_shape_mismatch.py +0 -0
  591. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_storage.py +0 -0
  592. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_storage_azure_sql.py +0 -0
  593. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_storage_cf_do.py +0 -0
  594. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_storage_cf_do_integration.py +0 -0
  595. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_storage_conformance.py +0 -0
  596. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_function_subclass_check.py +0 -0
  597. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_constants.py +0 -0
  598. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_nanoarrow.py +0 -0
  599. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_protocol_name.py +0 -0
  600. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_protocol_version.py +0 -0
  601. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_records.py +0 -0
  602. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_request_builders.py +0 -0
  603. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_schemas.py +0 -0
  604. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_cpp_secret.py +0 -0
  605. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_csharp.py +0 -0
  606. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_go_schemas.py +0 -0
  607. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_go_types.py +0 -0
  608. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_java_schemas.py +0 -0
  609. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_java_types.py +0 -0
  610. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_protocol_version.py +0 -0
  611. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_registry.py +0 -0
  612. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_rust_request_builders.py +0 -0
  613. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_rust_schemas.py +0 -0
  614. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_rust_types.py +0 -0
  615. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_schemas_cross_lang.py +0 -0
  616. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_ts_client.py +0 -0
  617. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_ts_schemas.py +0 -0
  618. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_generated_ts_types.py +0 -0
  619. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_grant_auth.py +0 -0
  620. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_hosted_protocols.py +0 -0
  621. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_http_s3_offload_input.py +0 -0
  622. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_http_s3_offload_output.py +0 -0
  623. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_import_side_effects.py +0 -0
  624. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_landing_discovery.py +0 -0
  625. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_launch_transport.py +0 -0
  626. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_logical_types.py +0 -0
  627. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_metadata.py +0 -0
  628. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_mypy_consolidated.py +0 -0
  629. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_nest_tensor.py +0 -0
  630. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_otel.py +0 -0
  631. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_projection_enforcement.py +0 -0
  632. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_projection_expressions.py +0 -0
  633. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_projection_repro.py +0 -0
  634. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_protocol_classes.py +0 -0
  635. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_regen_generated.py +0 -0
  636. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_repeatability.py +0 -0
  637. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_reporting_contracts.py +0 -0
  638. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_reporting_enterprise.py +0 -0
  639. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_reporting_scale.py +0 -0
  640. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_reporting_sources.py +0 -0
  641. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_resolved_secrets.py +0 -0
  642. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_schema_paths_v2.py +0 -0
  643. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_schema_scoped_functions.py +0 -0
  644. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_schema_utils.py +0 -0
  645. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_serve.py +0 -0
  646. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_setting_secret_annotations.py +0 -0
  647. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_signing_key.py +0 -0
  648. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_split_token.py +0 -0
  649. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_subprocess_transport.py +0 -0
  650. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_table_buffering_function.py +0 -0
  651. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_table_function_dynamic_to_string.py +0 -0
  652. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_table_function_early_close.py +0 -0
  653. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_tcp_transport.py +0 -0
  654. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_type_bounds.py +0 -0
  655. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_typed_values.py +0 -0
  656. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_union_argument.py +0 -0
  657. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_wire_record_schema_parity.py +0 -0
  658. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_worker.py +0 -0
  659. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_worker_cli.py +0 -0
  660. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_worker_page.py +0 -0
  661. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/test_write_results.py +0 -0
  662. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/transactor/__init__.py +0 -0
  663. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/transactor/test_protocol_registration.py +0 -0
  664. {vgi_python-0.48.0 → vgi_python-0.48.2}/tests/transactor/test_transactor.py +0 -0
  665. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/__init__.py +0 -0
  666. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_duckdb.py +0 -0
  667. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_redact.py +0 -0
  668. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_storage_profile.py +0 -0
  669. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/__init__.py +0 -0
  670. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  671. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  672. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  673. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  674. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  675. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  676. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  677. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  678. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  679. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  680. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  681. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  682. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  683. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/aggregate/window.py +0 -0
  684. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/attach_options.py +0 -0
  685. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/attach_ticket_vectors.json +0 -0
  686. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/bad_enum.py +0 -0
  687. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/bad_protocol.py +0 -0
  688. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/cancellable.py +0 -0
  689. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/catalog_contents.py +0 -0
  690. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/catalog_publication.py +0 -0
  691. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/companion.py +0 -0
  692. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/constraint_facts.py +0 -0
  693. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/copy_from.py +0 -0
  694. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/copy_to.py +0 -0
  695. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/global_functions.py +0 -0
  696. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/http_server.py +0 -0
  697. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/identity_fixture.py +0 -0
  698. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  699. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  700. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/nest_tensor.py +0 -0
  701. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  702. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  703. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  704. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  705. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/_common.py +0 -0
  706. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  707. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  708. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/binary.py +0 -0
  709. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  710. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/geo.py +0 -0
  711. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  712. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  713. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  714. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  715. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  716. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  717. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  718. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/secret_cache.py +0 -0
  719. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/simple_writable.py +0 -0
  720. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/__init__.py +0 -0
  721. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/_common.py +0 -0
  722. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/batch_index.py +0 -0
  723. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  724. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/cache.py +0 -0
  725. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  726. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/filters.py +0 -0
  727. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  728. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/make_series.py +0 -0
  729. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/misc.py +0 -0
  730. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/order_modes.py +0 -0
  731. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/pairs.py +0 -0
  732. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  733. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  734. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  735. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/required_filters.py +0 -0
  736. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  737. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  738. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/sequence.py +0 -0
  739. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/settings.py +0 -0
  740. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/splits.py +0 -0
  741. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  742. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  743. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  744. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/versioned.py +0 -0
  745. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table/wide.py +0 -0
  746. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table_in_out.py +0 -0
  747. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  748. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/ticket_probe.py +0 -0
  749. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  750. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/versioned.py +0 -0
  751. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/versioned_tables.py +0 -0
  752. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/writable/__init__.py +0 -0
  753. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/writable/generic.py +0 -0
  754. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/writable/table.py +0 -0
  755. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/_test_fixtures/writable/worker.py +0 -0
  756. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/aggregate_function.py +0 -0
  757. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/argument_spec.py +0 -0
  758. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/arguments.py +0 -0
  759. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/attach_capabilities.py +0 -0
  760. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/attach_header.py +0 -0
  761. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/attach_ticket.py +0 -0
  762. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/auth.py +0 -0
  763. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/cache_control.py +0 -0
  764. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/_descriptor_spec.py +0 -0
  765. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/attach_option.py +0 -0
  766. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/column_metadata.py +0 -0
  767. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/contents_codec.py +0 -0
  768. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/contract.py +0 -0
  769. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/dependencies.py +0 -0
  770. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/duckdb_statistics.py +0 -0
  771. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/evaluation_context.py +0 -0
  772. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/layout.py +0 -0
  773. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/macros.py +0 -0
  774. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/metadata_changes.py +0 -0
  775. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/options.py +0 -0
  776. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/query.py +0 -0
  777. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/secret_type.py +0 -0
  778. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/setting.py +0 -0
  779. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/snapshot.py +0 -0
  780. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/catalog/storage.py +0 -0
  781. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/aggregate.py +0 -0
  782. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli.py +0 -0
  783. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli_catalog.py +0 -0
  784. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli_schema.py +0 -0
  785. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli_table.py +0 -0
  786. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli_transaction.py +0 -0
  787. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/cli_view.py +0 -0
  788. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/client.py +0 -0
  789. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/client/errors.py +0 -0
  790. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/__init__.py +0 -0
  791. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/_common.py +0 -0
  792. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/_registry.py +0 -0
  793. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/_registry_backend.py +0 -0
  794. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/catalog_contract_fixtures.py +0 -0
  795. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_constants.py +0 -0
  796. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_protocol_name.py +0 -0
  797. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_protocol_version.py +0 -0
  798. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_records.py +0 -0
  799. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_records_nano.py +0 -0
  800. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_registry.py +0 -0
  801. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_request_builders.py +0 -0
  802. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_schemas.py +0 -0
  803. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_sdk.py +0 -0
  804. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  805. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  806. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/cpp_secret_schemas.py +0 -0
  807. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/csharp_registry.py +0 -0
  808. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/csharp_schemas.py +0 -0
  809. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/csharp_types.py +0 -0
  810. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/go_registry.py +0 -0
  811. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/go_schemas.py +0 -0
  812. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/go_types.py +0 -0
  813. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/java_registry.py +0 -0
  814. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/java_schemas.py +0 -0
  815. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/java_types.py +0 -0
  816. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/protocol_version.py +0 -0
  817. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/rust_registry.py +0 -0
  818. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/rust_request_builders.py +0 -0
  819. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/rust_schemas.py +0 -0
  820. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/rust_types.py +0 -0
  821. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/ts_client.py +0 -0
  822. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/ts_registry.py +0 -0
  823. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/ts_schemas.py +0 -0
  824. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/codegen/ts_types.py +0 -0
  825. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/column_path.py +0 -0
  826. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/copy_from_function.py +0 -0
  827. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/copy_to_function.py +0 -0
  828. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/exceptions.py +0 -0
  829. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/filter_v2.py +0 -0
  830. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/filter_v2_builder.py +0 -0
  831. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/function.py +0 -0
  832. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/function_storage.py +0 -0
  833. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/function_storage_azure_sql.py +0 -0
  834. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/function_storage_cf_do.py +0 -0
  835. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/http/__init__.py +0 -0
  836. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/http/demo_storage.py +0 -0
  837. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/http/landing.html +0 -0
  838. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/http/landing_page.py +0 -0
  839. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/http/vgi-client.js +0 -0
  840. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/http/worker_page.py +0 -0
  841. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/invocation.py +0 -0
  842. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/logging_config.py +0 -0
  843. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/logical_types.py +0 -0
  844. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/meta_worker.py +0 -0
  845. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/metadata.py +0 -0
  846. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/otel.py +0 -0
  847. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/profiling.py +0 -0
  848. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/protocol.py +0 -0
  849. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/protocol_version.txt +0 -0
  850. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/py.typed +0 -0
  851. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/query_execution.py +0 -0
  852. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/query_parameters.py +0 -0
  853. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/query_provider.py +0 -0
  854. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/__init__.py +0 -0
  855. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/_arrow.py +0 -0
  856. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/_enums.py +0 -0
  857. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/_metadata.py +0 -0
  858. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/alerts.py +0 -0
  859. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/common.py +0 -0
  860. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/delegations.py +0 -0
  861. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/discovery.py +0 -0
  862. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/notify.py +0 -0
  863. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/objects.py +0 -0
  864. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/ownership.py +0 -0
  865. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/render.py +0 -0
  866. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/reports.py +0 -0
  867. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/resource_identity.py +0 -0
  868. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/resource_ownership.py +0 -0
  869. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/schedules.py +0 -0
  870. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/schedules_v2.py +0 -0
  871. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/sources.py +0 -0
  872. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/reporting/sql_tasks.py +0 -0
  873. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/rpc_server.py +0 -0
  874. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/scalar_function.py +0 -0
  875. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/schema_path.py +0 -0
  876. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/schema_utils.py +0 -0
  877. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/secret_protocol.py +0 -0
  878. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/secret_service.py +0 -0
  879. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/serve.py +0 -0
  880. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/split_token.py +0 -0
  881. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/table_buffering_function.py +0 -0
  882. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/table_filter_pushdown.py +0 -0
  883. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/table_function.py +0 -0
  884. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/table_in_out_function.py +0 -0
  885. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/transactor/__init__.py +0 -0
  886. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/transactor/_duckdb_compat.py +0 -0
  887. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/transactor/client.py +0 -0
  888. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/transactor/protocol.py +0 -0
  889. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/transactor/server.py +0 -0
  890. {vgi_python-0.48.0 → vgi_python-0.48.2}/vgi/write_results.py +0 -0
  891. {vgi_python-0.48.0 → vgi_python-0.48.2}/wrangler.jsonc +0 -0
@@ -41,10 +41,10 @@ jobs:
41
41
  bun-version: "1.3.14"
42
42
 
43
43
  - name: Install dependencies
44
- run: uv sync --all-extras
44
+ run: uv sync --all-extras --python ${{ matrix.python-version }}
45
45
 
46
46
  - name: Run tests
47
- run: uv run pytest
47
+ run: uv run --python ${{ matrix.python-version }} pytest
48
48
 
49
49
  lint:
50
50
  name: Lint
@@ -147,6 +147,26 @@ jobs:
147
147
  - name: Run hosted-protocols group (stdio, unix, http)
148
148
  run: scripts/hosted_protocols_conformance.sh
149
149
 
150
+ bare-install:
151
+ # Every other job syncs --all-extras, which hides a core-dependency gap: a
152
+ # worker that installs vgi-python with no extras must still import the
153
+ # modules catalog_attach reaches (0.48.0 shipped without pycryptodome).
154
+ name: Bare install (no extras)
155
+ runs-on: ubuntu-latest
156
+ steps:
157
+ - uses: actions/checkout@v7
158
+
159
+ - name: Install uv
160
+ uses: astral-sh/setup-uv@v10.2.0
161
+
162
+ - name: Build wheel
163
+ run: uv build --wheel --out-dir dist .
164
+
165
+ - name: Import attach-path modules from the bare wheel
166
+ run: |
167
+ uv run --isolated --no-project --python 3.14 --with dist/*.whl \
168
+ python -c "import vgi, vgi.worker, vgi.query_execution; print('ok')"
169
+
150
170
  s3-offload-localstack:
151
171
  name: S3 Offload Tests (LocalStack)
152
172
  runs-on: ubuntu-latest
@@ -27,7 +27,7 @@ concurrency:
27
27
  env:
28
28
  # The test suite and native Actions artifact must come from this exact ref.
29
29
  # The downloader verifies its provenance against the checked-out commit.
30
- VGI_REF: a83ff7e8cd46aa840a10e78fe9b31603931824c2
30
+ VGI_REF: 7b1e1fbbe745d77fdacf52d6d135fa3ef4491d48
31
31
  VGI_NATIVE_RUNNER_BRANCH: release/vgi-v3-ci-20261028
32
32
  # CI is not a user: its ATTACHes should not land in Query.Farm's adoption data.
33
33
  # The vgi extension fires a telemetry event per successful ATTACH, and this
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.48.0
3
+ Version: 0.48.2
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
@@ -161,6 +161,7 @@ Requires-Dist: click
161
161
  Requires-Dist: httpx2>=2.12.0
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
+ Requires-Dist: pycryptodome>=3.20
164
165
  Requires-Dist: typer>=0.9
165
166
  Requires-Dist: vgi-rpc>=0.52.3
166
167
  Provides-Extra: azure
@@ -122,9 +122,8 @@ Information about a table:
122
122
  | `name` | `str` | Table name |
123
123
  | `schema_path` | `SchemaPath` | Parent schema path |
124
124
  | `columns` | `SerializedSchema` | Column definitions as Arrow schema bytes |
125
- | `not_null_constraints` | `list[int]` | Column indices with NOT NULL |
126
- | `unique_constraints` | `list[list[int]]` | Column index groups for UNIQUE |
127
- | `check_constraints` | `list[str]` | SQL check expressions |
125
+ | `constraints` | `list[bytes]` | Canonical `ConstraintInfo` records (see [Constraints](#constraints)) |
126
+ | `definition_revision` | `bytes \| None` | Opaque table-definition revision |
128
127
  | `comment` | `str \| None` | Optional description |
129
128
  | `tags` | `dict[str, str]` | Key-value metadata |
130
129
 
@@ -509,7 +508,7 @@ For most use cases, the declarative catalog API provides a simpler way to define
509
508
 
510
509
  ```python
511
510
  from vgi import Worker, TableFunctionGenerator
512
- from vgi.catalog import Catalog, Schema, Table, View
511
+ from vgi.catalog import Catalog, Schema, Table, View, constraint_record
513
512
  ```
514
513
 
515
514
  ### Function-Backed Tables (Recommended)
@@ -527,7 +526,7 @@ class UsersFunction(TableFunctionGenerator):
527
526
  """Generate user data."""
528
527
 
529
528
  FIXED_SCHEMA: ClassVar[pa.Schema] = pa.schema([
530
- ("id", pa.int64()),
529
+ pa.field("id", pa.int64()), # served NOT NULL: the PRIMARY_KEY record below names it
531
530
  ("name", pa.string()),
532
531
  ("active", pa.bool_()),
533
532
  ])
@@ -545,8 +544,16 @@ class UsersFunction(TableFunctionGenerator):
545
544
  users_table = Table(
546
545
  name="users",
547
546
  function=UsersFunction, # Schema derived from FIXED_SCHEMA
548
- not_null=["id"], # Constraint column names validated
549
- unique=[["id"]],
547
+ constraints=( # Paths and nullability validated at definition time
548
+ constraint_record(
549
+ ["main"], "users", "users.id.not_null", "NOT_NULL", [["id"]],
550
+ enforcement="ENFORCED", validation="ALL_ROWS",
551
+ ),
552
+ constraint_record(
553
+ ["main"], "users", "users.id.unique", "UNIQUE", [["id"]],
554
+ enforcement="ENFORCED", validation="ALL_ROWS",
555
+ ),
556
+ ),
550
557
  comment="User accounts",
551
558
  )
552
559
  ```
@@ -593,7 +600,7 @@ if __name__ == "__main__":
593
600
  | Feature | Description |
594
601
  |---------|-------------|
595
602
  | **No schema duplication** | Function-backed tables derive schema automatically |
596
- | **Constraint validation** | `not_null`, `unique` column names validated at definition time |
603
+ | **Constraint validation** | DuckDB's ATTACH rules for records and generated columns checked at definition time |
597
604
  | **Automatic scan handling** | Function-backed tables don't need `table_scan_function_get()` |
598
605
  | **Type safety** | Frozen dataclasses with runtime validation |
599
606
 
@@ -606,16 +613,98 @@ For tables not backed by functions, provide the schema explicitly:
606
613
  config_table = Table(
607
614
  name="config",
608
615
  columns=pa.schema([
609
- ("key", pa.string()),
616
+ pa.field("key", pa.string(), nullable=False),
610
617
  ("value", pa.string()),
611
618
  ]),
612
- not_null=["key"],
613
- unique=[["key"]],
619
+ constraints=(
620
+ constraint_record(
621
+ ["main"], "config", "config.key.pk", "PRIMARY_KEY", [["key"]],
622
+ enforcement="ENFORCED", validation="ALL_ROWS",
623
+ ),
624
+ ),
614
625
  )
615
626
  ```
616
627
 
617
628
  **Note:** Tables with explicit columns require the worker to implement `table_scan_function_get()` to tell DuckDB how to scan the data.
618
629
 
630
+ ### Constraints
631
+
632
+ A table states its constraints as canonical records built with
633
+ `constraint_record()`. Each record is the worker's own attestation — the SDK
634
+ never derives one — so `enforcement` and `validation` are always explicit:
635
+
636
+ ```python
637
+ from vgi.catalog import ReferencedKey, constraint_record
638
+
639
+ constraint_record(
640
+ ["main"], "orders", "orders.customer.fk", "FOREIGN_KEY", [["customer_id"]],
641
+ enforcement="ENFORCED", validation="ALL_ROWS",
642
+ references=ReferencedKey(
643
+ schema_path=["main"], table="customers", columns=[["id"]], constraint_id="customers.pk",
644
+ ),
645
+ )
646
+ constraint_record(
647
+ ["main"], "orders", "orders.amount.check", "CHECK", [],
648
+ enforcement="ENFORCED", validation="ALL_ROWS", check_sql="amount >= 0",
649
+ )
650
+ ```
651
+
652
+ DuckDB rejects a table at ATTACH unless its records follow the extension's
653
+ rules. `Table` checks them at definition time, `ReadOnlyCatalogInterface` checks
654
+ ownership and foreign-key targets across the catalog when it builds its
655
+ registries, and the worker checks every table again when serving it (so a
656
+ custom catalog's own unit tests and RPC calls see the same errors):
657
+
658
+ - Only `ENFORCED` + `ALL_ROWS` records; state one only when every row the
659
+ table can ever return satisfies it.
660
+ - Each record is owned by its table and schema; ids are unique, declared names
661
+ are unique case-insensitively, and there is at most one `PRIMARY_KEY`.
662
+ - Column paths resolve. Only `NOT_NULL` may name a nested struct child;
663
+ `PRIMARY_KEY`, `UNIQUE` and `FOREIGN_KEY` name top-level columns, never the
664
+ `is_row_id` column.
665
+ - A `FOREIGN_KEY` references a served table in the same schema, whose
666
+ `PRIMARY_KEY` or `UNIQUE` record has the referenced id and columns, with
667
+ `MATCH SIMPLE` and `NO_ACTION`/`RESTRICT` actions.
668
+ - A `CHECK` is a single comparison between signed integer or floating-point
669
+ columns and numeric constants, such as `amount >= 0`. The grammar is checked
670
+ with DuckDB's own parser when `haybarn` or `duckdb` is installed.
671
+
672
+ **Nullability is derived, not declared.** DuckDB requires every Arrow field
673
+ (descending through ordinary structs, but not into extension or logical-type
674
+ storage) to be non-nullable exactly when a `NOT_NULL` or `PRIMARY_KEY` record
675
+ names it. The worker serves the schema that way: a non-nullable field no record
676
+ names is served nullable, and a field a record names is served non-nullable.
677
+ Arrow nullability in `columns` or a function's output schema is therefore never
678
+ a constraint claim, and there is nothing to keep in sync by hand.
679
+ `served_table_schema()` shows the schema a table is served with.
680
+
681
+ **Negotiation.** Records are readable only under
682
+ `vgi.constraint.records.read.v1` (plus `vgi.expression.duckdb.scalar.v1` for
683
+ CHECK), and DuckDB writes a constrained table only under
684
+ `vgi.constraint.enforce.v1`. `ReadOnlyCatalogInterface` advertises the read
685
+ profiles when any declared table carries records, and the enforcement profile
686
+ when such a table also has write functions: records on a writable table attest
687
+ that the write functions enforce them. A catalog that serves tables some other
688
+ way returns `catalog_capabilities_for(tables, indexes)` from its
689
+ `catalog_capabilities()` override (`union` it with anything else it
690
+ implements). If enforcement is not negotiated, the worker serves a constrained
691
+ table read-only and logs a warning saying why.
692
+
693
+ The legacy `not_null`, `unique`, `check`, `primary_key` and `foreign_key`
694
+ fields type-check only as `()` and raise when set; `ForeignKeyDef` and
695
+ `ForeignKeyInfo` are deprecated. Replace them with records.
696
+
697
+ ### Generated columns
698
+
699
+ DuckDB reads only VIRTUAL generated columns of type Boolean, int8–int64 or
700
+ string, with no default and no extension type, whose expression uses columns,
701
+ Boolean/integer/string literals, `CAST` to those types, comparisons,
702
+ `AND`/`OR`/`NOT`, `IS [NOT] NULL`, `COALESCE`, `+ - * %`, `||`, `abs`, `lower`
703
+ and `upper`. A generated column must be nullable; one no record names is
704
+ served nullable automatically, and naming it in a `NOT_NULL` or `PRIMARY_KEY`
705
+ record is an error. Legacy `generated_expression` field metadata is translated
706
+ to the canonical record when it is the field's only expression metadata.
707
+
619
708
  ### Validation
620
709
 
621
710
  Declarative catalogs include comprehensive validation:
@@ -627,10 +716,27 @@ Table(name="bad") # ValueError: must specify either 'columns' or 'function'
627
716
  # Error: invalid constraint column
628
717
  Table(
629
718
  name="users",
630
- columns=pa.schema([("id", pa.int64())]),
631
- not_null=["nonexistent"], # ValueError: column 'nonexistent' not found
719
+ columns=pa.schema([pa.field("id", pa.int64(), nullable=False)]),
720
+ constraints=(
721
+ constraint_record(
722
+ ["main"], "users", "nn", "NOT_NULL", [["nonexistent"]],
723
+ enforcement="ENFORCED", validation="ALL_ROWS",
724
+ ), # ValueError: column path ['nonexistent'] is missing
725
+ ),
632
726
  )
633
727
 
728
+ # Error: more than one PRIMARY_KEY record
729
+ Table(
730
+ name="users",
731
+ columns=pa.schema([("id", pa.int64()), ("email", pa.string())]),
732
+ constraints=(
733
+ constraint_record(["main"], "users", "pk1", "PRIMARY_KEY", [["id"]],
734
+ enforcement="ENFORCED", validation="ALL_ROWS"),
735
+ constraint_record(["main"], "users", "pk2", "PRIMARY_KEY", [["email"]],
736
+ enforcement="ENFORCED", validation="ALL_ROWS"),
737
+ ),
738
+ ) # ValueError: Table 'users': more than one PRIMARY_KEY
739
+
634
740
  # Error: default_schema not in schemas
635
741
  Catalog(
636
742
  name="myapp",
@@ -981,6 +1087,12 @@ The current CatalogInterface has the following limitations:
981
1087
  - **Tags**: Cannot be updated after object creation
982
1088
  - **Schema metadata**: Comments and tags cannot be updated on schemas
983
1089
  - **Constraints**: Only NOT NULL can be added/dropped (no ALTER for UNIQUE/CHECK)
1090
+ - **Constrained CREATE TABLE**: `CREATE TABLE` with `NOT NULL`, `PRIMARY KEY`,
1091
+ `UNIQUE`, `CHECK` or `FOREIGN KEY` reaches a catalog only when it advertises
1092
+ `vgi.constraint.create.v1` and `vgi.constraint.enforce.v1`, i.e. when its
1093
+ `table_create()` stores the records and its write paths enforce them. The SDK
1094
+ ships no catalog that does (the in-memory test catalog stores no rows), so
1095
+ such statements are refused with an error naming the missing profile.
984
1096
 
985
1097
  ### Table writes and indexes
986
1098
 
@@ -1005,9 +1117,33 @@ on declarative tables. Table writes do not require the bundled
1005
1117
  [transactor](api/transactor.md); that is an optional database-access service with
1006
1118
  additional engine requirements.
1007
1119
 
1008
- Index metadata can be declared with [`Index`][vgi.catalog.descriptors.Index]. Custom
1009
- catalogs can implement `index_get()`, `index_create()`, and `index_drop()`; support
1010
- depends on the catalog implementation and backing data source.
1120
+ Index metadata can be declared with [`Index`][vgi.catalog.descriptors.Index],
1121
+ building its definition with `index_definition()`:
1122
+
1123
+ ```python test="skip"
1124
+ from vgi.catalog import Index, index_definition
1125
+
1126
+ Index(name="orders_customer", definition=index_definition(["main"], "orders", [["customer_id"]], algorithm="art"))
1127
+ ```
1128
+
1129
+ `ReadOnlyCatalogInterface` advertises `vgi.index.definition.read.v1` when any
1130
+ schema declares an index. Custom catalogs can implement `index_get()`,
1131
+ `index_create()`, and `index_drop()`; support depends on the catalog
1132
+ implementation and backing data source.
1133
+
1134
+ ### Overrides written for older signatures
1135
+
1136
+ vgi.v3 added keyword arguments to several `CatalogInterface` methods
1137
+ (`catalog_attach(client_capabilities=)`, `schema_create(options=)`,
1138
+ `view_create(aliases=, security=, comment=, tags=, column_comments=)`,
1139
+ `table_create(constraint_definitions=, ...)`) and renamed `column_name` to
1140
+ `column_path`. The worker inspects an override's signature and passes only
1141
+ what it accepts, emitting a `DeprecationWarning` (and one log line) when it
1142
+ drops an argument. It drops one only when the value carries nothing the old
1143
+ override could have honoured (`None`, empty, a top-level column path); a
1144
+ barrier view, schema options or a nested column path fail with an error naming
1145
+ the parameter instead of being silently ignored. Update overrides to the
1146
+ current signatures, or accept `**kwargs`.
1011
1147
 
1012
1148
  ---
1013
1149
 
@@ -24,4 +24,4 @@ Methods take direct named arguments, with dataclasses for structured values such
24
24
  | [Notifications](reference/notify.md) | `vgi/reporting/notify.py` |
25
25
  | [Delegations](reference/delegations.md) | `vgi/reporting/delegations.py` |
26
26
 
27
- See [wire behavior](wire-contracts.md) for lifecycle, errors, encoding rules and worker policy. Regenerate these pages with `uv run python scripts/regen_generated.py --only vgi-python`.
27
+ See [wire behavior](README.md#shared-conventions) for lifecycle, errors, encoding rules and worker policy. Regenerate these pages with `uv run python scripts/regen_generated.py --only vgi-python`.
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/alerts.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/common.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/delegations.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/discovery.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/notify.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/objects.py`. Edit the Python module and regenerate this page.
8
8
 
9
- [Behavior specification](../objects.md) · [Shared records](common.md)
9
+ [Shared records](common.md)
10
10
 
11
11
  Protocol `vgi.objects.v1`, version `1.0.0`.
12
12
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/ownership.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/render.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/reports.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/resource_identity.py`. Edit the Python module and regenerate this page.
8
8
 
9
- [Behavior specification](../resource_identity.md) · [Shared records](common.md)
9
+ [Shared records](common.md)
10
10
 
11
11
  Protocol `vgi.resource_identity.v1`, version `1.0.0`.
12
12
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/resource_ownership.py`. Edit the Python module and regenerate this page.
8
8
 
9
- [Behavior specification](../objects.md) · [Shared records](common.md)
9
+ [Shared records](common.md)
10
10
 
11
11
  Protocol `vgi.ownership.v1`, version `1.0.0`.
12
12
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/schedules.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/schedules_v2.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/sources.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by vgi.codegen.reporting_docs; edit vgi/reporting/*.py. -->
4
4
 
5
- [All protocols](../python-contracts.md) · [Wire behavior](../wire-contracts.md)
5
+ [All protocols](../python-contracts.md) · [Wire behavior](../README.md#shared-conventions)
6
6
 
7
7
  Source: `vgi/reporting/sql_tasks.py`. Edit the Python module and regenerate this page.
8
8
 
@@ -75,7 +75,7 @@ class Rates(TableFunctionGenerator[RatesArgs, None]):
75
75
  description = "Exchange rates from a slow upstream, cacheable for 5 minutes"
76
76
 
77
77
  @classmethod
78
- def process(cls, params: ProcessParams[RatesArgs, None], state: None, out: OutputCollector) -> None:
78
+ def process(cls, params: ProcessParams[RatesArgs], state: None, out: OutputCollector) -> None:
79
79
  """Answer the scan — or, if the client's copy is still current, say so."""
80
80
  vgi_out = cast(VgiOutputCollector, out)
81
81
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.48.0"
3
+ version = "0.48.2"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -42,6 +42,10 @@ dependencies = [
42
42
  "platformdirs",
43
43
  "vgi-rpc>=0.52.3",
44
44
  "httpx2>=2.12.0",
45
+ # vgi.query_execution seals execution handles with vgi_rpc.crypto, which
46
+ # imports pycryptodome. vgi-rpc only pulls it in under its `http` extra, but
47
+ # catalog_attach reaches query_execution on every transport (stdio too).
48
+ "pycryptodome>=3.20",
45
49
  ]
46
50
 
47
51
  [project.optional-dependencies]
@@ -79,7 +79,8 @@ def check_inventory(manifest: dict[str, Any], native_root: Path) -> list[str]:
79
79
  source_path = native_root / manifest["sources"]["audit_path"]
80
80
  if not source_path.is_file():
81
81
  return [f"required audit source is missing: {source_path}"]
82
- source = source_path.read_bytes()
82
+ # Hash LF-normalized bytes so a CRLF checkout (Windows) matches the manifest.
83
+ source = source_path.read_bytes().replace(b"\r\n", b"\n")
83
84
  if hashlib.sha256(source).hexdigest() != manifest["sources"]["audit_sha256"]:
84
85
  errors.append("native audit digest changed; reconcile the manifest against the new evidence")
85
86
  rows = audit_rows(source.decode())
@@ -322,7 +322,13 @@ def test_snapshot_rejects_duplicate_keys_labels_and_primary_keys() -> None:
322
322
  )
323
323
 
324
324
 
325
- @pytest.mark.parametrize("value", [b"", "not-bytes", b"x" * (contract.MAX_CONSTRAINT_TOKEN_BYTES + 1)])
325
+ # Explicit ids: an oversized value as the test id overflows PYTEST_CURRENT_TEST,
326
+ # and Windows limits an environment variable to 32,767 characters.
327
+ @pytest.mark.parametrize(
328
+ "value",
329
+ [b"", "not-bytes", b"x" * (contract.MAX_CONSTRAINT_TOKEN_BYTES + 1)],
330
+ ids=["empty", "not-bytes", "over-limit"],
331
+ )
326
332
  def test_revisions_and_owner_tokens_are_nonempty_bounded_bytes(value: bytes | str) -> None:
327
333
  for kwargs in [{"attach_opaque_data": value}, {"expected_revision": value}, {"transaction_opaque_data": value}]:
328
334
  with pytest.raises(ValueError):
@@ -11,14 +11,19 @@ import pyarrow as pa
11
11
  import pytest
12
12
 
13
13
  from vgi.catalog import SchemaObjectType
14
- from vgi.catalog.constraints import ConstraintEnforcement, ConstraintValidation, validate_constraint_schema
14
+ from vgi.catalog.constraints import (
15
+ ConstraintEnforcement,
16
+ ConstraintValidation,
17
+ served_table_schema,
18
+ validate_constraint_records,
19
+ )
15
20
  from vgi.client import Client
16
21
 
17
22
  WORKERS: dict[str, list[str]] = json.loads(os.environ.get("VGI_METADATA_WORKERS", "{}"))
18
23
 
19
24
 
20
25
  @pytest.mark.parametrize("sdk", sorted(WORKERS))
21
- def test_example_constraints_are_explicit_stable_untrusted_records(sdk: str) -> None:
26
+ def test_example_constraints_are_explicit_stable_trusted_records(sdk: str) -> None:
22
27
  with Client(server_path=WORKERS[sdk], worker_limit=1) as client:
23
28
  token = client.catalog_attach(
24
29
  name="example", data_version_spec=None, implementation_version=None
@@ -32,11 +37,11 @@ def test_example_constraints_are_explicit_stable_untrusted_records(sdk: str) ->
32
37
  assert fetched.constraints == listed.constraints
33
38
  infos = fetched.constraint_infos()
34
39
  assert infos, (sdk, name)
35
- assert all(item.enforcement == ConstraintEnforcement.METADATA_ONLY for item in infos)
36
- assert all(item.validation == ConstraintValidation.UNVALIDATED for item in infos)
37
- assert not any(item.trusted for item in infos)
38
- validate_constraint_schema(
39
- pa.ipc.read_schema(pa.py_buffer(fetched.columns)),
40
- [item.definition for item in infos],
41
- trusted=[],
42
- )
40
+ # DuckDB reads only ENFORCED + ALL_ROWS records; anything else fails ATTACH.
41
+ assert all(item.enforcement == ConstraintEnforcement.ENFORCED for item in infos)
42
+ assert all(item.validation == ConstraintValidation.ALL_ROWS for item in infos)
43
+ assert all(item.trusted for item in infos)
44
+ columns = pa.ipc.read_schema(pa.py_buffer(fetched.columns))
45
+ validate_constraint_records(name, columns, infos, schema_path=["data"])
46
+ # Served nullability already equals NOT_NULL/PRIMARY_KEY membership.
47
+ assert served_table_schema(columns, infos).equals(columns, check_metadata=True)
@@ -170,14 +170,27 @@ def test_discovery_never_hides_constraints_and_mutation_requires_revision() -> N
170
170
  Worker._table_for_capabilities(table_info(definition_revision=None), PROFILES)
171
171
 
172
172
 
173
- @pytest.mark.parametrize("trusted", [False, True])
174
- def test_discovery_rejects_nullability_that_does_not_match_trust(trusted: bool) -> None:
175
- info = INFO if trusted else replace(INFO, enforcement=ConstraintEnforcement.METADATA_ONLY)
176
- wrong = pa.schema([pa.field("a.b", pa.int64(), nullable=trusted)])
177
- with pytest.raises(ValueError, match="nullability"):
178
- Worker._table_for_capabilities(
179
- table_info(columns=wrong.serialize().to_pybytes(), constraints=[info.serialize_to_bytes()]), PROFILES
180
- )
173
+ def test_discovery_serves_record_nullability() -> None:
174
+ nullable = pa.schema([pa.field("a.b", pa.int64(), nullable=True)])
175
+ served = Worker._table_for_capabilities(
176
+ table_info(columns=nullable.serialize().to_pybytes(), constraints=[INFO.serialize_to_bytes()]), PROFILES
177
+ )
178
+ assert not pa.ipc.read_schema(pa.py_buffer(served.columns)).field("a.b").nullable
179
+
180
+
181
+ @pytest.mark.parametrize(
182
+ "state",
183
+ [
184
+ {"enforcement": ConstraintEnforcement.METADATA_ONLY},
185
+ {"validation": ConstraintValidation.FUTURE_WRITES},
186
+ {"validation": ConstraintValidation.UNVALIDATED},
187
+ ],
188
+ )
189
+ def test_discovery_rejects_records_duckdb_will_not_read(state: dict[str, Any]) -> None:
190
+ """The extension fails ATTACH unless every record is ENFORCED + ALL_ROWS."""
191
+ info = replace(INFO, **state)
192
+ with pytest.raises(ValueError, match="accepts only ENFORCED \\+ ALL_ROWS"):
193
+ Worker._table_for_capabilities(table_info(constraints=[info.serialize_to_bytes()]), PROFILES)
181
194
 
182
195
 
183
196
  def test_create_checks_negotiation_and_current_support_before_provider(monkeypatch: pytest.MonkeyPatch) -> None: