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,257 @@
|
|
|
1
|
+
"""DuckDB adapter compiled helpers."""
|
|
2
|
+
|
|
3
|
+
from datetime import date, datetime
|
|
4
|
+
from decimal import Decimal
|
|
5
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
6
|
+
|
|
7
|
+
from sqlspec.adapters.duckdb.type_converter import DuckDBOutputConverter
|
|
8
|
+
from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
|
|
9
|
+
from sqlspec.exceptions import (
|
|
10
|
+
CheckViolationError,
|
|
11
|
+
DataError,
|
|
12
|
+
ForeignKeyViolationError,
|
|
13
|
+
IntegrityError,
|
|
14
|
+
NotFoundError,
|
|
15
|
+
NotNullViolationError,
|
|
16
|
+
OperationalError,
|
|
17
|
+
SQLParsingError,
|
|
18
|
+
SQLSpecError,
|
|
19
|
+
UniqueViolationError,
|
|
20
|
+
)
|
|
21
|
+
from sqlspec.utils.serializers import to_json
|
|
22
|
+
from sqlspec.utils.type_converters import build_decimal_converter, build_time_iso_converter
|
|
23
|
+
from sqlspec.utils.type_guards import has_rowcount
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from collections.abc import Callable, Mapping
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
__all__ = (
|
|
30
|
+
"apply_driver_features",
|
|
31
|
+
"build_connection_config",
|
|
32
|
+
"build_profile",
|
|
33
|
+
"build_statement_config",
|
|
34
|
+
"collect_rows",
|
|
35
|
+
"create_mapped_exception",
|
|
36
|
+
"default_statement_config",
|
|
37
|
+
"driver_profile",
|
|
38
|
+
"normalize_execute_parameters",
|
|
39
|
+
"resolve_rowcount",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
_TIME_TO_ISO = build_time_iso_converter()
|
|
44
|
+
_DECIMAL_TO_STRING = build_decimal_converter(mode="string")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _bool_to_int(value: bool) -> int:
|
|
48
|
+
return int(value)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _coerce_duckdb_rows(fetched_data: "list[Any]", column_names: "list[str]") -> "list[dict[str, Any]] | list[Any]":
|
|
52
|
+
"""Convert row tuples into dictionaries keyed by column names.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
fetched_data: Raw rows returned from DuckDB.
|
|
56
|
+
column_names: Column names from cursor metadata.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
List of dictionaries when rows are tuple-based, otherwise the original rows.
|
|
60
|
+
"""
|
|
61
|
+
if fetched_data and isinstance(fetched_data[0], tuple):
|
|
62
|
+
return [dict(zip(column_names, row, strict=False)) for row in fetched_data]
|
|
63
|
+
return fetched_data
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def collect_rows(
|
|
67
|
+
fetched_data: "list[Any] | None", description: "list[Any] | None"
|
|
68
|
+
) -> "tuple[list[dict[str, Any]] | list[Any], list[str]]":
|
|
69
|
+
"""Collect DuckDB rows and column names.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
fetched_data: Rows returned from cursor.fetchall().
|
|
73
|
+
description: Cursor description metadata.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Tuple of (rows, column_names).
|
|
77
|
+
"""
|
|
78
|
+
if not description:
|
|
79
|
+
return [], []
|
|
80
|
+
column_names = [col[0] for col in description]
|
|
81
|
+
if not fetched_data:
|
|
82
|
+
return [], column_names
|
|
83
|
+
return _coerce_duckdb_rows(fetched_data, column_names), column_names
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str, Any]":
|
|
87
|
+
"""Build connection configuration for pool creation.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
connection_config: Raw connection configuration mapping.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Dictionary with connection parameters.
|
|
94
|
+
"""
|
|
95
|
+
excluded_keys = {
|
|
96
|
+
"pool_min_size",
|
|
97
|
+
"pool_max_size",
|
|
98
|
+
"pool_timeout",
|
|
99
|
+
"pool_recycle_seconds",
|
|
100
|
+
"health_check_interval",
|
|
101
|
+
"extra",
|
|
102
|
+
}
|
|
103
|
+
return {key: value for key, value in connection_config.items() if value is not None and key not in excluded_keys}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def normalize_execute_parameters(parameters: Any) -> Any:
|
|
107
|
+
"""Normalize parameters for DuckDB execute calls.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
parameters: Prepared parameters payload.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Normalized parameters payload.
|
|
114
|
+
"""
|
|
115
|
+
return parameters or ()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def resolve_rowcount(cursor: Any) -> int:
|
|
119
|
+
"""Resolve rowcount from DuckDB cursor results.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
cursor: DuckDB cursor object.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Rowcount value derived from cursor output.
|
|
126
|
+
"""
|
|
127
|
+
try:
|
|
128
|
+
result = cursor.fetchone()
|
|
129
|
+
if result and isinstance(result, tuple) and len(result) == 1:
|
|
130
|
+
return int(result[0])
|
|
131
|
+
except Exception:
|
|
132
|
+
if has_rowcount(cursor):
|
|
133
|
+
return max(cursor.rowcount, 0)
|
|
134
|
+
return 0
|
|
135
|
+
return 0
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def build_profile() -> "DriverParameterProfile":
|
|
139
|
+
"""Create the DuckDB driver parameter profile."""
|
|
140
|
+
|
|
141
|
+
return DriverParameterProfile(
|
|
142
|
+
name="DuckDB",
|
|
143
|
+
default_style=ParameterStyle.QMARK,
|
|
144
|
+
supported_styles={ParameterStyle.QMARK, ParameterStyle.NUMERIC, ParameterStyle.NAMED_DOLLAR},
|
|
145
|
+
default_execution_style=ParameterStyle.QMARK,
|
|
146
|
+
supported_execution_styles={ParameterStyle.QMARK},
|
|
147
|
+
has_native_list_expansion=True,
|
|
148
|
+
preserve_parameter_format=True,
|
|
149
|
+
needs_static_script_compilation=False,
|
|
150
|
+
allow_mixed_parameter_styles=False,
|
|
151
|
+
preserve_original_params_for_many=False,
|
|
152
|
+
json_serializer_strategy="helper",
|
|
153
|
+
custom_type_coercions={
|
|
154
|
+
bool: _bool_to_int,
|
|
155
|
+
datetime: _TIME_TO_ISO,
|
|
156
|
+
date: _TIME_TO_ISO,
|
|
157
|
+
Decimal: _DECIMAL_TO_STRING,
|
|
158
|
+
},
|
|
159
|
+
default_dialect="duckdb",
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
driver_profile = build_profile()
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def apply_driver_features(
|
|
167
|
+
statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
|
|
168
|
+
) -> "StatementConfig":
|
|
169
|
+
"""Apply DuckDB-specific driver features to statement configuration."""
|
|
170
|
+
if not driver_features:
|
|
171
|
+
return statement_config
|
|
172
|
+
|
|
173
|
+
param_config = statement_config.parameter_config
|
|
174
|
+
json_serializer = driver_features.get("json_serializer")
|
|
175
|
+
if json_serializer:
|
|
176
|
+
param_config = param_config.with_json_serializers(
|
|
177
|
+
cast("Callable[[Any], str]", json_serializer), tuple_strategy="tuple"
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
enable_uuid_conversion = driver_features.get("enable_uuid_conversion", True)
|
|
181
|
+
if not enable_uuid_conversion:
|
|
182
|
+
type_converter = DuckDBOutputConverter(enable_uuid_conversion=enable_uuid_conversion)
|
|
183
|
+
type_coercion_map = dict(param_config.type_coercion_map)
|
|
184
|
+
type_coercion_map[str] = type_converter.convert_if_detected
|
|
185
|
+
param_config = param_config.replace(type_coercion_map=type_coercion_map)
|
|
186
|
+
|
|
187
|
+
if param_config is statement_config.parameter_config:
|
|
188
|
+
return statement_config
|
|
189
|
+
return statement_config.replace(parameter_config=param_config)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _create_duckdb_error(error: Any, error_class: type[SQLSpecError], description: str) -> SQLSpecError:
|
|
193
|
+
"""Create a SQLSpec exception from a DuckDB error.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
error: The original DuckDB exception
|
|
197
|
+
error_class: The SQLSpec exception class to instantiate
|
|
198
|
+
description: Human-readable description of the error type
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
A new SQLSpec exception instance with the original as its cause
|
|
202
|
+
"""
|
|
203
|
+
msg = f"DuckDB {description}: {error}"
|
|
204
|
+
exc = error_class(msg)
|
|
205
|
+
exc.__cause__ = error
|
|
206
|
+
return exc
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def create_mapped_exception(exc_type: Any, error: Any) -> SQLSpecError:
|
|
210
|
+
"""Map DuckDB exceptions to SQLSpec exceptions.
|
|
211
|
+
|
|
212
|
+
This is a factory function that returns an exception instance rather than
|
|
213
|
+
raising. This pattern is more robust for use in __exit__ handlers and
|
|
214
|
+
avoids issues with exception control flow in different Python versions.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
exc_type: The exception type (class)
|
|
218
|
+
error: The DuckDB exception to map
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
A SQLSpec exception that wraps the original error
|
|
222
|
+
"""
|
|
223
|
+
error_msg = str(error).lower()
|
|
224
|
+
exc_name = exc_type.__name__.lower()
|
|
225
|
+
|
|
226
|
+
if "constraintexception" in exc_name:
|
|
227
|
+
if "unique" in error_msg or "duplicate" in error_msg:
|
|
228
|
+
return _create_duckdb_error(error, UniqueViolationError, "unique constraint violation")
|
|
229
|
+
if "foreign key" in error_msg or "violates foreign key" in error_msg:
|
|
230
|
+
return _create_duckdb_error(error, ForeignKeyViolationError, "foreign key constraint violation")
|
|
231
|
+
if "not null" in error_msg or "null value" in error_msg:
|
|
232
|
+
return _create_duckdb_error(error, NotNullViolationError, "not-null constraint violation")
|
|
233
|
+
if "check constraint" in error_msg or "check condition" in error_msg:
|
|
234
|
+
return _create_duckdb_error(error, CheckViolationError, "check constraint violation")
|
|
235
|
+
return _create_duckdb_error(error, IntegrityError, "integrity constraint violation")
|
|
236
|
+
|
|
237
|
+
if "catalogexception" in exc_name:
|
|
238
|
+
return _create_duckdb_error(error, NotFoundError, "catalog error")
|
|
239
|
+
if "parserexception" in exc_name or "binderexception" in exc_name:
|
|
240
|
+
return _create_duckdb_error(error, SQLParsingError, "SQL parsing error")
|
|
241
|
+
if "ioexception" in exc_name:
|
|
242
|
+
return _create_duckdb_error(error, OperationalError, "operational error")
|
|
243
|
+
if "conversionexception" in exc_name or "type mismatch" in error_msg:
|
|
244
|
+
return _create_duckdb_error(error, DataError, "data error")
|
|
245
|
+
return _create_duckdb_error(error, SQLSpecError, "database error")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def build_statement_config(*, json_serializer: "Callable[[Any], str] | None" = None) -> StatementConfig:
|
|
249
|
+
"""Construct the DuckDB statement configuration with optional JSON serializer."""
|
|
250
|
+
serializer = json_serializer or to_json
|
|
251
|
+
profile = driver_profile
|
|
252
|
+
return build_statement_config_from_profile(
|
|
253
|
+
profile, statement_overrides={"dialect": "duckdb"}, json_serializer=serializer
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
default_statement_config = build_statement_config()
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""DuckDB-specific data dictionary for metadata queries."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from mypy_extensions import mypyc_attr
|
|
6
|
+
|
|
7
|
+
from sqlspec.driver import SyncDataDictionaryBase
|
|
8
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
9
|
+
|
|
10
|
+
__all__ = ("DuckDBDataDictionary",)
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from sqlspec.adapters.duckdb.driver import DuckDBDriver
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
17
|
+
class DuckDBDataDictionary(SyncDataDictionaryBase):
|
|
18
|
+
"""DuckDB-specific sync data dictionary."""
|
|
19
|
+
|
|
20
|
+
dialect: ClassVar[str] = "duckdb"
|
|
21
|
+
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
def get_version(self, driver: "DuckDBDriver") -> "VersionInfo | None":
|
|
26
|
+
"""Get DuckDB database version information.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
driver: DuckDB driver instance.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
DuckDB version information or None if detection fails.
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
driver_id = id(driver)
|
|
36
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
37
|
+
if driver_id in self._version_fetch_attempted:
|
|
38
|
+
return self._version_cache.get(driver_id)
|
|
39
|
+
# Not cached, fetch from database
|
|
40
|
+
|
|
41
|
+
version_value = driver.select_value_or_none(self.get_query("version"))
|
|
42
|
+
if not version_value:
|
|
43
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
44
|
+
self.cache_version(driver_id, None)
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
|
|
48
|
+
if version_info is None:
|
|
49
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
50
|
+
self.cache_version(driver_id, None)
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
54
|
+
self.cache_version(driver_id, version_info)
|
|
55
|
+
return version_info
|
|
56
|
+
|
|
57
|
+
def get_feature_flag(self, driver: "DuckDBDriver", feature: str) -> bool:
|
|
58
|
+
"""Check if DuckDB database supports a specific feature.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
driver: DuckDB driver instance.
|
|
62
|
+
feature: Feature name to check.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
True if feature is supported, False otherwise.
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
version_info = self.get_version(driver)
|
|
69
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
70
|
+
|
|
71
|
+
def get_optimal_type(self, driver: "DuckDBDriver", type_category: str) -> str:
|
|
72
|
+
"""Get optimal DuckDB type for a category.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
driver: DuckDB driver instance.
|
|
76
|
+
type_category: Type category.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
DuckDB-specific type name.
|
|
80
|
+
|
|
81
|
+
"""
|
|
82
|
+
_ = driver
|
|
83
|
+
return self.get_dialect_config().get_optimal_type(type_category)
|
|
84
|
+
|
|
85
|
+
def get_tables(self, driver: "DuckDBDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
86
|
+
"""Get tables sorted by topological dependency order using DuckDB catalog."""
|
|
87
|
+
schema_name = self.resolve_schema(schema)
|
|
88
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
89
|
+
return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata)
|
|
90
|
+
|
|
91
|
+
def get_columns(
|
|
92
|
+
self, driver: "DuckDBDriver", table: "str | None" = None, schema: "str | None" = None
|
|
93
|
+
) -> "list[ColumnMetadata]":
|
|
94
|
+
"""Get column information for a table or schema."""
|
|
95
|
+
schema_name = self.resolve_schema(schema)
|
|
96
|
+
if table is None:
|
|
97
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
98
|
+
return driver.select(
|
|
99
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
103
|
+
return driver.select(
|
|
104
|
+
self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def get_indexes(
|
|
108
|
+
self, driver: "DuckDBDriver", table: "str | None" = None, schema: "str | None" = None
|
|
109
|
+
) -> "list[IndexMetadata]":
|
|
110
|
+
"""Get index metadata for a table or schema."""
|
|
111
|
+
schema_name = self.resolve_schema(schema)
|
|
112
|
+
if table is None:
|
|
113
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
114
|
+
return driver.select(
|
|
115
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
119
|
+
return driver.select(
|
|
120
|
+
self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
def get_foreign_keys(
|
|
124
|
+
self, driver: "DuckDBDriver", table: "str | None" = None, schema: "str | None" = None
|
|
125
|
+
) -> "list[ForeignKeyMetadata]":
|
|
126
|
+
"""Get foreign key metadata."""
|
|
127
|
+
schema_name = self.resolve_schema(schema)
|
|
128
|
+
if table is None:
|
|
129
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
130
|
+
return driver.select(
|
|
131
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
135
|
+
return driver.select(
|
|
136
|
+
self.get_query("foreign_keys_by_table"),
|
|
137
|
+
table_name=table,
|
|
138
|
+
schema_name=schema_name,
|
|
139
|
+
schema_type=ForeignKeyMetadata,
|
|
140
|
+
)
|