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,536 @@
|
|
|
1
|
+
"""Oracle-specific data dictionary for metadata queries."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
5
|
+
|
|
6
|
+
from mypy_extensions import mypyc_attr
|
|
7
|
+
|
|
8
|
+
from sqlspec.data_dictionary import get_dialect_config
|
|
9
|
+
from sqlspec.driver import AsyncDataDictionaryBase, SyncDataDictionaryBase
|
|
10
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
11
|
+
from sqlspec.utils.logging import get_logger
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from sqlspec.adapters.oracledb.driver import OracleAsyncDriver, OracleSyncDriver
|
|
15
|
+
from sqlspec.data_dictionary._types import DialectConfig
|
|
16
|
+
|
|
17
|
+
ORACLE_MIN_JSON_NATIVE_VERSION = 21
|
|
18
|
+
ORACLE_MIN_JSON_NATIVE_COMPATIBLE = 20
|
|
19
|
+
ORACLE_MIN_JSON_BLOB_VERSION = 12
|
|
20
|
+
ORACLE_MIN_OSON_VERSION = 19
|
|
21
|
+
ORACLE_VERSION_PARTS_COUNT = 3
|
|
22
|
+
|
|
23
|
+
VERSION_NUMBER_PATTERN = re.compile(r"(\d+)")
|
|
24
|
+
logger = get_logger("sqlspec.adapters.oracledb.data_dictionary")
|
|
25
|
+
|
|
26
|
+
__all__ = ("OracleVersionInfo", "OracledbAsyncDataDictionary", "OracledbSyncDataDictionary")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class OracleVersionInfo(VersionInfo):
|
|
30
|
+
"""Oracle database version information."""
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self, major: int, minor: int = 0, patch: int = 0, compatible: "str | None" = None, is_autonomous: bool = False
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Initialize Oracle version info.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
major: Major version number (e.g., 19, 21, 23).
|
|
39
|
+
minor: Minor version number.
|
|
40
|
+
patch: Patch version number.
|
|
41
|
+
compatible: Compatible parameter value.
|
|
42
|
+
is_autonomous: Whether this is an Autonomous Database.
|
|
43
|
+
"""
|
|
44
|
+
super().__init__(major, minor, patch)
|
|
45
|
+
self.compatible = compatible
|
|
46
|
+
self.is_autonomous = is_autonomous
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def compatible_major(self) -> "int | None":
|
|
50
|
+
"""Get major version from compatible parameter."""
|
|
51
|
+
if not self.compatible:
|
|
52
|
+
return None
|
|
53
|
+
parts = self.compatible.split(".")
|
|
54
|
+
if not parts:
|
|
55
|
+
return None
|
|
56
|
+
return int(parts[0])
|
|
57
|
+
|
|
58
|
+
def supports_native_json(self) -> bool:
|
|
59
|
+
"""Check if database supports native JSON data type."""
|
|
60
|
+
return (
|
|
61
|
+
self.major >= ORACLE_MIN_JSON_NATIVE_VERSION
|
|
62
|
+
and (self.compatible_major or 0) >= ORACLE_MIN_JSON_NATIVE_COMPATIBLE
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def supports_oson_blob(self) -> bool:
|
|
66
|
+
"""Check if database supports BLOB with OSON format."""
|
|
67
|
+
if self.major >= ORACLE_MIN_JSON_NATIVE_VERSION:
|
|
68
|
+
return True
|
|
69
|
+
return self.major >= ORACLE_MIN_OSON_VERSION and self.is_autonomous
|
|
70
|
+
|
|
71
|
+
def supports_json_blob(self) -> bool:
|
|
72
|
+
"""Check if database supports BLOB with JSON validation."""
|
|
73
|
+
return self.major >= ORACLE_MIN_JSON_BLOB_VERSION
|
|
74
|
+
|
|
75
|
+
def __str__(self) -> str:
|
|
76
|
+
"""String representation of version info."""
|
|
77
|
+
version_str = f"{self.major}.{self.minor}.{self.patch}"
|
|
78
|
+
if self.compatible:
|
|
79
|
+
version_str += f" (compatible={self.compatible})"
|
|
80
|
+
if self.is_autonomous:
|
|
81
|
+
version_str += " [Autonomous]"
|
|
82
|
+
return version_str
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
86
|
+
class OracledbSyncDataDictionary(SyncDataDictionaryBase):
|
|
87
|
+
"""Oracle-specific sync data dictionary."""
|
|
88
|
+
|
|
89
|
+
dialect: ClassVar[str] = "oracle"
|
|
90
|
+
|
|
91
|
+
def __init__(self) -> None:
|
|
92
|
+
super().__init__()
|
|
93
|
+
|
|
94
|
+
def get_dialect_config(self) -> "DialectConfig":
|
|
95
|
+
"""Return the dialect configuration for this data dictionary."""
|
|
96
|
+
return get_dialect_config(type(self).dialect)
|
|
97
|
+
|
|
98
|
+
def resolve_schema(self, schema: "str | None") -> "str | None":
|
|
99
|
+
"""Return a schema name using dialect defaults when missing."""
|
|
100
|
+
if schema is not None:
|
|
101
|
+
return schema
|
|
102
|
+
return self.get_dialect_config().default_schema
|
|
103
|
+
|
|
104
|
+
def _extract_version_value(self, row: Any) -> "str | None":
|
|
105
|
+
if isinstance(row, dict):
|
|
106
|
+
for key in ("version", "VERSION", "Version"):
|
|
107
|
+
value = row.get(key)
|
|
108
|
+
if value:
|
|
109
|
+
return str(value)
|
|
110
|
+
if isinstance(row, (list, tuple)) and row:
|
|
111
|
+
return str(row[0])
|
|
112
|
+
if row is not None:
|
|
113
|
+
return str(row)
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
def _parse_version_components(self, version_str: str) -> "tuple[int, int, int] | None":
|
|
117
|
+
parts = [int(value) for value in VERSION_NUMBER_PATTERN.findall(version_str)]
|
|
118
|
+
if not parts:
|
|
119
|
+
return None
|
|
120
|
+
while len(parts) < ORACLE_VERSION_PARTS_COUNT:
|
|
121
|
+
parts.append(0)
|
|
122
|
+
return parts[0], parts[1], parts[2]
|
|
123
|
+
|
|
124
|
+
def _build_version_info(
|
|
125
|
+
self, version_value: "str | None", compatible: "str | None", is_autonomous: bool
|
|
126
|
+
) -> "OracleVersionInfo | None":
|
|
127
|
+
if not version_value:
|
|
128
|
+
return None
|
|
129
|
+
parts = self._parse_version_components(version_value)
|
|
130
|
+
if parts is None:
|
|
131
|
+
return None
|
|
132
|
+
return OracleVersionInfo(parts[0], parts[1], parts[2], compatible=compatible, is_autonomous=is_autonomous)
|
|
133
|
+
|
|
134
|
+
def _get_oracle_json_type(self, version_info: "OracleVersionInfo | None") -> str:
|
|
135
|
+
if version_info is None:
|
|
136
|
+
return "CLOB"
|
|
137
|
+
if version_info.supports_native_json():
|
|
138
|
+
return "JSON"
|
|
139
|
+
if version_info.supports_oson_blob():
|
|
140
|
+
return "BLOB"
|
|
141
|
+
if version_info.supports_json_blob():
|
|
142
|
+
return "BLOB"
|
|
143
|
+
return "CLOB"
|
|
144
|
+
|
|
145
|
+
def _merge_table_lists(
|
|
146
|
+
self, ordered: "list[TableMetadata]", all_tables: "list[TableMetadata]"
|
|
147
|
+
) -> "list[TableMetadata]":
|
|
148
|
+
if not ordered:
|
|
149
|
+
return sorted(all_tables, key=lambda item: item.get("table_name") or "")
|
|
150
|
+
ordered_names = {item.get("table_name") for item in ordered if item.get("table_name")}
|
|
151
|
+
remainder = [item for item in all_tables if item.get("table_name") not in ordered_names]
|
|
152
|
+
return ordered + remainder
|
|
153
|
+
|
|
154
|
+
def _resolve_feature_flag(self, version_info: "OracleVersionInfo | None", feature: str) -> bool:
|
|
155
|
+
if feature == "is_autonomous":
|
|
156
|
+
return bool(version_info and version_info.is_autonomous)
|
|
157
|
+
if version_info is None:
|
|
158
|
+
return False
|
|
159
|
+
if feature == "supports_native_json":
|
|
160
|
+
return version_info.supports_native_json()
|
|
161
|
+
if feature == "supports_oson_blob":
|
|
162
|
+
return version_info.supports_oson_blob()
|
|
163
|
+
if feature == "supports_json_blob":
|
|
164
|
+
return version_info.supports_json_blob()
|
|
165
|
+
if feature == "supports_json":
|
|
166
|
+
return version_info.supports_json_blob()
|
|
167
|
+
|
|
168
|
+
config = get_dialect_config(type(self).dialect)
|
|
169
|
+
flag = config.get_feature_flag(feature)
|
|
170
|
+
if flag is not None:
|
|
171
|
+
return flag
|
|
172
|
+
required_version = config.get_feature_version(feature)
|
|
173
|
+
if required_version is None:
|
|
174
|
+
return False
|
|
175
|
+
return bool(version_info >= required_version)
|
|
176
|
+
|
|
177
|
+
def list_available_features(self) -> "list[str]":
|
|
178
|
+
config = get_dialect_config(type(self).dialect)
|
|
179
|
+
features: set[str] = set()
|
|
180
|
+
features.update(config.feature_flags.keys())
|
|
181
|
+
features.update(config.feature_versions.keys())
|
|
182
|
+
features.update({
|
|
183
|
+
"is_autonomous",
|
|
184
|
+
"supports_native_json",
|
|
185
|
+
"supports_oson_blob",
|
|
186
|
+
"supports_json_blob",
|
|
187
|
+
"supports_json",
|
|
188
|
+
})
|
|
189
|
+
return sorted(features)
|
|
190
|
+
|
|
191
|
+
def _get_compatible_value(self, driver: "OracleSyncDriver") -> "str | None":
|
|
192
|
+
query_text = self.get_query_text("compatible")
|
|
193
|
+
try:
|
|
194
|
+
value = driver.select_value(query_text)
|
|
195
|
+
if value is None:
|
|
196
|
+
return None
|
|
197
|
+
return str(value)
|
|
198
|
+
except Exception:
|
|
199
|
+
return None
|
|
200
|
+
|
|
201
|
+
def _is_autonomous(self, driver: "OracleSyncDriver") -> bool:
|
|
202
|
+
query_text = self.get_query_text("autonomous_service")
|
|
203
|
+
try:
|
|
204
|
+
return bool(driver.select_value_or_none(query_text))
|
|
205
|
+
except Exception:
|
|
206
|
+
return False
|
|
207
|
+
|
|
208
|
+
def get_version(self, driver: "OracleSyncDriver") -> "OracleVersionInfo | None":
|
|
209
|
+
"""Get Oracle database version information."""
|
|
210
|
+
driver_id = id(driver)
|
|
211
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
212
|
+
if driver_id in self._version_fetch_attempted:
|
|
213
|
+
return cast("OracleVersionInfo | None", self._version_cache.get(driver_id))
|
|
214
|
+
# Not cached, fetch from database
|
|
215
|
+
|
|
216
|
+
version_row = driver.select_one_or_none(self.get_query_text("version"))
|
|
217
|
+
if not version_row:
|
|
218
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
219
|
+
self.cache_version(driver_id, None)
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
version_value = self._extract_version_value(version_row)
|
|
223
|
+
if not version_value:
|
|
224
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
225
|
+
self.cache_version(driver_id, None)
|
|
226
|
+
return None
|
|
227
|
+
|
|
228
|
+
compatible = self._get_compatible_value(driver)
|
|
229
|
+
is_autonomous = self._is_autonomous(driver)
|
|
230
|
+
version_info = self._build_version_info(version_value, compatible, is_autonomous)
|
|
231
|
+
if version_info is None:
|
|
232
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
233
|
+
self.cache_version(driver_id, None)
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
237
|
+
self.cache_version(driver_id, version_info)
|
|
238
|
+
return version_info
|
|
239
|
+
|
|
240
|
+
def get_feature_flag(self, driver: "OracleSyncDriver", feature: str) -> bool:
|
|
241
|
+
"""Check if Oracle database supports a specific feature."""
|
|
242
|
+
version_info = self.get_version(driver)
|
|
243
|
+
return self._resolve_feature_flag(version_info, feature)
|
|
244
|
+
|
|
245
|
+
def get_optimal_type(self, driver: "OracleSyncDriver", type_category: str) -> str:
|
|
246
|
+
"""Get optimal Oracle type for a category."""
|
|
247
|
+
if type_category == "json":
|
|
248
|
+
return self._get_oracle_json_type(self.get_version(driver))
|
|
249
|
+
return self.get_dialect_config().get_optimal_type(type_category)
|
|
250
|
+
|
|
251
|
+
def get_tables(self, driver: "OracleSyncDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
252
|
+
"""Get tables sorted by dependency order with full coverage."""
|
|
253
|
+
schema_name = self.resolve_schema(schema)
|
|
254
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
255
|
+
ordered_rows = driver.select(
|
|
256
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
257
|
+
)
|
|
258
|
+
all_rows = driver.select(
|
|
259
|
+
self.get_query("all_tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
260
|
+
)
|
|
261
|
+
return self._merge_table_lists(ordered_rows, all_rows)
|
|
262
|
+
|
|
263
|
+
def get_columns(
|
|
264
|
+
self, driver: "OracleSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
265
|
+
) -> "list[ColumnMetadata]":
|
|
266
|
+
"""Get column information for a table or schema."""
|
|
267
|
+
schema_name = self.resolve_schema(schema)
|
|
268
|
+
if table is None:
|
|
269
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
270
|
+
return driver.select(
|
|
271
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
272
|
+
)
|
|
273
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
274
|
+
return driver.select(
|
|
275
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
def get_indexes(
|
|
279
|
+
self, driver: "OracleSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
280
|
+
) -> "list[IndexMetadata]":
|
|
281
|
+
"""Get index metadata for a table or schema."""
|
|
282
|
+
schema_name = self.resolve_schema(schema)
|
|
283
|
+
if table is None:
|
|
284
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
285
|
+
return driver.select(
|
|
286
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
287
|
+
)
|
|
288
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
289
|
+
return driver.select(
|
|
290
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
def get_foreign_keys(
|
|
294
|
+
self, driver: "OracleSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
295
|
+
) -> "list[ForeignKeyMetadata]":
|
|
296
|
+
"""Get foreign key metadata."""
|
|
297
|
+
schema_name = self.resolve_schema(schema)
|
|
298
|
+
if table is None:
|
|
299
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
300
|
+
return driver.select(
|
|
301
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
302
|
+
)
|
|
303
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
304
|
+
return driver.select(
|
|
305
|
+
self.get_query("foreign_keys_by_table"),
|
|
306
|
+
schema_name=schema_name,
|
|
307
|
+
table_name=table,
|
|
308
|
+
schema_type=ForeignKeyMetadata,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
313
|
+
class OracledbAsyncDataDictionary(AsyncDataDictionaryBase):
|
|
314
|
+
"""Oracle-specific async data dictionary."""
|
|
315
|
+
|
|
316
|
+
dialect: ClassVar[str] = "oracle"
|
|
317
|
+
|
|
318
|
+
def __init__(self) -> None:
|
|
319
|
+
super().__init__()
|
|
320
|
+
|
|
321
|
+
def get_dialect_config(self) -> "DialectConfig":
|
|
322
|
+
"""Return the dialect configuration for this data dictionary."""
|
|
323
|
+
return get_dialect_config(type(self).dialect)
|
|
324
|
+
|
|
325
|
+
def resolve_schema(self, schema: "str | None") -> "str | None":
|
|
326
|
+
"""Return a schema name using dialect defaults when missing."""
|
|
327
|
+
if schema is not None:
|
|
328
|
+
return schema
|
|
329
|
+
return self.get_dialect_config().default_schema
|
|
330
|
+
|
|
331
|
+
def _extract_version_value(self, row: Any) -> "str | None":
|
|
332
|
+
if isinstance(row, dict):
|
|
333
|
+
for key in ("version", "VERSION", "Version"):
|
|
334
|
+
value = row.get(key)
|
|
335
|
+
if value:
|
|
336
|
+
return str(value)
|
|
337
|
+
if isinstance(row, (list, tuple)) and row:
|
|
338
|
+
return str(row[0])
|
|
339
|
+
if row is not None:
|
|
340
|
+
return str(row)
|
|
341
|
+
return None
|
|
342
|
+
|
|
343
|
+
def _parse_version_components(self, version_str: str) -> "tuple[int, int, int] | None":
|
|
344
|
+
parts = [int(value) for value in VERSION_NUMBER_PATTERN.findall(version_str)]
|
|
345
|
+
if not parts:
|
|
346
|
+
return None
|
|
347
|
+
while len(parts) < ORACLE_VERSION_PARTS_COUNT:
|
|
348
|
+
parts.append(0)
|
|
349
|
+
return parts[0], parts[1], parts[2]
|
|
350
|
+
|
|
351
|
+
def _build_version_info(
|
|
352
|
+
self, version_value: "str | None", compatible: "str | None", is_autonomous: bool
|
|
353
|
+
) -> "OracleVersionInfo | None":
|
|
354
|
+
if not version_value:
|
|
355
|
+
return None
|
|
356
|
+
parts = self._parse_version_components(version_value)
|
|
357
|
+
if parts is None:
|
|
358
|
+
return None
|
|
359
|
+
return OracleVersionInfo(parts[0], parts[1], parts[2], compatible=compatible, is_autonomous=is_autonomous)
|
|
360
|
+
|
|
361
|
+
def _get_oracle_json_type(self, version_info: "OracleVersionInfo | None") -> str:
|
|
362
|
+
if version_info is None:
|
|
363
|
+
return "CLOB"
|
|
364
|
+
if version_info.supports_native_json():
|
|
365
|
+
return "JSON"
|
|
366
|
+
if version_info.supports_oson_blob():
|
|
367
|
+
return "BLOB"
|
|
368
|
+
if version_info.supports_json_blob():
|
|
369
|
+
return "BLOB"
|
|
370
|
+
return "CLOB"
|
|
371
|
+
|
|
372
|
+
def _merge_table_lists(
|
|
373
|
+
self, ordered: "list[TableMetadata]", all_tables: "list[TableMetadata]"
|
|
374
|
+
) -> "list[TableMetadata]":
|
|
375
|
+
if not ordered:
|
|
376
|
+
return sorted(all_tables, key=lambda item: item.get("table_name") or "")
|
|
377
|
+
ordered_names = {item.get("table_name") for item in ordered if item.get("table_name")}
|
|
378
|
+
remainder = [item for item in all_tables if item.get("table_name") not in ordered_names]
|
|
379
|
+
return ordered + remainder
|
|
380
|
+
|
|
381
|
+
def _resolve_feature_flag(self, version_info: "OracleVersionInfo | None", feature: str) -> bool:
|
|
382
|
+
if feature == "is_autonomous":
|
|
383
|
+
return bool(version_info and version_info.is_autonomous)
|
|
384
|
+
if version_info is None:
|
|
385
|
+
return False
|
|
386
|
+
if feature == "supports_native_json":
|
|
387
|
+
return version_info.supports_native_json()
|
|
388
|
+
if feature == "supports_oson_blob":
|
|
389
|
+
return version_info.supports_oson_blob()
|
|
390
|
+
if feature == "supports_json_blob":
|
|
391
|
+
return version_info.supports_json_blob()
|
|
392
|
+
if feature == "supports_json":
|
|
393
|
+
return version_info.supports_json_blob()
|
|
394
|
+
|
|
395
|
+
config = get_dialect_config(type(self).dialect)
|
|
396
|
+
flag = config.get_feature_flag(feature)
|
|
397
|
+
if flag is not None:
|
|
398
|
+
return flag
|
|
399
|
+
required_version = config.get_feature_version(feature)
|
|
400
|
+
if required_version is None:
|
|
401
|
+
return False
|
|
402
|
+
return bool(version_info >= required_version)
|
|
403
|
+
|
|
404
|
+
def list_available_features(self) -> "list[str]":
|
|
405
|
+
config = get_dialect_config(type(self).dialect)
|
|
406
|
+
features: set[str] = set()
|
|
407
|
+
features.update(config.feature_flags.keys())
|
|
408
|
+
features.update(config.feature_versions.keys())
|
|
409
|
+
features.update({
|
|
410
|
+
"is_autonomous",
|
|
411
|
+
"supports_native_json",
|
|
412
|
+
"supports_oson_blob",
|
|
413
|
+
"supports_json_blob",
|
|
414
|
+
"supports_json",
|
|
415
|
+
})
|
|
416
|
+
return sorted(features)
|
|
417
|
+
|
|
418
|
+
async def _get_compatible_value(self, driver: "OracleAsyncDriver") -> "str | None":
|
|
419
|
+
query_text = self.get_query_text("compatible")
|
|
420
|
+
try:
|
|
421
|
+
value = await driver.select_value(query_text)
|
|
422
|
+
if value is None:
|
|
423
|
+
return None
|
|
424
|
+
return str(value)
|
|
425
|
+
except Exception:
|
|
426
|
+
return None
|
|
427
|
+
|
|
428
|
+
async def _is_autonomous(self, driver: "OracleAsyncDriver") -> bool:
|
|
429
|
+
query_text = self.get_query_text("autonomous_service")
|
|
430
|
+
try:
|
|
431
|
+
return bool(await driver.select_value_or_none(query_text))
|
|
432
|
+
except Exception:
|
|
433
|
+
return False
|
|
434
|
+
|
|
435
|
+
async def get_version(self, driver: "OracleAsyncDriver") -> "OracleVersionInfo | None":
|
|
436
|
+
"""Get Oracle database version information."""
|
|
437
|
+
driver_id = id(driver)
|
|
438
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
439
|
+
if driver_id in self._version_fetch_attempted:
|
|
440
|
+
return cast("OracleVersionInfo | None", self._version_cache.get(driver_id))
|
|
441
|
+
# Not cached, fetch from database
|
|
442
|
+
|
|
443
|
+
version_row = await driver.select_one_or_none(self.get_query_text("version"))
|
|
444
|
+
if not version_row:
|
|
445
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
446
|
+
self.cache_version(driver_id, None)
|
|
447
|
+
return None
|
|
448
|
+
|
|
449
|
+
version_value = self._extract_version_value(version_row)
|
|
450
|
+
if not version_value:
|
|
451
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
452
|
+
self.cache_version(driver_id, None)
|
|
453
|
+
return None
|
|
454
|
+
|
|
455
|
+
compatible = await self._get_compatible_value(driver)
|
|
456
|
+
is_autonomous = await self._is_autonomous(driver)
|
|
457
|
+
version_info = self._build_version_info(version_value, compatible, is_autonomous)
|
|
458
|
+
if version_info is None:
|
|
459
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
460
|
+
self.cache_version(driver_id, None)
|
|
461
|
+
return None
|
|
462
|
+
|
|
463
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
464
|
+
self.cache_version(driver_id, version_info)
|
|
465
|
+
return version_info
|
|
466
|
+
|
|
467
|
+
async def get_feature_flag(self, driver: "OracleAsyncDriver", feature: str) -> bool:
|
|
468
|
+
"""Check if Oracle database supports a specific feature."""
|
|
469
|
+
version_info = await self.get_version(driver)
|
|
470
|
+
return self._resolve_feature_flag(version_info, feature)
|
|
471
|
+
|
|
472
|
+
async def get_optimal_type(self, driver: "OracleAsyncDriver", type_category: str) -> str:
|
|
473
|
+
"""Get optimal Oracle type for a category."""
|
|
474
|
+
if type_category == "json":
|
|
475
|
+
return self._get_oracle_json_type(await self.get_version(driver))
|
|
476
|
+
return self.get_dialect_config().get_optimal_type(type_category)
|
|
477
|
+
|
|
478
|
+
async def get_tables(self, driver: "OracleAsyncDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
479
|
+
"""Get tables sorted by dependency order with full coverage."""
|
|
480
|
+
schema_name = self.resolve_schema(schema)
|
|
481
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
482
|
+
ordered_rows = await driver.select(
|
|
483
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
484
|
+
)
|
|
485
|
+
all_rows = await driver.select(
|
|
486
|
+
self.get_query("all_tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
487
|
+
)
|
|
488
|
+
return self._merge_table_lists(ordered_rows, all_rows)
|
|
489
|
+
|
|
490
|
+
async def get_columns(
|
|
491
|
+
self, driver: "OracleAsyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
492
|
+
) -> "list[ColumnMetadata]":
|
|
493
|
+
"""Get column information for a table or schema."""
|
|
494
|
+
schema_name = self.resolve_schema(schema)
|
|
495
|
+
if table is None:
|
|
496
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
497
|
+
return await driver.select(
|
|
498
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
499
|
+
)
|
|
500
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
501
|
+
return await driver.select(
|
|
502
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
async def get_indexes(
|
|
506
|
+
self, driver: "OracleAsyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
507
|
+
) -> "list[IndexMetadata]":
|
|
508
|
+
"""Get index metadata for a table or schema."""
|
|
509
|
+
schema_name = self.resolve_schema(schema)
|
|
510
|
+
if table is None:
|
|
511
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
512
|
+
return await driver.select(
|
|
513
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
514
|
+
)
|
|
515
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
516
|
+
return await driver.select(
|
|
517
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
async def get_foreign_keys(
|
|
521
|
+
self, driver: "OracleAsyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
522
|
+
) -> "list[ForeignKeyMetadata]":
|
|
523
|
+
"""Get foreign key metadata."""
|
|
524
|
+
schema_name = self.resolve_schema(schema)
|
|
525
|
+
if table is None:
|
|
526
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
527
|
+
return await driver.select(
|
|
528
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
529
|
+
)
|
|
530
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
531
|
+
return await driver.select(
|
|
532
|
+
self.get_query("foreign_keys_by_table"),
|
|
533
|
+
schema_name=schema_name,
|
|
534
|
+
table_name=table,
|
|
535
|
+
schema_type=ForeignKeyMetadata,
|
|
536
|
+
)
|