mainsequence-metatable 0.1.59__tar.gz → 0.1.60.dev91__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.
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/client/metatables-meta-tables/SKILL.md +8 -0
- {mainsequence_metatable-0.1.59/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.60.dev91}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0007-database-enforced-table-access.md +9 -1
- mainsequence_metatable-0.1.60.dev91/docs/adr/api/0026-atomic-statement-lists.md +138 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/index.md +1 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/openapi.json +218 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/reference.md +2 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/tables-and-migrations.md +20 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/query-and-mutate.md +74 -4
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/reference/capabilities.md +2 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/reference/python.md +4 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/mkdocs.yml +1 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/mainsequence_metatable.egg-info/SOURCES.txt +4 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/__init__.py +4 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_sql.py +85 -2
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/transfer.py +1 -1
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/access.py +11 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/contracts.py +2 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/operations.py +20 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/postgresql_access.py +18 -0
- mainsequence_metatable-0.1.60.dev91/src/metatables/api/backend/backends/restricted_sql.py +324 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/sqlite_access.py +6 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/streaming.py +5 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/compiled_sql/v1.py +151 -17
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/models.py +117 -3
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/capabilities.json +38 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/client_signatures.json +4 -0
- mainsequence_metatable-0.1.60.dev91/tests/contracts/test_compiled_statement_lists.py +96 -0
- mainsequence_metatable-0.1.60.dev91/tests/e2e/test_statement_lists.py +225 -0
- mainsequence_metatable-0.1.60.dev91/tests/integrations/test_sqlite_statement_lists.py +190 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/uv.lock +1 -1
- mainsequence_metatable-0.1.59/src/metatables/api/backend/backends/restricted_sql.py +0 -221
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/design-agent-icons-and-motion/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/design-agent-icons-and-motion/agents/openai.yaml +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/design-agent-icons-and-motion/references/metatables-example.html +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/LICENSE +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0023-daily-security-check.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/api/0024-namespace-and-table-access-roles.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/adr/client/0025-application-encrypted-columns.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/auth/team_membership.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/managed_finalize.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/batch_inspection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/access_roles.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/security_check_job.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0013_security_check.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0014_access_roles.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/0015_namespace_creator.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/bootstrap_timing.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/operations/security_check.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/encryption.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/encryption.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/envelope_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/auth/test_team_membership.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/catalog/test_schema_validation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_encryption.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/contracts/test_update_configuration_hash.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_encrypted_columns.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_managed_finalize_unchanged.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_migration_metadata_and_downgrade.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_remaining_client_routes.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_batch_introspection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_bootstrap_lock.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/packaging/test_requirements_export.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_deployment_security.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_incremental_security.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_security_check.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/tests/permissions/test_workload_principals.py +0 -0
|
@@ -168,6 +168,14 @@ access; row/time limits and transaction handling remain in the API. Refer to the
|
|
|
168
168
|
query guide for engine-specific statement/batch behavior. Application DDL belongs
|
|
169
169
|
to the separate migration-provider workflow.
|
|
170
170
|
|
|
171
|
+
A write that must change several tables together on SQLite, where `WITH` holds only
|
|
172
|
+
`SELECT`, is a statement list: `compile_sqlalchemy_statements([...],
|
|
173
|
+
operation=...)` and `MetaTable.execute_transaction(...)`, one API-owned transaction.
|
|
174
|
+
Wrap a check in `GuardedStatement(statement, expect_rows=n or "at_least_one",
|
|
175
|
+
label=...)`; a miss rolls back and raises `MetaTableTransactionGuardError`. Never
|
|
176
|
+
put `COMMIT` or savepoints in a list. PostgreSQL and SQLite only; see the query
|
|
177
|
+
guide's "Several statements in one transaction".
|
|
178
|
+
|
|
171
179
|
To find tables, use `MetaTable.search` as described in the
|
|
172
180
|
[table discovery skill](../metatables-table-discovery/SKILL.md). Legacy convenience
|
|
173
181
|
sharing/label actions are not supported API workflows.
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# ADR 0007: Enforce table grants in the database
|
|
2
2
|
|
|
3
|
+
> Amendment (2026-11-10, [MetaTables #98](https://github.com/mainsequence-projects/MetaTables/issues/98)):
|
|
4
|
+
> [ADR 0026](0026-atomic-statement-lists.md) lets a write carry an ordered list of
|
|
5
|
+
> statements that the API runs in one transaction. One statement per request still holds
|
|
6
|
+
> for each statement: each goes to the driver alone, and after each one the driver must
|
|
7
|
+
> report the API's transaction still open, or the API stops and rolls back. Reads keep
|
|
8
|
+
> one statement.
|
|
9
|
+
|
|
3
10
|
> Amendment (2026-10-19): [ADR 0024](0024-namespace-and-table-access-roles.md) keeps the two
|
|
4
11
|
> privilege sets: `data_viewer` maps to Reader's `SELECT`, `data_writer`, `editor` and `owner`
|
|
5
12
|
> to Writer's privileges, and `metadata_viewer` to none. An admin group role holds write
|
|
@@ -214,7 +221,8 @@ with `SET ROLE` is not safe: caller SQL can switch to another User's role with
|
|
|
214
221
|
`set_config('role', …)`.
|
|
215
222
|
|
|
216
223
|
Each request sends exactly one statement through PostgreSQL's extended query
|
|
217
|
-
protocol, which rejects a second statement such as `COMMIT; DELETE …`.
|
|
224
|
+
protocol, which rejects a second statement such as `COMMIT; DELETE …`. (A write may
|
|
225
|
+
send an ordered list of such statements in one API transaction: see ADR 0026.) Read-only
|
|
218
226
|
requests run in a `READ ONLY` transaction. The API cancels queries that exceed
|
|
219
227
|
their time limit, because callers can change their own timeout settings.
|
|
220
228
|
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# ADR 0026: Atomic statement lists
|
|
2
|
+
|
|
3
|
+
Status: Accepted.
|
|
4
|
+
|
|
5
|
+
Implementation status: implemented on development for 0.1.60. SQLite is tested in
|
|
6
|
+
process, both on a source's own connection and on the local runtime's borrowed request
|
|
7
|
+
transaction. The PostgreSQL path has not been run: its end-to-end test is written but
|
|
8
|
+
skips without the disposable cluster of `scripts/test_postgresql.py`. MySQL and SQL
|
|
9
|
+
Server refuse statement lists.
|
|
10
|
+
|
|
11
|
+
Owner: MetaTables API, with the Python client.
|
|
12
|
+
|
|
13
|
+
Related decisions: [ADR 0007](0007-database-enforced-table-access.md) (the database
|
|
14
|
+
enforces table access; one statement per request),
|
|
15
|
+
[ADR 0012](0012-bounded-data-transfer-and-safe-retries.md) (bounded transfers) and
|
|
16
|
+
[ADR 0022](0022-concurrent-requests-and-connection-reuse.md) (connection reuse).
|
|
17
|
+
Issue: [MetaTables#98](https://github.com/mainsequence-projects/MetaTables/issues/98).
|
|
18
|
+
|
|
19
|
+
## Context
|
|
20
|
+
|
|
21
|
+
Some client writes change several tables and must commit together. ms-markets writes
|
|
22
|
+
an account snapshot as one PostgreSQL statement: data-modifying CTEs upsert the
|
|
23
|
+
parents, delete the old rows and insert the new ones, after a check that every named
|
|
24
|
+
portfolio is still live
|
|
25
|
+
([MainSequenceMarkets#53](https://github.com/mainsequence-projects/MainSequenceMarkets/issues/53)).
|
|
26
|
+
|
|
27
|
+
SQLite, the local runtime, allows only `SELECT` inside `WITH`. On SQLite the write
|
|
28
|
+
must be several statements, but a compiled operation carries one statement and each
|
|
29
|
+
request is its own transaction. Sending the statements as separate operations would
|
|
30
|
+
leave half-written history after a failure, and the portfolio check would no longer
|
|
31
|
+
share the write's transaction.
|
|
32
|
+
|
|
33
|
+
## Decision
|
|
34
|
+
|
|
35
|
+
### A write may carry an ordered list of statements
|
|
36
|
+
|
|
37
|
+
`POST /meta-tables/execute-transaction/` accepts `compiled-sql.v1` with `statements`,
|
|
38
|
+
a list of 1 to 32 compiled statements, and a write operation (`insert`, `update`,
|
|
39
|
+
`delete` or `upsert`). The API opens one write transaction as the caller's own write
|
|
40
|
+
identity and sends the statements in order. It commits after the last statement and
|
|
41
|
+
rolls back on any error. The response has the shape of `execute-operation` and holds
|
|
42
|
+
the last statement's rows.
|
|
43
|
+
|
|
44
|
+
Statements do not pass values to each other. A later statement finds what an earlier
|
|
45
|
+
one wrote by its key, in the same transaction.
|
|
46
|
+
|
|
47
|
+
The client compiles the list with `compile_sqlalchemy_statements` and sends it with
|
|
48
|
+
`MetaTable.execute_transaction`.
|
|
49
|
+
|
|
50
|
+
### A statement may expect a row count
|
|
51
|
+
|
|
52
|
+
A statement may carry `expect_rows`: an exact count, or `"at_least_one"`. The count is
|
|
53
|
+
the statement's result rows, or the rows it changed when it returns none. When a
|
|
54
|
+
statement misses its expectation, the API rolls back the whole transaction and answers
|
|
55
|
+
409 with code `compiled_sql_guard_failed`, the statement's index and its optional
|
|
56
|
+
`label`. The client raises `MetaTableTransactionGuardError`.
|
|
57
|
+
|
|
58
|
+
A single PostgreSQL statement can hold such a check in a `WHERE`. Separate statements
|
|
59
|
+
cannot abort a later one from SQL in a way that works on every engine and that the
|
|
60
|
+
caller can tell from a database error, so the check is part of the request.
|
|
61
|
+
|
|
62
|
+
### ADR 0007's boundary holds without reading the SQL
|
|
63
|
+
|
|
64
|
+
ADR 0007 sends one statement per request so caller SQL cannot end the API's
|
|
65
|
+
transaction and go on outside it, as in `COMMIT; DELETE …`. A statement list keeps
|
|
66
|
+
that rule for each statement: each goes to the driver alone, through the same
|
|
67
|
+
restricted path as `execute-operation`, so PostgreSQL's extended query protocol and
|
|
68
|
+
Python's `sqlite3` still reject a second statement in one string.
|
|
69
|
+
|
|
70
|
+
Between statements, the API asks the driver whether its transaction is still open:
|
|
71
|
+
|
|
72
|
+
- **SQLite:** `sqlite3.Connection.in_transaction`. The engine authorizer already
|
|
73
|
+
denies `BEGIN`, `COMMIT`, `ROLLBACK` and savepoints, so this check is a second line.
|
|
74
|
+
- **PostgreSQL:** the connection's transaction status must be "in transaction", and
|
|
75
|
+
the statement's command tag must not be transaction control (`BEGIN`, `COMMIT`,
|
|
76
|
+
`ROLLBACK`, `SAVEPOINT`, `RELEASE`, `PREPARE TRANSACTION` and the prepared forms).
|
|
77
|
+
The tag is needed because `COMMIT AND CHAIN` leaves a new transaction open, without
|
|
78
|
+
the API's settings.
|
|
79
|
+
|
|
80
|
+
Both answers come from the driver and the server, not from the SQL text. When the
|
|
81
|
+
check fails, the API stops before the next statement, rolls back what is still open
|
|
82
|
+
and answers 400 with `compiled_sql_transaction_ended`. On PostgreSQL a caller's
|
|
83
|
+
`COMMIT` has already committed the statements before it; the API cannot undo that.
|
|
84
|
+
The caller loses only its own atomicity: no statement runs after the API's
|
|
85
|
+
transaction ended.
|
|
86
|
+
|
|
87
|
+
Lists are refused for reads, so ADR 0007's `READ ONLY` transaction for reads is
|
|
88
|
+
unchanged.
|
|
89
|
+
|
|
90
|
+
Inside one transaction, a setting one statement makes, such as `SET LOCAL` or
|
|
91
|
+
`set_config('role', …, true)`, applies to the next. This gives no new access: the
|
|
92
|
+
login role is the caller's own and inherits all its memberships (ADR 0007), the API
|
|
93
|
+
enforces the time limit with its own cancellation, and `DISCARD ALL` resets the
|
|
94
|
+
connection before reuse (ADR 0022).
|
|
95
|
+
|
|
96
|
+
### Limits cover the whole list
|
|
97
|
+
|
|
98
|
+
- One time limit, `statement_timeout_ms` (at most 60 seconds), covers every statement:
|
|
99
|
+
SQLite's progress handler and the API's cancellation timer each start once.
|
|
100
|
+
- `max_rows` and `offset` apply to the last statement's rows. Earlier statements'
|
|
101
|
+
rows are counted for their expectations and never returned.
|
|
102
|
+
- A list holds at most 32 statements, and the request body stays within the transfer
|
|
103
|
+
limits of ADR 0012.
|
|
104
|
+
|
|
105
|
+
### Engines
|
|
106
|
+
|
|
107
|
+
SQLite and PostgreSQL, including TimescaleDB, run statement lists. On SQLite a source
|
|
108
|
+
either opens its own connection, with `BEGIN IMMEDIATE` and a commit at the end, or
|
|
109
|
+
borrows the request's catalog transaction, as the local runtime does; there the
|
|
110
|
+
request's commit or rollback decides.
|
|
111
|
+
|
|
112
|
+
MySQL and SQL Server refuse a list with 422 and `compiled_sql_statement_list_unsupported`.
|
|
113
|
+
DDL in MySQL commits implicitly, and a SQL Server batch can commit before a later
|
|
114
|
+
error, so each needs its own design.
|
|
115
|
+
|
|
116
|
+
### The compiler refuses CTEs SQLite cannot run
|
|
117
|
+
|
|
118
|
+
`compile_sqlalchemy_statement` raises `ValueError` when a CTE wraps `INSERT`, `UPDATE`
|
|
119
|
+
or `DELETE` and the dialect is SQLite, MySQL or SQL Server. It inspects the SQLAlchemy
|
|
120
|
+
object, so the error comes at compile time instead of a syntax error from the database.
|
|
121
|
+
|
|
122
|
+
## Alternatives
|
|
123
|
+
|
|
124
|
+
- **Several statements in one SQL string.** The API would have to split the text,
|
|
125
|
+
which is the parsing ADR 0007 removed.
|
|
126
|
+
- **Separate operations in sequence.** Not atomic.
|
|
127
|
+
- **A route for each client's write.** Ties the API to one client's tables.
|
|
128
|
+
- **Guards as SQL that raises.** SQLite raises only inside triggers, and the caller
|
|
129
|
+
could not tell the failure from a database error.
|
|
130
|
+
|
|
131
|
+
## Consequences
|
|
132
|
+
|
|
133
|
+
- Clients write several tables atomically on the local runtime with the same code
|
|
134
|
+
path they use on PostgreSQL, sending a list where PostgreSQL takes one statement.
|
|
135
|
+
- A PostgreSQL client that puts `COMMIT` in a list loses its own atomicity and gets
|
|
136
|
+
`compiled_sql_transaction_ended`.
|
|
137
|
+
- The API holds one write transaction for up to the whole time limit, as a long single
|
|
138
|
+
statement already can.
|
|
@@ -43,6 +43,7 @@ decisions belong in the SDK repository and are linked as dependencies.
|
|
|
43
43
|
| [0022: Concurrent requests per pod and reused database connections](api/0022-concurrent-requests-and-connection-reuse.md) | Accepted; implemented on development; deployment and load verification pending | One number per pod sizes its threads, data-request admission, catalog pool and login-role connections; connections are reused only by the role that opened them, and maximum pods × 3T stays within the database's connection limit. |
|
|
44
44
|
| [0023: A daily security check instead of a sweep in every deployment](api/0023-daily-security-check.md) | Accepted; implemented on development; deployment and first scheduled run pending | A deployment sets up only what the new release needs; a daily Job, which administrators can also start, repairs whatever differs from the plan without pausing caller SQL and records its outcome. |
|
|
45
45
|
| [0024: Access roles for namespaces and tables](api/0024-namespace-and-table-access-roles.md) | Accepted; implemented on development (API and Admin); hosted deployment pending | Actions and roles (`metadata_viewer`, `data_viewer`, `data_writer`, `editor`, `owner`) replace Reader/Writer; `namespaces.create` and `tables.create` are checked on the parent, the creator of a namespace owns it, admins hold every action, workloads use access but never manage it, and an ordinary user deploys a new application without an admin. |
|
|
46
|
+
| [0026: Atomic statement lists](api/0026-atomic-statement-lists.md) | Accepted; implemented on development for 0.1.60; SQLite tested, PostgreSQL not yet run | A write may carry up to 32 compiled statements that the API runs in order in one transaction it owns, with optional row expectations; each statement is sent alone and the driver must report the transaction still open after it, so ADR 0007's boundary holds without parsing SQL. PostgreSQL and SQLite only. |
|
|
46
47
|
|
|
47
48
|
## Agents
|
|
48
49
|
|
|
@@ -294,6 +294,62 @@
|
|
|
294
294
|
"title": "CompiledOperation",
|
|
295
295
|
"type": "object"
|
|
296
296
|
},
|
|
297
|
+
"CompiledTransaction": {
|
|
298
|
+
"additionalProperties": false,
|
|
299
|
+
"properties": {
|
|
300
|
+
"data_source_uid": {
|
|
301
|
+
"format": "uuid",
|
|
302
|
+
"title": "Data Source Uid",
|
|
303
|
+
"type": "string"
|
|
304
|
+
},
|
|
305
|
+
"dialect": {
|
|
306
|
+
"default": "postgresql",
|
|
307
|
+
"enum": [
|
|
308
|
+
"postgresql",
|
|
309
|
+
"sqlite",
|
|
310
|
+
"mysql",
|
|
311
|
+
"mssql"
|
|
312
|
+
],
|
|
313
|
+
"title": "Dialect",
|
|
314
|
+
"type": "string"
|
|
315
|
+
},
|
|
316
|
+
"limits": {
|
|
317
|
+
"$ref": "#/components/schemas/Limits"
|
|
318
|
+
},
|
|
319
|
+
"operation": {
|
|
320
|
+
"enum": [
|
|
321
|
+
"insert",
|
|
322
|
+
"update",
|
|
323
|
+
"delete",
|
|
324
|
+
"upsert"
|
|
325
|
+
],
|
|
326
|
+
"title": "Operation",
|
|
327
|
+
"type": "string"
|
|
328
|
+
},
|
|
329
|
+
"statements": {
|
|
330
|
+
"items": {
|
|
331
|
+
"$ref": "#/components/schemas/TransactionStatement"
|
|
332
|
+
},
|
|
333
|
+
"maxItems": 32,
|
|
334
|
+
"minItems": 1,
|
|
335
|
+
"title": "Statements",
|
|
336
|
+
"type": "array"
|
|
337
|
+
},
|
|
338
|
+
"version": {
|
|
339
|
+
"const": "compiled-sql.v1",
|
|
340
|
+
"default": "compiled-sql.v1",
|
|
341
|
+
"title": "Version",
|
|
342
|
+
"type": "string"
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"required": [
|
|
346
|
+
"operation",
|
|
347
|
+
"statements",
|
|
348
|
+
"data_source_uid"
|
|
349
|
+
],
|
|
350
|
+
"title": "CompiledTransaction",
|
|
351
|
+
"type": "object"
|
|
352
|
+
},
|
|
297
353
|
"CompressedStatistics": {
|
|
298
354
|
"properties": {
|
|
299
355
|
"data": {
|
|
@@ -4580,6 +4636,88 @@
|
|
|
4580
4636
|
"title": "TimescaleTablePolicies",
|
|
4581
4637
|
"type": "object"
|
|
4582
4638
|
},
|
|
4639
|
+
"TransactionStatement": {
|
|
4640
|
+
"additionalProperties": false,
|
|
4641
|
+
"properties": {
|
|
4642
|
+
"expect_rows": {
|
|
4643
|
+
"anyOf": [
|
|
4644
|
+
{
|
|
4645
|
+
"minimum": 0.0,
|
|
4646
|
+
"type": "integer"
|
|
4647
|
+
},
|
|
4648
|
+
{
|
|
4649
|
+
"const": "at_least_one",
|
|
4650
|
+
"type": "string"
|
|
4651
|
+
},
|
|
4652
|
+
{
|
|
4653
|
+
"type": "null"
|
|
4654
|
+
}
|
|
4655
|
+
],
|
|
4656
|
+
"title": "Expect Rows"
|
|
4657
|
+
},
|
|
4658
|
+
"label": {
|
|
4659
|
+
"anyOf": [
|
|
4660
|
+
{
|
|
4661
|
+
"maxLength": 200,
|
|
4662
|
+
"minLength": 1,
|
|
4663
|
+
"type": "string"
|
|
4664
|
+
},
|
|
4665
|
+
{
|
|
4666
|
+
"type": "null"
|
|
4667
|
+
}
|
|
4668
|
+
],
|
|
4669
|
+
"title": "Label"
|
|
4670
|
+
},
|
|
4671
|
+
"parameter_types": {
|
|
4672
|
+
"anyOf": [
|
|
4673
|
+
{
|
|
4674
|
+
"additionalProperties": {
|
|
4675
|
+
"type": "string"
|
|
4676
|
+
},
|
|
4677
|
+
"type": "object"
|
|
4678
|
+
},
|
|
4679
|
+
{
|
|
4680
|
+
"type": "null"
|
|
4681
|
+
}
|
|
4682
|
+
],
|
|
4683
|
+
"title": "Parameter Types"
|
|
4684
|
+
},
|
|
4685
|
+
"parameters": {
|
|
4686
|
+
"anyOf": [
|
|
4687
|
+
{
|
|
4688
|
+
"additionalProperties": true,
|
|
4689
|
+
"type": "object"
|
|
4690
|
+
},
|
|
4691
|
+
{
|
|
4692
|
+
"items": {},
|
|
4693
|
+
"type": "array"
|
|
4694
|
+
}
|
|
4695
|
+
],
|
|
4696
|
+
"title": "Parameters"
|
|
4697
|
+
},
|
|
4698
|
+
"paramstyle": {
|
|
4699
|
+
"default": "pyformat",
|
|
4700
|
+
"enum": [
|
|
4701
|
+
"pyformat",
|
|
4702
|
+
"named",
|
|
4703
|
+
"qmark"
|
|
4704
|
+
],
|
|
4705
|
+
"title": "Paramstyle",
|
|
4706
|
+
"type": "string"
|
|
4707
|
+
},
|
|
4708
|
+
"sql": {
|
|
4709
|
+
"maxLength": 1000000,
|
|
4710
|
+
"minLength": 1,
|
|
4711
|
+
"title": "Sql",
|
|
4712
|
+
"type": "string"
|
|
4713
|
+
}
|
|
4714
|
+
},
|
|
4715
|
+
"required": [
|
|
4716
|
+
"sql"
|
|
4717
|
+
],
|
|
4718
|
+
"title": "TransactionStatement",
|
|
4719
|
+
"type": "object"
|
|
4720
|
+
},
|
|
4583
4721
|
"TransferLimits": {
|
|
4584
4722
|
"properties": {
|
|
4585
4723
|
"chunk_receipts": {
|
|
@@ -5750,6 +5888,46 @@
|
|
|
5750
5888
|
]
|
|
5751
5889
|
}
|
|
5752
5890
|
},
|
|
5891
|
+
"/meta-tables/execute-transaction/": {
|
|
5892
|
+
"post": {
|
|
5893
|
+
"description": "Run compiled statements in order in one API-owned transaction (ADR 0026).\n\nThe API commits after the last statement and rolls back on any error, on a\nstatement that misses its ``expect_rows`` (409 ``compiled_sql_guard_failed``) and\non caller SQL that ends or controls the transaction. The last statement's rows\nreturn in the ``execute-operation`` response shape.",
|
|
5894
|
+
"operationId": "execute_transaction_meta_tables_execute_transaction__post",
|
|
5895
|
+
"requestBody": {
|
|
5896
|
+
"content": {
|
|
5897
|
+
"application/json": {
|
|
5898
|
+
"schema": {
|
|
5899
|
+
"$ref": "#/components/schemas/CompiledTransaction"
|
|
5900
|
+
}
|
|
5901
|
+
}
|
|
5902
|
+
},
|
|
5903
|
+
"required": true
|
|
5904
|
+
},
|
|
5905
|
+
"responses": {
|
|
5906
|
+
"200": {
|
|
5907
|
+
"content": {
|
|
5908
|
+
"application/json": {
|
|
5909
|
+
"schema": {}
|
|
5910
|
+
}
|
|
5911
|
+
},
|
|
5912
|
+
"description": "Successful Response"
|
|
5913
|
+
},
|
|
5914
|
+
"422": {
|
|
5915
|
+
"content": {
|
|
5916
|
+
"application/json": {
|
|
5917
|
+
"schema": {
|
|
5918
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
5919
|
+
}
|
|
5920
|
+
}
|
|
5921
|
+
},
|
|
5922
|
+
"description": "Validation Error"
|
|
5923
|
+
}
|
|
5924
|
+
},
|
|
5925
|
+
"summary": "Execute Transaction",
|
|
5926
|
+
"tags": [
|
|
5927
|
+
"MetaTables"
|
|
5928
|
+
]
|
|
5929
|
+
}
|
|
5930
|
+
},
|
|
5753
5931
|
"/meta-tables/filter/": {
|
|
5754
5932
|
"post": {
|
|
5755
5933
|
"operationId": "filter_meta_tables_meta_tables_filter__post",
|
|
@@ -8841,6 +9019,46 @@
|
|
|
8841
9019
|
]
|
|
8842
9020
|
}
|
|
8843
9021
|
},
|
|
9022
|
+
"/time-index-meta-tables/execute-transaction/": {
|
|
9023
|
+
"post": {
|
|
9024
|
+
"description": "Run compiled statements in order in one API-owned transaction (ADR 0026).\n\nThe API commits after the last statement and rolls back on any error, on a\nstatement that misses its ``expect_rows`` (409 ``compiled_sql_guard_failed``) and\non caller SQL that ends or controls the transaction. The last statement's rows\nreturn in the ``execute-operation`` response shape.",
|
|
9025
|
+
"operationId": "time_index_execute_transaction_time_index_meta_tables_execute_transaction__post",
|
|
9026
|
+
"requestBody": {
|
|
9027
|
+
"content": {
|
|
9028
|
+
"application/json": {
|
|
9029
|
+
"schema": {
|
|
9030
|
+
"$ref": "#/components/schemas/CompiledTransaction"
|
|
9031
|
+
}
|
|
9032
|
+
}
|
|
9033
|
+
},
|
|
9034
|
+
"required": true
|
|
9035
|
+
},
|
|
9036
|
+
"responses": {
|
|
9037
|
+
"200": {
|
|
9038
|
+
"content": {
|
|
9039
|
+
"application/json": {
|
|
9040
|
+
"schema": {}
|
|
9041
|
+
}
|
|
9042
|
+
},
|
|
9043
|
+
"description": "Successful Response"
|
|
9044
|
+
},
|
|
9045
|
+
"422": {
|
|
9046
|
+
"content": {
|
|
9047
|
+
"application/json": {
|
|
9048
|
+
"schema": {
|
|
9049
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
9050
|
+
}
|
|
9051
|
+
}
|
|
9052
|
+
},
|
|
9053
|
+
"description": "Validation Error"
|
|
9054
|
+
}
|
|
9055
|
+
},
|
|
9056
|
+
"summary": "Time Index Execute Transaction",
|
|
9057
|
+
"tags": [
|
|
9058
|
+
"TimeIndexMetaTables"
|
|
9059
|
+
]
|
|
9060
|
+
}
|
|
9061
|
+
},
|
|
8844
9062
|
"/time-index-meta-tables/filter/": {
|
|
8845
9063
|
"post": {
|
|
8846
9064
|
"operationId": "time_index_filter_meta_tables_time_index_meta_tables_filter__post",
|
|
@@ -23,6 +23,7 @@ These methods and paths are mounted by the current application. See the [OpenAPI
|
|
|
23
23
|
| POST | `/meta-tables/` | Reserve Tables | 201 |
|
|
24
24
|
| GET | `/meta-tables/column-search/` | Column Search | 200 |
|
|
25
25
|
| POST | `/meta-tables/execute-operation/` | Execute Operation | 200 |
|
|
26
|
+
| POST | `/meta-tables/execute-transaction/` | Execute Transaction | 200 |
|
|
26
27
|
| POST | `/meta-tables/filter/` | Filter Meta Tables | 200 |
|
|
27
28
|
| POST | `/meta-tables/finalize-managed/` | Finalize Managed | 200 |
|
|
28
29
|
| POST | `/meta-tables/import-from-data-source/` | Import Source | 200 |
|
|
@@ -83,6 +84,7 @@ These methods and paths are mounted by the current application. See the [OpenAPI
|
|
|
83
84
|
| POST | `/time-index-meta-tables/` | Reserve Tables | 201 |
|
|
84
85
|
| GET | `/time-index-meta-tables/column-search/` | Time Index Column Search | 200 |
|
|
85
86
|
| POST | `/time-index-meta-tables/execute-operation/` | Time Index Execute Operation | 200 |
|
|
87
|
+
| POST | `/time-index-meta-tables/execute-transaction/` | Time Index Execute Transaction | 200 |
|
|
86
88
|
| POST | `/time-index-meta-tables/filter/` | Time Index Filter Meta Tables | 200 |
|
|
87
89
|
| POST | `/time-index-meta-tables/finalize-managed/` | Time Index Finalize Managed | 200 |
|
|
88
90
|
| POST | `/time-index-meta-tables/get-data-between-dates-from-table-update/` | Get Data Between Dates From Table Update | 200 |
|
|
@@ -150,6 +150,26 @@ default to 1,000 and are capped at 10,000; time limits default to 15 seconds and
|
|
|
150
150
|
capped at 60 seconds. `operation="select"` selects read mode; the other operation
|
|
151
151
|
labels select write mode. They do not classify SQL.
|
|
152
152
|
|
|
153
|
+
`POST /meta-tables/execute-transaction/` accepts the same fields with `statements`,
|
|
154
|
+
a list of 1 to 32 statements, in place of `statement`, and a write operation
|
|
155
|
+
(`insert`, `update`, `delete` or `upsert`). Each statement may add `expect_rows`
|
|
156
|
+
(an exact count or `"at_least_one"`) and a `label`. The API runs them in order in
|
|
157
|
+
one write transaction, commits after the last and rolls back on any error. It
|
|
158
|
+
returns the last statement's rows in the `execute-operation` shape; the limits cover
|
|
159
|
+
the whole list. Its errors:
|
|
160
|
+
|
|
161
|
+
| Status | Code | When |
|
|
162
|
+
| --- | --- | --- |
|
|
163
|
+
| 400 | `compiled_sql_database_error` | A statement failed in the database; the body adds `statement_index` and `label`. |
|
|
164
|
+
| 400 | `compiled_sql_transaction_ended` | Caller SQL ended or controlled the API's transaction (PostgreSQL). |
|
|
165
|
+
| 400 | `sql_deadline_exceeded` | The list ran past its time limit. |
|
|
166
|
+
| 409 | `compiled_sql_guard_failed` | A statement missed `expect_rows`; the body adds `statement_index`, `label`, `expect_rows` and `row_count`. |
|
|
167
|
+
| 422 | `compiled_sql_statement_list_unsupported` | The DataSource is MySQL or SQL Server. |
|
|
168
|
+
| 422 | `compiled_sql_dialect_mismatch` | A statement's dialect or paramstyle differs from the DataSource's. |
|
|
169
|
+
| 422 | (request validation) | A read operation, an empty or longer list, or an invalid `expect_rows`. |
|
|
170
|
+
|
|
171
|
+
See [ADR 0026](../adr/api/0026-atomic-statement-lists.md).
|
|
172
|
+
|
|
153
173
|
`POST /meta-tables/run-query/` accepts `{"data_source_uid": "…", "sql": "…"}` and
|
|
154
174
|
optional `limits`. It uses the same restricted execution path in read mode and
|
|
155
175
|
returns the `ok/results/truncated/max_rows/row_count/error` success envelope. Errors
|
|
@@ -63,10 +63,80 @@ version tables. Sharing, schema changes and table deletion remain API operations
|
|
|
63
63
|
|
|
64
64
|
Bind values instead of interpolating user input. Requests have row and time limits.
|
|
65
65
|
A full page indicates that more rows may exist. PostgreSQL, SQLite and MySQL reject
|
|
66
|
-
multiple statements. SQL Server accepts a batch under the same
|
|
67
|
-
an explicit commit inside a write batch can persist writes
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
multiple statements in one SQL string. SQL Server accepts a batch under the same
|
|
67
|
+
restricted identity; an explicit commit inside a write batch can persist writes
|
|
68
|
+
before a later error. To write several statements atomically, send a
|
|
69
|
+
[statement list](#several-statements-in-one-transaction). Use the supported table
|
|
70
|
+
operations when an operation needs their journal guarantees. See
|
|
71
|
+
[database access](../security/index.md#sql-and-schema-boundary).
|
|
72
|
+
|
|
73
|
+
Only PostgreSQL runs `INSERT`, `UPDATE` or `DELETE` inside `WITH`. For SQLite, MySQL
|
|
74
|
+
and SQL Server, `compile_sqlalchemy_statement` raises `ValueError` when a CTE wraps
|
|
75
|
+
one, instead of returning SQL the database rejects when it runs.
|
|
76
|
+
|
|
77
|
+
## Several statements in one transaction
|
|
78
|
+
|
|
79
|
+
A write that changes several tables together, such as a snapshot header and its
|
|
80
|
+
rows, can be one PostgreSQL statement with data-modifying CTEs. SQLite cannot run
|
|
81
|
+
that. Send the steps as a statement list instead: the API runs them in order in one
|
|
82
|
+
transaction it owns, commits after the last one and rolls back all of them on any
|
|
83
|
+
error ([ADR 0026](../adr/api/0026-atomic-statement-lists.md)).
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from sqlalchemy import delete, insert, select
|
|
87
|
+
|
|
88
|
+
from metatables import MetaTable, MetaTableTransactionGuardError
|
|
89
|
+
from metatables.compiled_sql.v1 import (
|
|
90
|
+
GuardedStatement,
|
|
91
|
+
compile_sqlalchemy_statements,
|
|
92
|
+
dialect_upsert,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
transaction = compile_sqlalchemy_statements(
|
|
96
|
+
[
|
|
97
|
+
GuardedStatement(
|
|
98
|
+
select(portfolio.c.uid).where(
|
|
99
|
+
portfolio.c.uid.in_(portfolio_uids), portfolio.c.retired_at.is_(None)
|
|
100
|
+
),
|
|
101
|
+
expect_rows=len(portfolio_uids),
|
|
102
|
+
label="live_portfolios",
|
|
103
|
+
),
|
|
104
|
+
dialect_upsert(snapshot, header, key_columns=["account_uid", "as_of"]),
|
|
105
|
+
delete(holding).where(holding.c.account_uid == account_uid),
|
|
106
|
+
insert(holding).values(rows).returning(holding.c.symbol),
|
|
107
|
+
],
|
|
108
|
+
operation="upsert",
|
|
109
|
+
)
|
|
110
|
+
try:
|
|
111
|
+
result = MetaTable.execute_transaction(transaction)
|
|
112
|
+
except MetaTableTransactionGuardError as error:
|
|
113
|
+
raise PortfolioRetired(error.label) from error # Nothing was written.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- **Statements.** Each item is a SQLAlchemy statement, or a `GuardedStatement` with
|
|
117
|
+
`expect_rows` and a `label`. A list has 1 to 32 statements. Statements do not
|
|
118
|
+
pass values to each other: a later one finds an earlier one's rows by key.
|
|
119
|
+
- **Guards.** `expect_rows` is an exact count or `"at_least_one"`. The count is the
|
|
120
|
+
statement's result rows, or the rows it changed when it returns none. A miss
|
|
121
|
+
rolls everything back and raises `MetaTableTransactionGuardError`, a subclass of
|
|
122
|
+
the SDK's `ConflictError` (HTTP 409, code `compiled_sql_guard_failed`) with
|
|
123
|
+
`statement_index` (from 0), `label`, `expect_rows` and `row_count`.
|
|
124
|
+
- **Result.** The last statement's rows, in the `execute_operation` response shape.
|
|
125
|
+
`limits` cover the whole list: one time limit for every statement, and `max_rows`
|
|
126
|
+
for the last statement's rows.
|
|
127
|
+
- **Writes only.** `operation` is `insert`, `update`, `delete` or `upsert`; it
|
|
128
|
+
selects the write identity, as in `execute_operation`.
|
|
129
|
+
- **Engines.** PostgreSQL and SQLite, including the local runtime. MySQL and SQL
|
|
130
|
+
Server refuse a list: the compiler raises `ValueError`, and the API answers 422
|
|
131
|
+
with `compiled_sql_statement_list_unsupported`.
|
|
132
|
+
- **Transaction control.** The API owns the transaction. SQLite refuses `COMMIT`,
|
|
133
|
+
`ROLLBACK` and savepoints as unauthorized. On PostgreSQL, a statement that ends or
|
|
134
|
+
controls the transaction stops the list with HTTP 400 and
|
|
135
|
+
`compiled_sql_transaction_ended`; statements before it may already be committed.
|
|
136
|
+
|
|
137
|
+
Other errors keep their `execute_operation` codes. A database error is HTTP 400
|
|
138
|
+
`compiled_sql_database_error`, raised as the SDK's `BadRequestError`; for a list,
|
|
139
|
+
its `payload["detail"]` also names `statement_index` and `label`.
|
|
70
140
|
|
|
71
141
|
## Read another registered source
|
|
72
142
|
|
{mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/reference/capabilities.md
RENAMED
|
@@ -43,6 +43,7 @@ This inventory records the support status of public resource methods and CLI com
|
|
|
43
43
|
| `MetaTable.delete_with_cascade_by_uid` | tested | `POST /meta-tables/{table_uid}/delete-with-cascade/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_cascade_and_inherited_crud` |
|
|
44
44
|
| `MetaTable.destroy_by_uid` | tested | `DELETE /meta-tables/{table_uid}/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_table_delete_client_api.py::test_public_delete_requires_edit_and_journals_physical_drop` |
|
|
45
45
|
| `MetaTable.execute_operation` | tested | `POST /meta-tables/execute-operation/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_sql_and_migration_connection_check_local_scope` |
|
|
46
|
+
| `MetaTable.execute_transaction` | tested | `POST /meta-tables/execute-transaction/` | Writes several compiled statements in one API-owned transaction with optional row expectations (ADR 0026). SQLite tested through the local API and on its own connection; PostgreSQL not yet run; MySQL and SQL Server refuse. Tests: `tests/e2e/test_statement_lists.py::test_snapshot_writes_commit_together_or_not_at_all`, `tests/integrations/test_sqlite_statement_lists.py::test_a_failing_later_statement_rolls_back_every_earlier_write` |
|
|
46
47
|
| `MetaTable.explain` | tested | `GET /meta-tables/{uid}/access/explain/` | Roles on namespaces and tables (ADR 0024) through the access API; changes need set_access or a workload's manager, with revision conflict checks. Tests: `tests/permissions/test_security_api.py::test_public_client_role_roundtrip` |
|
|
47
48
|
| `MetaTable.filter` | implemented | `GET /meta-tables/` | Generic resource operation with a mounted API route. Check route constraints; method-specific evidence is not claimed. |
|
|
48
49
|
| `MetaTable.filter_by_body` | tested | `POST /meta-tables/filter/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_table_filter_client_api.py::test_public_body_filter_hydrates_visible_tables_and_counts_before_page` |
|
|
@@ -110,6 +111,7 @@ This inventory records the support status of public resource methods and CLI com
|
|
|
110
111
|
| `TimeIndexMetaTable.delete_with_cascade_by_uid` | tested | `POST /time-index-meta-tables/{table_uid}/delete-with-cascade/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_cascade_and_inherited_crud` |
|
|
111
112
|
| `TimeIndexMetaTable.destroy_by_uid` | tested | `DELETE /time-index-meta-tables/{table_uid}/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_table_delete_client_api.py::test_public_delete_requires_edit_and_journals_physical_drop` |
|
|
112
113
|
| `TimeIndexMetaTable.execute_operation` | tested | `POST /time-index-meta-tables/execute-operation/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_sql_and_migration_connection_check_local_scope` |
|
|
114
|
+
| `TimeIndexMetaTable.execute_transaction` | tested | `POST /time-index-meta-tables/execute-transaction/` | Writes several compiled statements in one API-owned transaction with optional row expectations (ADR 0026). SQLite tested through the local API and on its own connection; PostgreSQL not yet run; MySQL and SQL Server refuse. Tests: `tests/e2e/test_statement_lists.py::test_snapshot_writes_commit_together_or_not_at_all`, `tests/integrations/test_sqlite_statement_lists.py::test_a_failing_later_statement_rolls_back_every_earlier_write` |
|
|
113
115
|
| `TimeIndexMetaTable.explain` | tested | `GET /meta-tables/{uid}/access/explain/` | Roles on namespaces and tables (ADR 0024) through the access API; changes need set_access or a workload's manager, with revision conflict checks. Tests: `tests/permissions/test_security_api.py::test_public_client_role_roundtrip` |
|
|
114
116
|
| `TimeIndexMetaTable.filter` | implemented | `GET /time-index-meta-tables/` | Generic resource operation with a mounted API route. Check route constraints; method-specific evidence is not claimed. |
|
|
115
117
|
| `TimeIndexMetaTable.filter_by_body` | tested | `POST /time-index-meta-tables/filter/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_table_filter_client_api.py::test_public_body_filter_hydrates_visible_tables_and_counts_before_page` |
|
{mainsequence_metatable-0.1.59 → mainsequence_metatable-0.1.60.dev91}/docs/reference/python.md
RENAMED
|
@@ -43,6 +43,7 @@ Import application APIs from `metatables`. This list is generated from `metatabl
|
|
|
43
43
|
| `MetaTableCompiledSQLDialect` | `typing` | constant |
|
|
44
44
|
| `MetaTableCompiledSQLOperation` | `metatables.models` | class |
|
|
45
45
|
| `MetaTableCompiledSQLParamstyle` | `typing` | constant |
|
|
46
|
+
| `MetaTableCompiledSQLTransaction` | `metatables.models` | class |
|
|
46
47
|
| `MetaTableCompiledSQLVersion` | `typing` | constant |
|
|
47
48
|
| `MetaTableContract` | `metatables.models` | class |
|
|
48
49
|
| `MetaTableForeignKeyPayload` | `metatables.models` | class |
|
|
@@ -61,7 +62,10 @@ Import application APIs from `metatables`. This list is generated from `metatabl
|
|
|
61
62
|
| `MetaTableRequestFields` | `metatables.models` | class |
|
|
62
63
|
| `MetaTableSchemaManagementMode` | `typing` | constant |
|
|
63
64
|
| `MetaTableStatementPayload` | `metatables.models` | class |
|
|
65
|
+
| `MetaTableTransactionGuardError` | `metatables.models` | class |
|
|
66
|
+
| `MetaTableTransactionStatement` | `metatables.models` | class |
|
|
64
67
|
| `MetaTableValidateContractRequest` | `metatables.models` | class |
|
|
68
|
+
| `MetaTableWriteOperation` | `typing` | constant |
|
|
65
69
|
| `Namespace` | `metatables.models` | class |
|
|
66
70
|
| `POSTGRES_IDENTIFIER_MAX_LENGTH` | `metatables` | constant |
|
|
67
71
|
| `PlatformManagedMetaTable` | `metatables.sqlalchemy_contracts` | class |
|
|
@@ -89,6 +89,7 @@ nav:
|
|
|
89
89
|
- "0022: Concurrent requests and connection reuse": adr/api/0022-concurrent-requests-and-connection-reuse.md
|
|
90
90
|
- "0023: Daily security check": adr/api/0023-daily-security-check.md
|
|
91
91
|
- "0024: Namespace and table access roles": adr/api/0024-namespace-and-table-access-roles.md
|
|
92
|
+
- "0026: Atomic statement lists": adr/api/0026-atomic-statement-lists.md
|
|
92
93
|
- Agents:
|
|
93
94
|
- "0019: MetaTables Analyst agent": adr/agent/0019-metatables-analyst-agent.md
|
|
94
95
|
- "0020: The Analyst reads as its requester": adr/agent/0020-analyst-reads-as-its-requester.md
|