sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
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.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""CockroachDB-specific data dictionary for metadata queries."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from mypy_extensions import mypyc_attr
|
|
6
|
+
|
|
7
|
+
from sqlspec.driver import AsyncDataDictionaryBase, SyncDataDictionaryBase
|
|
8
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgAsyncDriver, CockroachPsycopgSyncDriver
|
|
12
|
+
|
|
13
|
+
__all__ = ("CockroachPsycopgAsyncDataDictionary", "CockroachPsycopgSyncDataDictionary")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
17
|
+
class CockroachPsycopgSyncDataDictionary(SyncDataDictionaryBase):
|
|
18
|
+
"""CockroachDB sync data dictionary."""
|
|
19
|
+
|
|
20
|
+
dialect: ClassVar[str] = "cockroachdb"
|
|
21
|
+
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
def get_version(self, driver: "CockroachPsycopgSyncDriver") -> "VersionInfo | None":
|
|
26
|
+
"""Get CockroachDB version information."""
|
|
27
|
+
driver_id = id(driver)
|
|
28
|
+
if driver_id in self._version_fetch_attempted:
|
|
29
|
+
return self._version_cache.get(driver_id)
|
|
30
|
+
|
|
31
|
+
version_value = driver.select_value_or_none(self.get_query("version"))
|
|
32
|
+
if not version_value:
|
|
33
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
34
|
+
self.cache_version(driver_id, None)
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
|
|
38
|
+
if version_info is None:
|
|
39
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
40
|
+
self.cache_version(driver_id, None)
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
44
|
+
self.cache_version(driver_id, version_info)
|
|
45
|
+
return version_info
|
|
46
|
+
|
|
47
|
+
def get_feature_flag(self, driver: "CockroachPsycopgSyncDriver", feature: str) -> bool:
|
|
48
|
+
"""Check if CockroachDB supports a specific feature."""
|
|
49
|
+
version_info = self.get_version(driver)
|
|
50
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
51
|
+
|
|
52
|
+
def get_optimal_type(self, driver: "CockroachPsycopgSyncDriver", type_category: str) -> str:
|
|
53
|
+
"""Get optimal CockroachDB type for a category."""
|
|
54
|
+
config = self.get_dialect_config()
|
|
55
|
+
return config.get_optimal_type(type_category)
|
|
56
|
+
|
|
57
|
+
def get_tables(self, driver: "CockroachPsycopgSyncDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
58
|
+
"""Get tables sorted by dependency order."""
|
|
59
|
+
schema_name = self.resolve_schema(schema)
|
|
60
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
61
|
+
return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata)
|
|
62
|
+
|
|
63
|
+
def get_columns(
|
|
64
|
+
self, driver: "CockroachPsycopgSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
65
|
+
) -> "list[ColumnMetadata]":
|
|
66
|
+
"""Get column information for a table or schema."""
|
|
67
|
+
schema_name = self.resolve_schema(schema)
|
|
68
|
+
if table is None:
|
|
69
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
70
|
+
return driver.select(
|
|
71
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
75
|
+
return driver.select(
|
|
76
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
def get_indexes(
|
|
80
|
+
self, driver: "CockroachPsycopgSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
81
|
+
) -> "list[IndexMetadata]":
|
|
82
|
+
"""Get index metadata for a table or schema."""
|
|
83
|
+
schema_name = self.resolve_schema(schema)
|
|
84
|
+
if table is None:
|
|
85
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
86
|
+
return driver.select(
|
|
87
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
91
|
+
return driver.select(
|
|
92
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def get_foreign_keys(
|
|
96
|
+
self, driver: "CockroachPsycopgSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
97
|
+
) -> "list[ForeignKeyMetadata]":
|
|
98
|
+
"""Get foreign key metadata."""
|
|
99
|
+
schema_name = self.resolve_schema(schema)
|
|
100
|
+
if table is None:
|
|
101
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
102
|
+
return driver.select(
|
|
103
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
107
|
+
return driver.select(
|
|
108
|
+
self.get_query("foreign_keys_by_table"),
|
|
109
|
+
table_name=table,
|
|
110
|
+
schema_name=schema_name,
|
|
111
|
+
schema_type=ForeignKeyMetadata,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
116
|
+
class CockroachPsycopgAsyncDataDictionary(AsyncDataDictionaryBase):
|
|
117
|
+
"""CockroachDB async data dictionary."""
|
|
118
|
+
|
|
119
|
+
dialect: ClassVar[str] = "cockroachdb"
|
|
120
|
+
|
|
121
|
+
def __init__(self) -> None:
|
|
122
|
+
super().__init__()
|
|
123
|
+
|
|
124
|
+
async def get_version(self, driver: "CockroachPsycopgAsyncDriver") -> "VersionInfo | None":
|
|
125
|
+
"""Get CockroachDB version information."""
|
|
126
|
+
driver_id = id(driver)
|
|
127
|
+
if driver_id in self._version_fetch_attempted:
|
|
128
|
+
return self._version_cache.get(driver_id)
|
|
129
|
+
|
|
130
|
+
version_value = await driver.select_value_or_none(self.get_query("version"))
|
|
131
|
+
if not version_value:
|
|
132
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
133
|
+
self.cache_version(driver_id, None)
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
|
|
137
|
+
if version_info is None:
|
|
138
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
139
|
+
self.cache_version(driver_id, None)
|
|
140
|
+
return None
|
|
141
|
+
|
|
142
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
143
|
+
self.cache_version(driver_id, version_info)
|
|
144
|
+
return version_info
|
|
145
|
+
|
|
146
|
+
async def get_feature_flag(self, driver: "CockroachPsycopgAsyncDriver", feature: str) -> bool:
|
|
147
|
+
"""Check if CockroachDB supports a specific feature."""
|
|
148
|
+
version_info = await self.get_version(driver)
|
|
149
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
150
|
+
|
|
151
|
+
async def get_optimal_type(self, driver: "CockroachPsycopgAsyncDriver", type_category: str) -> str:
|
|
152
|
+
"""Get optimal CockroachDB type for a category."""
|
|
153
|
+
config = self.get_dialect_config()
|
|
154
|
+
return config.get_optimal_type(type_category)
|
|
155
|
+
|
|
156
|
+
async def get_tables(
|
|
157
|
+
self, driver: "CockroachPsycopgAsyncDriver", schema: "str | None" = None
|
|
158
|
+
) -> "list[TableMetadata]":
|
|
159
|
+
"""Get tables sorted by dependency order."""
|
|
160
|
+
schema_name = self.resolve_schema(schema)
|
|
161
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
162
|
+
return await driver.select(
|
|
163
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
async def get_columns(
|
|
167
|
+
self, driver: "CockroachPsycopgAsyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
168
|
+
) -> "list[ColumnMetadata]":
|
|
169
|
+
"""Get column information for a table or schema."""
|
|
170
|
+
schema_name = self.resolve_schema(schema)
|
|
171
|
+
if table is None:
|
|
172
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
173
|
+
return await driver.select(
|
|
174
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
178
|
+
return await driver.select(
|
|
179
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
async def get_indexes(
|
|
183
|
+
self, driver: "CockroachPsycopgAsyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
184
|
+
) -> "list[IndexMetadata]":
|
|
185
|
+
"""Get index metadata for a table or schema."""
|
|
186
|
+
schema_name = self.resolve_schema(schema)
|
|
187
|
+
if table is None:
|
|
188
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
189
|
+
return await driver.select(
|
|
190
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
194
|
+
return await driver.select(
|
|
195
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
async def get_foreign_keys(
|
|
199
|
+
self, driver: "CockroachPsycopgAsyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
200
|
+
) -> "list[ForeignKeyMetadata]":
|
|
201
|
+
"""Get foreign key metadata."""
|
|
202
|
+
schema_name = self.resolve_schema(schema)
|
|
203
|
+
if table is None:
|
|
204
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
205
|
+
return await driver.select(
|
|
206
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
210
|
+
return await driver.select(
|
|
211
|
+
self.get_query("foreign_keys_by_table"),
|
|
212
|
+
table_name=table,
|
|
213
|
+
schema_name=schema_name,
|
|
214
|
+
schema_type=ForeignKeyMetadata,
|
|
215
|
+
)
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""CockroachDB psycopg driver implementation."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
import time
|
|
6
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
7
|
+
|
|
8
|
+
import psycopg
|
|
9
|
+
|
|
10
|
+
from sqlspec.adapters.cockroach_psycopg._typing import (
|
|
11
|
+
CockroachAsyncConnection,
|
|
12
|
+
CockroachPsycopgAsyncSessionContext,
|
|
13
|
+
CockroachPsycopgSyncSessionContext,
|
|
14
|
+
CockroachSyncConnection,
|
|
15
|
+
)
|
|
16
|
+
from sqlspec.adapters.cockroach_psycopg.core import (
|
|
17
|
+
CockroachPsycopgRetryConfig,
|
|
18
|
+
apply_driver_features,
|
|
19
|
+
build_statement_config,
|
|
20
|
+
calculate_backoff_seconds,
|
|
21
|
+
driver_profile,
|
|
22
|
+
is_retryable_error,
|
|
23
|
+
)
|
|
24
|
+
from sqlspec.adapters.cockroach_psycopg.data_dictionary import (
|
|
25
|
+
CockroachPsycopgAsyncDataDictionary,
|
|
26
|
+
CockroachPsycopgSyncDataDictionary,
|
|
27
|
+
)
|
|
28
|
+
from sqlspec.adapters.psycopg.core import create_mapped_exception
|
|
29
|
+
from sqlspec.adapters.psycopg.driver import PsycopgAsyncDriver, PsycopgSyncDriver
|
|
30
|
+
from sqlspec.core import SQL, StatementConfig, get_cache_config, register_driver_profile
|
|
31
|
+
from sqlspec.exceptions import SerializationConflictError, TransactionRetryError
|
|
32
|
+
from sqlspec.utils.logging import get_logger
|
|
33
|
+
from sqlspec.utils.type_guards import has_sqlstate
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from collections.abc import Callable
|
|
37
|
+
|
|
38
|
+
from sqlspec.driver import ExecutionResult
|
|
39
|
+
|
|
40
|
+
__all__ = (
|
|
41
|
+
"CockroachPsycopgAsyncDriver",
|
|
42
|
+
"CockroachPsycopgAsyncExceptionHandler",
|
|
43
|
+
"CockroachPsycopgAsyncSessionContext",
|
|
44
|
+
"CockroachPsycopgSyncDriver",
|
|
45
|
+
"CockroachPsycopgSyncExceptionHandler",
|
|
46
|
+
"CockroachPsycopgSyncSessionContext",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
logger = get_logger("sqlspec.adapters.cockroach_psycopg")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class CockroachPsycopgSyncExceptionHandler:
|
|
53
|
+
"""Context manager for handling CockroachDB psycopg exceptions."""
|
|
54
|
+
|
|
55
|
+
__slots__ = ("pending_exception",)
|
|
56
|
+
|
|
57
|
+
def __init__(self) -> None:
|
|
58
|
+
self.pending_exception: Exception | None = None
|
|
59
|
+
|
|
60
|
+
def __enter__(self) -> "CockroachPsycopgSyncExceptionHandler":
|
|
61
|
+
return self
|
|
62
|
+
|
|
63
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
64
|
+
if exc_type is None:
|
|
65
|
+
return False
|
|
66
|
+
if issubclass(exc_type, psycopg.Error):
|
|
67
|
+
if has_sqlstate(exc_val) and str(exc_val.sqlstate) == "40001":
|
|
68
|
+
self.pending_exception = SerializationConflictError(str(exc_val))
|
|
69
|
+
return True
|
|
70
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
71
|
+
return True
|
|
72
|
+
return False
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class CockroachPsycopgAsyncExceptionHandler:
|
|
76
|
+
"""Async context manager for handling CockroachDB psycopg exceptions."""
|
|
77
|
+
|
|
78
|
+
__slots__ = ("pending_exception",)
|
|
79
|
+
|
|
80
|
+
def __init__(self) -> None:
|
|
81
|
+
self.pending_exception: Exception | None = None
|
|
82
|
+
|
|
83
|
+
async def __aenter__(self) -> "CockroachPsycopgAsyncExceptionHandler":
|
|
84
|
+
return self
|
|
85
|
+
|
|
86
|
+
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
87
|
+
if exc_type is None:
|
|
88
|
+
return False
|
|
89
|
+
if issubclass(exc_type, psycopg.Error):
|
|
90
|
+
if has_sqlstate(exc_val) and str(exc_val.sqlstate) == "40001":
|
|
91
|
+
self.pending_exception = SerializationConflictError(str(exc_val))
|
|
92
|
+
return True
|
|
93
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
94
|
+
return True
|
|
95
|
+
return False
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class CockroachPsycopgSyncDriver(PsycopgSyncDriver):
|
|
99
|
+
"""CockroachDB sync driver using psycopg.crdb."""
|
|
100
|
+
|
|
101
|
+
__slots__ = ("_enable_retry", "_follower_staleness", "_retry_config")
|
|
102
|
+
dialect = "postgres"
|
|
103
|
+
|
|
104
|
+
def __init__(
|
|
105
|
+
self,
|
|
106
|
+
connection: CockroachSyncConnection,
|
|
107
|
+
statement_config: "StatementConfig | None" = None,
|
|
108
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
109
|
+
) -> None:
|
|
110
|
+
if statement_config is None:
|
|
111
|
+
statement_config = build_statement_config().replace(
|
|
112
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
statement_config, normalized_features = apply_driver_features(statement_config, driver_features)
|
|
116
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=normalized_features)
|
|
117
|
+
|
|
118
|
+
self._retry_config = CockroachPsycopgRetryConfig.from_features(self.driver_features)
|
|
119
|
+
self._enable_retry = bool(self.driver_features.get("enable_auto_retry", True))
|
|
120
|
+
self._follower_staleness = cast("str | None", self.driver_features.get("default_staleness"))
|
|
121
|
+
# Data dictionary is lazily initialized in property; use parent slot
|
|
122
|
+
self._data_dictionary = None
|
|
123
|
+
|
|
124
|
+
def _execute_with_retry(self, operation: "Callable[[], ExecutionResult]") -> "ExecutionResult":
|
|
125
|
+
if not self._enable_retry:
|
|
126
|
+
return operation()
|
|
127
|
+
|
|
128
|
+
last_error: Exception | None = None
|
|
129
|
+
|
|
130
|
+
def attempt_operation() -> "tuple[ExecutionResult | None, Exception | None]":
|
|
131
|
+
try:
|
|
132
|
+
return operation(), None
|
|
133
|
+
except Exception as exc:
|
|
134
|
+
return None, exc
|
|
135
|
+
|
|
136
|
+
for attempt in range(self._retry_config.max_retries + 1):
|
|
137
|
+
result, exc = attempt_operation()
|
|
138
|
+
if exc is None:
|
|
139
|
+
return cast("ExecutionResult", result)
|
|
140
|
+
last_error = exc
|
|
141
|
+
if not is_retryable_error(exc) or attempt >= self._retry_config.max_retries:
|
|
142
|
+
raise exc
|
|
143
|
+
with contextlib.suppress(Exception):
|
|
144
|
+
self.connection.rollback()
|
|
145
|
+
delay = calculate_backoff_seconds(attempt, self._retry_config)
|
|
146
|
+
if self._retry_config.enable_logging:
|
|
147
|
+
logger.debug("CockroachDB retry %s/%s after %.3fs", attempt + 1, self._retry_config.max_retries, delay)
|
|
148
|
+
time.sleep(delay)
|
|
149
|
+
|
|
150
|
+
msg = "CockroachDB transaction retry limit exceeded"
|
|
151
|
+
raise TransactionRetryError(msg) from last_error
|
|
152
|
+
|
|
153
|
+
def _apply_follower_reads(self, cursor: Any) -> None:
|
|
154
|
+
if not self.driver_features.get("enable_follower_reads", False):
|
|
155
|
+
return
|
|
156
|
+
if not self._follower_staleness:
|
|
157
|
+
return
|
|
158
|
+
cursor.execute(f"SET TRANSACTION AS OF SYSTEM TIME {self._follower_staleness}")
|
|
159
|
+
|
|
160
|
+
def dispatch_execute(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
161
|
+
def operation() -> "ExecutionResult":
|
|
162
|
+
if statement.returns_rows():
|
|
163
|
+
self._apply_follower_reads(cursor)
|
|
164
|
+
return super(CockroachPsycopgSyncDriver, self).dispatch_execute(cursor, statement)
|
|
165
|
+
|
|
166
|
+
return self._execute_with_retry(operation)
|
|
167
|
+
|
|
168
|
+
def dispatch_execute_many(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
169
|
+
def operation() -> "ExecutionResult":
|
|
170
|
+
return super(CockroachPsycopgSyncDriver, self).dispatch_execute_many(cursor, statement)
|
|
171
|
+
|
|
172
|
+
return self._execute_with_retry(operation)
|
|
173
|
+
|
|
174
|
+
def dispatch_execute_script(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
175
|
+
def operation() -> "ExecutionResult":
|
|
176
|
+
return super(CockroachPsycopgSyncDriver, self).dispatch_execute_script(cursor, statement)
|
|
177
|
+
|
|
178
|
+
return self._execute_with_retry(operation)
|
|
179
|
+
|
|
180
|
+
def handle_database_exceptions(self) -> "CockroachPsycopgSyncExceptionHandler": # type: ignore[override]
|
|
181
|
+
return CockroachPsycopgSyncExceptionHandler()
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def data_dictionary(self) -> "CockroachPsycopgSyncDataDictionary": # type: ignore[override]
|
|
185
|
+
if self._data_dictionary is None:
|
|
186
|
+
# Intentionally assign CockroachDB-specific data dictionary to parent slot
|
|
187
|
+
object.__setattr__(self, "_data_dictionary", CockroachPsycopgSyncDataDictionary())
|
|
188
|
+
return cast("CockroachPsycopgSyncDataDictionary", self._data_dictionary)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class CockroachPsycopgAsyncDriver(PsycopgAsyncDriver):
|
|
192
|
+
"""CockroachDB async driver using psycopg.crdb."""
|
|
193
|
+
|
|
194
|
+
__slots__ = ("_enable_retry", "_follower_staleness", "_retry_config")
|
|
195
|
+
dialect = "postgres"
|
|
196
|
+
|
|
197
|
+
def __init__(
|
|
198
|
+
self,
|
|
199
|
+
connection: CockroachAsyncConnection,
|
|
200
|
+
statement_config: "StatementConfig | None" = None,
|
|
201
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
202
|
+
) -> None:
|
|
203
|
+
if statement_config is None:
|
|
204
|
+
statement_config = build_statement_config().replace(
|
|
205
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
statement_config, normalized_features = apply_driver_features(statement_config, driver_features)
|
|
209
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=normalized_features)
|
|
210
|
+
|
|
211
|
+
self._retry_config = CockroachPsycopgRetryConfig.from_features(self.driver_features)
|
|
212
|
+
self._enable_retry = bool(self.driver_features.get("enable_auto_retry", True))
|
|
213
|
+
self._follower_staleness = cast("str | None", self.driver_features.get("default_staleness"))
|
|
214
|
+
# Data dictionary is lazily initialized in property; use parent slot
|
|
215
|
+
self._data_dictionary = None
|
|
216
|
+
|
|
217
|
+
async def _execute_with_retry(self, operation: "Callable[[], Any]") -> "ExecutionResult":
|
|
218
|
+
if not self._enable_retry:
|
|
219
|
+
return cast("ExecutionResult", await operation())
|
|
220
|
+
|
|
221
|
+
last_error: Exception | None = None
|
|
222
|
+
|
|
223
|
+
async def attempt_operation() -> "tuple[ExecutionResult | None, Exception | None]":
|
|
224
|
+
try:
|
|
225
|
+
return await operation(), None
|
|
226
|
+
except Exception as exc:
|
|
227
|
+
return None, exc
|
|
228
|
+
|
|
229
|
+
for attempt in range(self._retry_config.max_retries + 1):
|
|
230
|
+
result, exc = await attempt_operation()
|
|
231
|
+
if exc is None:
|
|
232
|
+
return cast("ExecutionResult", result)
|
|
233
|
+
last_error = exc
|
|
234
|
+
if not is_retryable_error(exc) or attempt >= self._retry_config.max_retries:
|
|
235
|
+
raise exc
|
|
236
|
+
with contextlib.suppress(Exception):
|
|
237
|
+
await self.connection.rollback()
|
|
238
|
+
delay = calculate_backoff_seconds(attempt, self._retry_config)
|
|
239
|
+
if self._retry_config.enable_logging:
|
|
240
|
+
logger.debug("CockroachDB retry %s/%s after %.3fs", attempt + 1, self._retry_config.max_retries, delay)
|
|
241
|
+
await asyncio.sleep(delay)
|
|
242
|
+
|
|
243
|
+
msg = "CockroachDB transaction retry limit exceeded"
|
|
244
|
+
raise TransactionRetryError(msg) from last_error
|
|
245
|
+
|
|
246
|
+
async def _apply_follower_reads(self, cursor: Any) -> None:
|
|
247
|
+
if not self.driver_features.get("enable_follower_reads", False):
|
|
248
|
+
return
|
|
249
|
+
if not self._follower_staleness:
|
|
250
|
+
return
|
|
251
|
+
await cursor.execute(f"SET TRANSACTION AS OF SYSTEM TIME {self._follower_staleness}")
|
|
252
|
+
|
|
253
|
+
async def dispatch_execute(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
254
|
+
async def operation() -> "ExecutionResult":
|
|
255
|
+
if statement.returns_rows():
|
|
256
|
+
await self._apply_follower_reads(cursor)
|
|
257
|
+
return await super(CockroachPsycopgAsyncDriver, self).dispatch_execute(cursor, statement)
|
|
258
|
+
|
|
259
|
+
return await self._execute_with_retry(operation)
|
|
260
|
+
|
|
261
|
+
async def dispatch_execute_many(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
262
|
+
async def operation() -> "ExecutionResult":
|
|
263
|
+
return await super(CockroachPsycopgAsyncDriver, self).dispatch_execute_many(cursor, statement)
|
|
264
|
+
|
|
265
|
+
return await self._execute_with_retry(operation)
|
|
266
|
+
|
|
267
|
+
async def dispatch_execute_script(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
268
|
+
async def operation() -> "ExecutionResult":
|
|
269
|
+
return await super(CockroachPsycopgAsyncDriver, self).dispatch_execute_script(cursor, statement)
|
|
270
|
+
|
|
271
|
+
return await self._execute_with_retry(operation)
|
|
272
|
+
|
|
273
|
+
def handle_database_exceptions(self) -> "CockroachPsycopgAsyncExceptionHandler": # type: ignore[override]
|
|
274
|
+
return CockroachPsycopgAsyncExceptionHandler()
|
|
275
|
+
|
|
276
|
+
@property
|
|
277
|
+
def data_dictionary(self) -> "CockroachPsycopgAsyncDataDictionary": # type: ignore[override]
|
|
278
|
+
if self._data_dictionary is None:
|
|
279
|
+
# Intentionally assign CockroachDB-specific data dictionary to parent slot
|
|
280
|
+
object.__setattr__(self, "_data_dictionary", CockroachPsycopgAsyncDataDictionary())
|
|
281
|
+
return cast("CockroachPsycopgAsyncDataDictionary", self._data_dictionary)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
register_driver_profile("cockroach_psycopg", driver_profile)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""CockroachDB event queue stores for psycopg sync/async drivers."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.cockroach_psycopg.config import CockroachPsycopgAsyncConfig, CockroachPsycopgSyncConfig
|
|
4
|
+
from sqlspec.extensions.events import BaseEventQueueStore
|
|
5
|
+
|
|
6
|
+
__all__ = ("CockroachPsycopgAsyncEventQueueStore", "CockroachPsycopgSyncEventQueueStore")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CockroachPsycopgSyncEventQueueStore(BaseEventQueueStore[CockroachPsycopgSyncConfig]):
|
|
10
|
+
"""Queue DDL for CockroachDB psycopg synchronous configs.
|
|
11
|
+
|
|
12
|
+
CockroachDB uses JSONB for efficient JSON storage and TIMESTAMPTZ for
|
|
13
|
+
timezone-aware timestamps.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
__slots__ = ()
|
|
17
|
+
|
|
18
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
19
|
+
"""Return CockroachDB-optimized column types for the event queue."""
|
|
20
|
+
return "JSONB", "JSONB", "TIMESTAMPTZ"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CockroachPsycopgAsyncEventQueueStore(BaseEventQueueStore[CockroachPsycopgAsyncConfig]):
|
|
24
|
+
"""Queue DDL for CockroachDB psycopg async configs.
|
|
25
|
+
|
|
26
|
+
CockroachDB uses JSONB for efficient JSON storage and TIMESTAMPTZ for
|
|
27
|
+
timezone-aware timestamps.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
__slots__ = ()
|
|
31
|
+
|
|
32
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
33
|
+
"""Return CockroachDB-optimized column types for the event queue."""
|
|
34
|
+
return "JSONB", "JSONB", "TIMESTAMPTZ"
|