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
|
Binary file
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"""Base classes and detection for adapter type conversion."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
from datetime import date, datetime, time, timezone
|
|
6
|
+
from decimal import Decimal
|
|
7
|
+
from functools import lru_cache
|
|
8
|
+
from typing import Any, Final
|
|
9
|
+
from uuid import UUID
|
|
10
|
+
|
|
11
|
+
from mypy_extensions import mypyc_attr
|
|
12
|
+
|
|
13
|
+
from sqlspec._serialization import decode_json
|
|
14
|
+
|
|
15
|
+
__all__ = (
|
|
16
|
+
"DEFAULT_CACHE_SIZE",
|
|
17
|
+
"DEFAULT_SPECIAL_CHARS",
|
|
18
|
+
"BaseInputConverter",
|
|
19
|
+
"BaseTypeConverter",
|
|
20
|
+
"CachedOutputConverter",
|
|
21
|
+
"convert_decimal",
|
|
22
|
+
"convert_iso_date",
|
|
23
|
+
"convert_iso_datetime",
|
|
24
|
+
"convert_iso_time",
|
|
25
|
+
"convert_json",
|
|
26
|
+
"convert_uuid",
|
|
27
|
+
"format_datetime_rfc3339",
|
|
28
|
+
"parse_datetime_rfc3339",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
DEFAULT_SPECIAL_CHARS: Final[frozenset[str]] = frozenset({"{", "[", "-", ":", "T", "."})
|
|
32
|
+
DEFAULT_CACHE_SIZE: Final[int] = 5000
|
|
33
|
+
DEFAULT_DETECTION_CHARS: Final[frozenset[str]] = frozenset({"{", "[", "-", ":", "T"})
|
|
34
|
+
|
|
35
|
+
SPECIAL_TYPE_REGEX: Final[re.Pattern[str]] = re.compile(
|
|
36
|
+
r"^(?:"
|
|
37
|
+
r"(?P<uuid>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|"
|
|
38
|
+
r"(?P<iso_datetime>\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)|"
|
|
39
|
+
r"(?P<iso_date>\d{4}-\d{2}-\d{2})|"
|
|
40
|
+
r"(?P<iso_time>\d{2}:\d{2}:\d{2}(?:\.\d+)?)|"
|
|
41
|
+
r"(?P<json>[\[{].*[\]}])|"
|
|
42
|
+
r"(?P<ipv4>(?:\d{1,3}\.){3}\d{1,3})|"
|
|
43
|
+
r"(?P<ipv6>(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4})|"
|
|
44
|
+
r"(?P<mac>(?:[0-9a-f]{2}:){5}[0-9a-f]{2})"
|
|
45
|
+
r")$",
|
|
46
|
+
re.IGNORECASE | re.DOTALL,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def convert_uuid(value: str) -> "UUID":
|
|
51
|
+
"""Convert UUID string to UUID object.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
value: UUID string.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
UUID object.
|
|
58
|
+
"""
|
|
59
|
+
return UUID(value)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def convert_iso_datetime(value: str) -> "datetime":
|
|
63
|
+
"""Convert ISO 8601 datetime string to datetime object.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
value: ISO datetime string.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
datetime object.
|
|
70
|
+
"""
|
|
71
|
+
if value.endswith("Z"):
|
|
72
|
+
value = value[:-1] + "+00:00"
|
|
73
|
+
|
|
74
|
+
if " " in value and "T" not in value:
|
|
75
|
+
value = value.replace(" ", "T")
|
|
76
|
+
|
|
77
|
+
return datetime.fromisoformat(value)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def convert_iso_date(value: str) -> "date":
|
|
81
|
+
"""Convert ISO date string to date object.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
value: ISO date string.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
date object.
|
|
88
|
+
"""
|
|
89
|
+
return date.fromisoformat(value)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def convert_iso_time(value: str) -> "time":
|
|
93
|
+
"""Convert ISO time string to time object.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
value: ISO time string.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
time object.
|
|
100
|
+
"""
|
|
101
|
+
return time.fromisoformat(value)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def convert_json(value: str) -> "Any":
|
|
105
|
+
"""Convert JSON string to Python object.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
value: JSON string.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Decoded Python object.
|
|
112
|
+
"""
|
|
113
|
+
return decode_json(value)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def convert_decimal(value: str) -> "Decimal":
|
|
117
|
+
"""Convert string to Decimal for precise arithmetic.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
value: Decimal string.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Decimal object.
|
|
124
|
+
"""
|
|
125
|
+
return Decimal(value)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def format_datetime_rfc3339(dt: "datetime") -> str:
|
|
129
|
+
"""Format datetime as RFC 3339 compliant string.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
dt: datetime object.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
RFC 3339 formatted datetime string.
|
|
136
|
+
"""
|
|
137
|
+
if dt.tzinfo is None:
|
|
138
|
+
dt = dt.replace(tzinfo=timezone.utc)
|
|
139
|
+
return dt.isoformat()
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def parse_datetime_rfc3339(dt_str: str) -> "datetime":
|
|
143
|
+
"""Parse RFC 3339 datetime string.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
dt_str: RFC 3339 datetime string.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
datetime object.
|
|
150
|
+
"""
|
|
151
|
+
if dt_str.endswith("Z"):
|
|
152
|
+
dt_str = dt_str[:-1] + "+00:00"
|
|
153
|
+
return datetime.fromisoformat(dt_str)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
_TYPE_CONVERTERS: Final[dict[str, Callable[[str], Any]]] = {
|
|
157
|
+
"uuid": convert_uuid,
|
|
158
|
+
"iso_datetime": convert_iso_datetime,
|
|
159
|
+
"iso_date": convert_iso_date,
|
|
160
|
+
"iso_time": convert_iso_time,
|
|
161
|
+
"json": convert_json,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class _CachedConverter:
|
|
166
|
+
__slots__ = ("_cached", "_converter", "_special_chars")
|
|
167
|
+
|
|
168
|
+
def __init__(self, converter: "CachedOutputConverter", special_chars: "frozenset[str]", cache_size: int) -> None:
|
|
169
|
+
self._converter = converter
|
|
170
|
+
self._special_chars = special_chars
|
|
171
|
+
self._cached = lru_cache(maxsize=cache_size)(self._convert)
|
|
172
|
+
|
|
173
|
+
def _convert(self, value: str) -> "Any":
|
|
174
|
+
if not value or not any(c in value for c in self._special_chars):
|
|
175
|
+
return value
|
|
176
|
+
detected_type = self._converter.detect_type(value)
|
|
177
|
+
if detected_type:
|
|
178
|
+
return self._converter._convert_detected(value, detected_type) # pyright: ignore[reportPrivateUsage]
|
|
179
|
+
return value
|
|
180
|
+
|
|
181
|
+
def __call__(self, value: str) -> "Any":
|
|
182
|
+
return self._cached(value)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _make_cached_converter(
|
|
186
|
+
converter: "CachedOutputConverter", special_chars: "frozenset[str]", cache_size: int
|
|
187
|
+
) -> "Callable[[str], Any]":
|
|
188
|
+
"""Create a cached conversion function for an output converter.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
converter: The output converter instance to use for type detection/conversion.
|
|
192
|
+
special_chars: Characters that trigger type detection.
|
|
193
|
+
cache_size: Maximum entries in the LRU cache.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
A cached function that converts string values.
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
return _CachedConverter(converter, special_chars, cache_size)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
203
|
+
class BaseTypeConverter:
|
|
204
|
+
"""Universal type detection and conversion for all adapters."""
|
|
205
|
+
|
|
206
|
+
__slots__ = ()
|
|
207
|
+
|
|
208
|
+
def detect_type(self, value: str) -> str | None:
|
|
209
|
+
"""Detect special types from string values.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
value: String value to analyze.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Type name if detected, None otherwise.
|
|
216
|
+
"""
|
|
217
|
+
if not isinstance(value, str): # pyright: ignore
|
|
218
|
+
return None
|
|
219
|
+
if not value:
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
match = SPECIAL_TYPE_REGEX.match(value)
|
|
223
|
+
if not match:
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
return next((key for key, match_value in match.groupdict().items() if match_value), None)
|
|
227
|
+
|
|
228
|
+
def convert_value(self, value: str, detected_type: str) -> "Any":
|
|
229
|
+
"""Convert string value to appropriate Python type.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
value: String value to convert.
|
|
233
|
+
detected_type: Detected type name.
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
Converted value in appropriate Python type.
|
|
237
|
+
"""
|
|
238
|
+
converter = _TYPE_CONVERTERS.get(detected_type)
|
|
239
|
+
if converter:
|
|
240
|
+
return converter(value)
|
|
241
|
+
return value
|
|
242
|
+
|
|
243
|
+
def convert_if_detected(self, value: "Any") -> "Any":
|
|
244
|
+
"""Convert value only if special type detected, else return original.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
value: Value to potentially convert.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Converted value if special type detected, original value otherwise.
|
|
251
|
+
"""
|
|
252
|
+
if not isinstance(value, str):
|
|
253
|
+
return value
|
|
254
|
+
|
|
255
|
+
if not any(c in value for c in DEFAULT_DETECTION_CHARS):
|
|
256
|
+
return value
|
|
257
|
+
|
|
258
|
+
detected_type = self.detect_type(value)
|
|
259
|
+
if detected_type:
|
|
260
|
+
try:
|
|
261
|
+
return self.convert_value(value, detected_type)
|
|
262
|
+
except Exception:
|
|
263
|
+
return value
|
|
264
|
+
return value
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
268
|
+
class CachedOutputConverter(BaseTypeConverter):
|
|
269
|
+
"""Base class for converting database results to Python types."""
|
|
270
|
+
|
|
271
|
+
__slots__ = ("_convert_cache", "_special_chars")
|
|
272
|
+
|
|
273
|
+
def __init__(self, special_chars: "frozenset[str] | None" = None, cache_size: int = DEFAULT_CACHE_SIZE) -> None:
|
|
274
|
+
"""Initialize converter with caching.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
special_chars: Characters that trigger type detection.
|
|
278
|
+
cache_size: Maximum entries in LRU cache.
|
|
279
|
+
"""
|
|
280
|
+
super().__init__()
|
|
281
|
+
self._special_chars = special_chars if special_chars is not None else DEFAULT_SPECIAL_CHARS
|
|
282
|
+
self._convert_cache = _make_cached_converter(self, self._special_chars, cache_size)
|
|
283
|
+
|
|
284
|
+
def _convert_detected(self, value: str, detected_type: str) -> "Any":
|
|
285
|
+
"""Convert value with detected type. Override for adapter-specific logic.
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
value: String value to convert.
|
|
289
|
+
detected_type: Detected type name from detect_type().
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
Converted value, or original value on conversion failure.
|
|
293
|
+
"""
|
|
294
|
+
try:
|
|
295
|
+
return self.convert_value(value, detected_type)
|
|
296
|
+
except Exception:
|
|
297
|
+
return value
|
|
298
|
+
|
|
299
|
+
def convert(self, value: "Any") -> "Any":
|
|
300
|
+
"""Convert value using cached detection and conversion.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
value: Value to potentially convert.
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
Converted value if string with special type, original otherwise.
|
|
307
|
+
"""
|
|
308
|
+
if not isinstance(value, str):
|
|
309
|
+
return value
|
|
310
|
+
return self._convert_cache(value)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@mypyc_attr(allow_interpreted_subclasses=True)
|
|
314
|
+
class BaseInputConverter:
|
|
315
|
+
"""Base class for converting Python params to database format."""
|
|
316
|
+
|
|
317
|
+
__slots__ = ()
|
|
318
|
+
|
|
319
|
+
def convert_params(self, params: "dict[str, Any] | None") -> "dict[str, Any] | None":
|
|
320
|
+
"""Convert parameters for database execution.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
params: Dictionary of parameters to convert.
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
Converted parameters dictionary, or None if input was None.
|
|
327
|
+
"""
|
|
328
|
+
return params
|
|
329
|
+
|
|
330
|
+
def convert_value(self, value: "Any") -> "Any":
|
|
331
|
+
"""Convert a single parameter value.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
value: Value to convert.
|
|
335
|
+
|
|
336
|
+
Returns:
|
|
337
|
+
Converted value.
|
|
338
|
+
"""
|
|
339
|
+
return value
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Centralized data dictionary helpers."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.data_dictionary._loader import DataDictionaryLoader, get_data_dictionary_loader
|
|
4
|
+
from sqlspec.data_dictionary._registry import (
|
|
5
|
+
get_dialect_config,
|
|
6
|
+
list_registered_dialects,
|
|
7
|
+
normalize_dialect_name,
|
|
8
|
+
register_dialect,
|
|
9
|
+
)
|
|
10
|
+
from sqlspec.data_dictionary._types import DialectConfig, FeatureFlags, FeatureVersions
|
|
11
|
+
|
|
12
|
+
__all__ = (
|
|
13
|
+
"DataDictionaryLoader",
|
|
14
|
+
"DialectConfig",
|
|
15
|
+
"FeatureFlags",
|
|
16
|
+
"FeatureVersions",
|
|
17
|
+
"get_data_dictionary_loader",
|
|
18
|
+
"get_dialect_config",
|
|
19
|
+
"list_registered_dialects",
|
|
20
|
+
"normalize_dialect_name",
|
|
21
|
+
"register_dialect",
|
|
22
|
+
)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from sqlspec.data_dictionary._registry import get_dialect_config
|
|
5
|
+
from sqlspec.exceptions import SQLFileNotFoundError
|
|
6
|
+
from sqlspec.loader import SQLFileLoader
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from sqlspec.core.statement import SQL
|
|
10
|
+
from sqlspec.data_dictionary._types import DialectConfig
|
|
11
|
+
|
|
12
|
+
__all__ = ("DataDictionaryLoader", "get_data_dictionary_loader")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
SQL_DIR = Path(__file__).parent / "sql"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DataDictionaryLoader:
|
|
19
|
+
"""Loads and manages data dictionary SQL for all dialects."""
|
|
20
|
+
|
|
21
|
+
__slots__ = ("_loaded_dialects", "_sql_loaders")
|
|
22
|
+
|
|
23
|
+
def __init__(self) -> None:
|
|
24
|
+
"""Initialize the data dictionary loader."""
|
|
25
|
+
self._sql_loaders: dict[str, SQLFileLoader] = {}
|
|
26
|
+
self._loaded_dialects: set[str] = set()
|
|
27
|
+
|
|
28
|
+
def _get_loader(self, dialect: str) -> "SQLFileLoader":
|
|
29
|
+
"""Return or create a SQL loader for a dialect.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
dialect: Dialect name.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
SQLFileLoader instance.
|
|
36
|
+
"""
|
|
37
|
+
loader = self._sql_loaders.get(dialect)
|
|
38
|
+
if loader is None:
|
|
39
|
+
loader = SQLFileLoader()
|
|
40
|
+
self._sql_loaders[dialect] = loader
|
|
41
|
+
return loader
|
|
42
|
+
|
|
43
|
+
def _ensure_dialect_loaded(self, dialect: str) -> None:
|
|
44
|
+
"""Lazy load SQL files for a dialect.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
dialect: Dialect name.
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
SQLFileNotFoundError: When the dialect SQL directory is missing.
|
|
51
|
+
"""
|
|
52
|
+
if dialect in self._loaded_dialects:
|
|
53
|
+
return
|
|
54
|
+
dialect_path = SQL_DIR / dialect
|
|
55
|
+
if not dialect_path.exists():
|
|
56
|
+
raise SQLFileNotFoundError(str(dialect_path))
|
|
57
|
+
loader = self._get_loader(dialect)
|
|
58
|
+
loader.load_sql(dialect_path)
|
|
59
|
+
self._loaded_dialects.add(dialect)
|
|
60
|
+
|
|
61
|
+
def get_query(self, dialect: str, query_name: str) -> "SQL":
|
|
62
|
+
"""Get SQL query for a specific dialect and operation.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
dialect: Dialect name.
|
|
66
|
+
query_name: Query name to fetch.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
SQL object for the named query.
|
|
70
|
+
"""
|
|
71
|
+
self._ensure_dialect_loaded(dialect)
|
|
72
|
+
loader = self._get_loader(dialect)
|
|
73
|
+
return loader.get_sql(query_name)
|
|
74
|
+
|
|
75
|
+
def get_query_text(self, dialect: str, query_name: str) -> str:
|
|
76
|
+
"""Get raw SQL text for a specific dialect and operation.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
dialect: Dialect name.
|
|
80
|
+
query_name: Query name to fetch.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Raw SQL text for the named query.
|
|
84
|
+
"""
|
|
85
|
+
self._ensure_dialect_loaded(dialect)
|
|
86
|
+
loader = self._get_loader(dialect)
|
|
87
|
+
return loader.get_query_text(query_name)
|
|
88
|
+
|
|
89
|
+
def get_dialect_config(self, dialect: str) -> "DialectConfig":
|
|
90
|
+
"""Get static configuration for a dialect.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
dialect: Dialect name.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
DialectConfig for the dialect.
|
|
97
|
+
"""
|
|
98
|
+
return get_dialect_config(dialect)
|
|
99
|
+
|
|
100
|
+
def list_dialects(self) -> "list[str]":
|
|
101
|
+
"""List available SQL dialects.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
List of dialect names with SQL directories.
|
|
105
|
+
"""
|
|
106
|
+
if not SQL_DIR.exists():
|
|
107
|
+
return []
|
|
108
|
+
return sorted([path.name for path in SQL_DIR.iterdir() if path.is_dir()])
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
_loader_instance: DataDictionaryLoader | None = None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def get_data_dictionary_loader() -> DataDictionaryLoader:
|
|
115
|
+
"""Get singleton data dictionary loader instance.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
DataDictionaryLoader singleton.
|
|
119
|
+
"""
|
|
120
|
+
global _loader_instance
|
|
121
|
+
if _loader_instance is None:
|
|
122
|
+
_loader_instance = DataDictionaryLoader()
|
|
123
|
+
return _loader_instance
|
|
Binary file
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from sqlspec.data_dictionary._types import DialectConfig
|
|
6
|
+
|
|
7
|
+
__all__ = ("get_dialect_config", "list_registered_dialects", "normalize_dialect_name", "register_dialect")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
_DIALECT_CONFIGS: dict[str, "DialectConfig"] = {}
|
|
11
|
+
_DIALECTS_LOADED = False
|
|
12
|
+
|
|
13
|
+
DIALECT_ALIASES: dict[str, str] = {"postgresql": "postgres", "mariadb": "mysql", "cockroach": "cockroachdb"}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def normalize_dialect_name(dialect: str) -> str:
|
|
17
|
+
"""Normalize dialect names to canonical registry keys.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
dialect: Input dialect name.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Canonical dialect key.
|
|
24
|
+
"""
|
|
25
|
+
normalized = dialect.lower()
|
|
26
|
+
return DIALECT_ALIASES.get(normalized, normalized)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _load_default_dialects() -> None:
|
|
30
|
+
"""Load built-in dialect configurations."""
|
|
31
|
+
global _DIALECTS_LOADED
|
|
32
|
+
if _DIALECTS_LOADED:
|
|
33
|
+
return
|
|
34
|
+
importlib.import_module("sqlspec.data_dictionary.dialects")
|
|
35
|
+
_DIALECTS_LOADED = True # pyright: ignore
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def register_dialect(config: "DialectConfig") -> None:
|
|
39
|
+
"""Register a dialect configuration.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
config: Dialect configuration to register.
|
|
43
|
+
"""
|
|
44
|
+
_DIALECT_CONFIGS[config.name] = config
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_dialect_config(dialect: str) -> "DialectConfig":
|
|
48
|
+
"""Get configuration for a dialect.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
dialect: Dialect name.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
DialectConfig for the requested dialect.
|
|
55
|
+
|
|
56
|
+
Raises:
|
|
57
|
+
ValueError: When the dialect is unknown.
|
|
58
|
+
"""
|
|
59
|
+
_load_default_dialects()
|
|
60
|
+
normalized = normalize_dialect_name(dialect)
|
|
61
|
+
if normalized not in _DIALECT_CONFIGS:
|
|
62
|
+
msg = f"Unknown dialect: {dialect}. Available: {', '.join(sorted(_DIALECT_CONFIGS.keys()))}"
|
|
63
|
+
raise ValueError(msg)
|
|
64
|
+
return _DIALECT_CONFIGS[normalized]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def list_registered_dialects() -> "list[str]":
|
|
68
|
+
"""Return registered dialect names.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
List of registered dialect names.
|
|
72
|
+
"""
|
|
73
|
+
_load_default_dialects()
|
|
74
|
+
return sorted(_DIALECT_CONFIGS.keys())
|
|
Binary file
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, TypedDict, cast
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from re import Pattern
|
|
5
|
+
|
|
6
|
+
from sqlspec.typing import VersionInfo
|
|
7
|
+
|
|
8
|
+
__all__ = ("DialectConfig", "FeatureFlags", "FeatureVersions")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FeatureFlags(TypedDict, total=False):
|
|
12
|
+
"""Typed feature flags for data dictionary dialects."""
|
|
13
|
+
|
|
14
|
+
supports_arrays: bool
|
|
15
|
+
supports_clustering: bool
|
|
16
|
+
supports_cte: bool
|
|
17
|
+
supports_generators: bool
|
|
18
|
+
supports_geography: bool
|
|
19
|
+
supports_in_memory: bool
|
|
20
|
+
supports_index_clustering: bool
|
|
21
|
+
supports_interleaved_tables: bool
|
|
22
|
+
supports_json: bool
|
|
23
|
+
supports_maps: bool
|
|
24
|
+
supports_partitioning: bool
|
|
25
|
+
supports_prepared_statements: bool
|
|
26
|
+
supports_returning: bool
|
|
27
|
+
supports_schemas: bool
|
|
28
|
+
supports_structs: bool
|
|
29
|
+
supports_transactions: bool
|
|
30
|
+
supports_upsert: bool
|
|
31
|
+
supports_uuid: bool
|
|
32
|
+
supports_window_functions: bool
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class FeatureVersions(TypedDict, total=False):
|
|
36
|
+
"""Typed feature version requirements for data dictionary dialects."""
|
|
37
|
+
|
|
38
|
+
supports_cte: "VersionInfo"
|
|
39
|
+
supports_json: "VersionInfo"
|
|
40
|
+
supports_jsonb: "VersionInfo"
|
|
41
|
+
supports_partitioning: "VersionInfo"
|
|
42
|
+
supports_returning: "VersionInfo"
|
|
43
|
+
supports_upsert: "VersionInfo"
|
|
44
|
+
supports_window_functions: "VersionInfo"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class DialectConfig:
|
|
48
|
+
"""Static configuration for a database dialect."""
|
|
49
|
+
|
|
50
|
+
__slots__ = (
|
|
51
|
+
"default_schema",
|
|
52
|
+
"feature_flags",
|
|
53
|
+
"feature_versions",
|
|
54
|
+
"name",
|
|
55
|
+
"parameter_style",
|
|
56
|
+
"type_mappings",
|
|
57
|
+
"version_pattern",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def __init__(
|
|
61
|
+
self,
|
|
62
|
+
name: str,
|
|
63
|
+
feature_versions: "FeatureVersions",
|
|
64
|
+
feature_flags: "FeatureFlags",
|
|
65
|
+
type_mappings: "dict[str, str]",
|
|
66
|
+
version_pattern: "Pattern[str]",
|
|
67
|
+
default_schema: "str | None" = None,
|
|
68
|
+
parameter_style: str = "named",
|
|
69
|
+
) -> None:
|
|
70
|
+
"""Initialize a dialect configuration.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
name: Dialect name used for lookups.
|
|
74
|
+
feature_versions: Minimum versions required for features.
|
|
75
|
+
feature_flags: Static boolean feature flags.
|
|
76
|
+
type_mappings: Logical type to dialect type mapping.
|
|
77
|
+
version_pattern: Regex used to parse version strings.
|
|
78
|
+
default_schema: Default schema for dialect.
|
|
79
|
+
parameter_style: Default parameter style for dialect SQL.
|
|
80
|
+
"""
|
|
81
|
+
self.name: str = name
|
|
82
|
+
self.feature_versions: FeatureVersions = feature_versions
|
|
83
|
+
self.feature_flags: FeatureFlags = feature_flags
|
|
84
|
+
self.type_mappings: dict[str, str] = type_mappings
|
|
85
|
+
self.version_pattern: Pattern[str] = version_pattern
|
|
86
|
+
self.default_schema: str | None = default_schema
|
|
87
|
+
self.parameter_style: str = parameter_style
|
|
88
|
+
|
|
89
|
+
def get_feature_flag(self, feature: str) -> "bool | None":
|
|
90
|
+
"""Return a feature flag value if defined.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
feature: Feature flag name.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
Feature flag value or None if unknown.
|
|
97
|
+
"""
|
|
98
|
+
return cast("bool | None", self.feature_flags.get(feature))
|
|
99
|
+
|
|
100
|
+
def get_feature_version(self, feature: str) -> "VersionInfo | None":
|
|
101
|
+
"""Return required version for a feature if defined.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
feature: Feature version name.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
VersionInfo if defined, otherwise None.
|
|
108
|
+
"""
|
|
109
|
+
return cast("VersionInfo | None", self.feature_versions.get(feature))
|
|
110
|
+
|
|
111
|
+
def get_optimal_type(self, logical_type: str) -> str:
|
|
112
|
+
"""Return the dialect-specific type for a logical type.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
logical_type: Logical type name.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Dialect-specific type string.
|
|
119
|
+
"""
|
|
120
|
+
default_type = self.type_mappings.get("text", "TEXT")
|
|
121
|
+
return self.type_mappings.get(logical_type, default_type)
|