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,529 @@
|
|
|
1
|
+
"""ADBC driver implementation for Arrow Database Connectivity.
|
|
2
|
+
|
|
3
|
+
Provides database connectivity through ADBC with support for multiple
|
|
4
|
+
database dialects, parameter style conversion, and transaction management.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import contextlib
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Literal, cast
|
|
9
|
+
|
|
10
|
+
from sqlspec.adapters.adbc._typing import AdbcSessionContext
|
|
11
|
+
from sqlspec.adapters.adbc.core import (
|
|
12
|
+
collect_rows,
|
|
13
|
+
create_mapped_exception,
|
|
14
|
+
detect_dialect,
|
|
15
|
+
driver_profile,
|
|
16
|
+
get_statement_config,
|
|
17
|
+
handle_postgres_rollback,
|
|
18
|
+
is_postgres_dialect,
|
|
19
|
+
normalize_postgres_empty_parameters,
|
|
20
|
+
normalize_script_rowcount,
|
|
21
|
+
prepare_postgres_parameters,
|
|
22
|
+
resolve_dialect_name,
|
|
23
|
+
resolve_parameter_casts,
|
|
24
|
+
resolve_rowcount,
|
|
25
|
+
)
|
|
26
|
+
from sqlspec.adapters.adbc.data_dictionary import AdbcDataDictionary
|
|
27
|
+
from sqlspec.core import SQL, StatementConfig, build_arrow_result_from_table, get_cache_config, register_driver_profile
|
|
28
|
+
from sqlspec.driver import SyncDriverAdapterBase
|
|
29
|
+
from sqlspec.exceptions import DatabaseConnectionError, SQLSpecError
|
|
30
|
+
from sqlspec.utils.logging import get_logger
|
|
31
|
+
from sqlspec.utils.module_loader import ensure_pyarrow
|
|
32
|
+
from sqlspec.utils.serializers import to_json
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from collections.abc import Callable
|
|
36
|
+
|
|
37
|
+
from adbc_driver_manager.dbapi import Cursor
|
|
38
|
+
|
|
39
|
+
from sqlspec.adapters.adbc._typing import AdbcConnection
|
|
40
|
+
from sqlspec.builder import QueryBuilder
|
|
41
|
+
from sqlspec.core import ArrowResult, Statement, StatementFilter
|
|
42
|
+
from sqlspec.driver import ExecutionResult
|
|
43
|
+
from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
|
|
44
|
+
from sqlspec.typing import ArrowReturnFormat, StatementParameters
|
|
45
|
+
|
|
46
|
+
__all__ = ("AdbcCursor", "AdbcDriver", "AdbcExceptionHandler", "AdbcSessionContext")
|
|
47
|
+
|
|
48
|
+
logger = get_logger("sqlspec.adapters.adbc")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class AdbcCursor:
|
|
52
|
+
"""Context manager for cursor management."""
|
|
53
|
+
|
|
54
|
+
__slots__ = ("connection", "cursor")
|
|
55
|
+
|
|
56
|
+
def __init__(self, connection: "AdbcConnection") -> None:
|
|
57
|
+
self.connection = connection
|
|
58
|
+
self.cursor: Cursor | None = None
|
|
59
|
+
|
|
60
|
+
def __enter__(self) -> "Cursor":
|
|
61
|
+
self.cursor = self.connection.cursor()
|
|
62
|
+
return self.cursor
|
|
63
|
+
|
|
64
|
+
def __exit__(self, *_: Any) -> None:
|
|
65
|
+
if self.cursor is not None:
|
|
66
|
+
with contextlib.suppress(Exception):
|
|
67
|
+
self.cursor.close() # type: ignore[no-untyped-call]
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class AdbcExceptionHandler:
|
|
71
|
+
"""Context manager for handling ADBC database exceptions.
|
|
72
|
+
|
|
73
|
+
ADBC propagates underlying database errors. Exception mapping
|
|
74
|
+
depends on the specific ADBC driver being used.
|
|
75
|
+
|
|
76
|
+
Uses deferred exception pattern for mypyc compatibility: exceptions
|
|
77
|
+
are stored in pending_exception rather than raised from __exit__
|
|
78
|
+
to avoid ABI boundary violations with compiled code.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
__slots__ = ("pending_exception",)
|
|
82
|
+
|
|
83
|
+
def __init__(self) -> None:
|
|
84
|
+
self.pending_exception: Exception | None = None
|
|
85
|
+
|
|
86
|
+
def __enter__(self) -> "AdbcExceptionHandler":
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
90
|
+
_ = exc_tb
|
|
91
|
+
if exc_type is None:
|
|
92
|
+
return False
|
|
93
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class AdbcDriver(SyncDriverAdapterBase):
|
|
98
|
+
"""ADBC driver for Arrow Database Connectivity.
|
|
99
|
+
|
|
100
|
+
Provides database connectivity through ADBC with support for multiple
|
|
101
|
+
database dialects, parameter style conversion, and transaction management.
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
__slots__ = (
|
|
105
|
+
"_data_dictionary",
|
|
106
|
+
"_detected_dialect",
|
|
107
|
+
"_dialect_name",
|
|
108
|
+
"_is_postgres",
|
|
109
|
+
"_json_serializer",
|
|
110
|
+
"dialect",
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def __init__(
|
|
114
|
+
self,
|
|
115
|
+
connection: "AdbcConnection",
|
|
116
|
+
statement_config: "StatementConfig | None" = None,
|
|
117
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
118
|
+
) -> None:
|
|
119
|
+
self._detected_dialect = detect_dialect(connection, logger)
|
|
120
|
+
|
|
121
|
+
if statement_config is None:
|
|
122
|
+
base_config = get_statement_config(self._detected_dialect)
|
|
123
|
+
statement_config = base_config.replace(enable_caching=get_cache_config().compiled_cache_enabled)
|
|
124
|
+
|
|
125
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
126
|
+
self.dialect = statement_config.dialect
|
|
127
|
+
self._dialect_name = resolve_dialect_name(self.dialect)
|
|
128
|
+
self._is_postgres = is_postgres_dialect(self._dialect_name)
|
|
129
|
+
self._json_serializer = cast("Callable[[Any], str]", self.driver_features.get("json_serializer", to_json))
|
|
130
|
+
self._data_dictionary: AdbcDataDictionary | None = None
|
|
131
|
+
|
|
132
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
133
|
+
# CORE DISPATCH METHODS
|
|
134
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
def dispatch_execute(self, cursor: "Cursor", statement: SQL) -> "ExecutionResult":
|
|
137
|
+
"""Execute single SQL statement.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
cursor: Database cursor
|
|
141
|
+
statement: SQL statement to execute
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Execution result with data or row count
|
|
145
|
+
"""
|
|
146
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
147
|
+
|
|
148
|
+
parameter_casts = resolve_parameter_casts(statement)
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
if self._is_postgres:
|
|
152
|
+
formatted_params = prepare_postgres_parameters(
|
|
153
|
+
prepared_parameters,
|
|
154
|
+
parameter_casts,
|
|
155
|
+
self.statement_config,
|
|
156
|
+
dialect=self._dialect_name,
|
|
157
|
+
json_serializer=self._json_serializer,
|
|
158
|
+
)
|
|
159
|
+
cursor.execute(sql, parameters=formatted_params)
|
|
160
|
+
else:
|
|
161
|
+
postgres_compatible_params = normalize_postgres_empty_parameters(
|
|
162
|
+
self._dialect_name, prepared_parameters
|
|
163
|
+
)
|
|
164
|
+
cursor.execute(sql, parameters=postgres_compatible_params)
|
|
165
|
+
|
|
166
|
+
except Exception:
|
|
167
|
+
handle_postgres_rollback(self._dialect_name, cursor, logger)
|
|
168
|
+
raise
|
|
169
|
+
|
|
170
|
+
is_select_like = statement.returns_rows() or self._should_force_select(statement, cursor)
|
|
171
|
+
|
|
172
|
+
if is_select_like:
|
|
173
|
+
fetched_data = cursor.fetchall()
|
|
174
|
+
dict_data, column_names = collect_rows(cast("list[Any] | None", fetched_data), cursor.description)
|
|
175
|
+
return self.create_execution_result(
|
|
176
|
+
cursor,
|
|
177
|
+
selected_data=dict_data,
|
|
178
|
+
column_names=column_names,
|
|
179
|
+
data_row_count=len(dict_data),
|
|
180
|
+
is_select_result=True,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
row_count = resolve_rowcount(cursor)
|
|
184
|
+
return self.create_execution_result(cursor, rowcount_override=row_count)
|
|
185
|
+
|
|
186
|
+
def dispatch_execute_many(self, cursor: "Cursor", statement: SQL) -> "ExecutionResult":
|
|
187
|
+
"""Execute SQL with multiple parameter sets.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
cursor: Database cursor
|
|
191
|
+
statement: SQL statement to execute
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
Execution result with row counts
|
|
195
|
+
"""
|
|
196
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
197
|
+
|
|
198
|
+
parameter_casts = resolve_parameter_casts(statement)
|
|
199
|
+
|
|
200
|
+
try:
|
|
201
|
+
if not prepared_parameters:
|
|
202
|
+
cursor._rowcount = 0 # pyright: ignore[reportPrivateUsage]
|
|
203
|
+
row_count = 0
|
|
204
|
+
elif isinstance(prepared_parameters, (list, tuple)) and prepared_parameters:
|
|
205
|
+
processed_params = []
|
|
206
|
+
for param_set in prepared_parameters:
|
|
207
|
+
if self._is_postgres:
|
|
208
|
+
# For postgres, always use cast-aware parameter preparation
|
|
209
|
+
formatted_params = prepare_postgres_parameters(
|
|
210
|
+
param_set,
|
|
211
|
+
parameter_casts,
|
|
212
|
+
self.statement_config,
|
|
213
|
+
dialect=self._dialect_name,
|
|
214
|
+
json_serializer=self._json_serializer,
|
|
215
|
+
)
|
|
216
|
+
else:
|
|
217
|
+
postgres_compatible = normalize_postgres_empty_parameters(self._dialect_name, param_set)
|
|
218
|
+
formatted_params = self.prepare_driver_parameters(
|
|
219
|
+
postgres_compatible, self.statement_config, is_many=False
|
|
220
|
+
)
|
|
221
|
+
processed_params.append(formatted_params)
|
|
222
|
+
|
|
223
|
+
cursor.executemany(sql, processed_params)
|
|
224
|
+
row_count = resolve_rowcount(cursor)
|
|
225
|
+
else:
|
|
226
|
+
cursor.executemany(sql, prepared_parameters)
|
|
227
|
+
row_count = resolve_rowcount(cursor)
|
|
228
|
+
|
|
229
|
+
except Exception:
|
|
230
|
+
handle_postgres_rollback(self._dialect_name, cursor, logger)
|
|
231
|
+
raise
|
|
232
|
+
|
|
233
|
+
return self.create_execution_result(cursor, rowcount_override=row_count, is_many_result=True)
|
|
234
|
+
|
|
235
|
+
def dispatch_execute_script(self, cursor: "Cursor", statement: "SQL") -> "ExecutionResult":
|
|
236
|
+
"""Execute SQL script containing multiple statements.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
cursor: Database cursor
|
|
240
|
+
statement: SQL script to execute
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
Execution result with statement counts
|
|
244
|
+
"""
|
|
245
|
+
prepared_parameters: Any | None = None
|
|
246
|
+
if statement.is_script:
|
|
247
|
+
sql = statement.raw_sql
|
|
248
|
+
else:
|
|
249
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
250
|
+
|
|
251
|
+
statements = self.split_script_statements(sql, self.statement_config, strip_trailing_semicolon=True)
|
|
252
|
+
|
|
253
|
+
successful_count = 0
|
|
254
|
+
last_rowcount = 0
|
|
255
|
+
try:
|
|
256
|
+
for stmt in statements:
|
|
257
|
+
if prepared_parameters:
|
|
258
|
+
postgres_compatible_params = normalize_postgres_empty_parameters(
|
|
259
|
+
self._dialect_name, prepared_parameters
|
|
260
|
+
)
|
|
261
|
+
cursor.execute(stmt, parameters=postgres_compatible_params)
|
|
262
|
+
else:
|
|
263
|
+
cursor.execute(stmt)
|
|
264
|
+
successful_count += 1
|
|
265
|
+
last_rowcount = normalize_script_rowcount(last_rowcount, cursor)
|
|
266
|
+
except Exception:
|
|
267
|
+
handle_postgres_rollback(self._dialect_name, cursor, logger)
|
|
268
|
+
raise
|
|
269
|
+
|
|
270
|
+
return self.create_execution_result(
|
|
271
|
+
cursor,
|
|
272
|
+
statement_count=len(statements),
|
|
273
|
+
successful_statements=successful_count,
|
|
274
|
+
rowcount_override=last_rowcount,
|
|
275
|
+
is_script_result=True,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
279
|
+
# TRANSACTION MANAGEMENT
|
|
280
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
281
|
+
|
|
282
|
+
def begin(self) -> None:
|
|
283
|
+
"""Begin database transaction."""
|
|
284
|
+
try:
|
|
285
|
+
with self.with_cursor(self.connection) as cursor:
|
|
286
|
+
cursor.execute("BEGIN")
|
|
287
|
+
except Exception as e:
|
|
288
|
+
msg = f"Failed to begin transaction: {e}"
|
|
289
|
+
raise SQLSpecError(msg) from e
|
|
290
|
+
|
|
291
|
+
def commit(self) -> None:
|
|
292
|
+
"""Commit database transaction."""
|
|
293
|
+
try:
|
|
294
|
+
with self.with_cursor(self.connection) as cursor:
|
|
295
|
+
cursor.execute("COMMIT")
|
|
296
|
+
except Exception as e:
|
|
297
|
+
msg = f"Failed to commit transaction: {e}"
|
|
298
|
+
raise SQLSpecError(msg) from e
|
|
299
|
+
|
|
300
|
+
def rollback(self) -> None:
|
|
301
|
+
"""Rollback database transaction."""
|
|
302
|
+
try:
|
|
303
|
+
with self.with_cursor(self.connection) as cursor:
|
|
304
|
+
cursor.execute("ROLLBACK")
|
|
305
|
+
except Exception as e:
|
|
306
|
+
msg = f"Failed to rollback transaction: {e}"
|
|
307
|
+
raise SQLSpecError(msg) from e
|
|
308
|
+
|
|
309
|
+
def with_cursor(self, connection: "AdbcConnection") -> "AdbcCursor":
|
|
310
|
+
"""Create context manager for cursor.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
connection: Database connection
|
|
314
|
+
|
|
315
|
+
Returns:
|
|
316
|
+
Cursor context manager
|
|
317
|
+
"""
|
|
318
|
+
return AdbcCursor(connection)
|
|
319
|
+
|
|
320
|
+
def handle_database_exceptions(self) -> "AdbcExceptionHandler":
|
|
321
|
+
"""Handle database-specific exceptions and wrap them appropriately.
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
Exception handler context manager
|
|
325
|
+
"""
|
|
326
|
+
return AdbcExceptionHandler()
|
|
327
|
+
|
|
328
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
329
|
+
# ARROW API METHODS
|
|
330
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
331
|
+
|
|
332
|
+
def select_to_arrow(
|
|
333
|
+
self,
|
|
334
|
+
statement: "Statement | QueryBuilder",
|
|
335
|
+
/,
|
|
336
|
+
*parameters: "StatementParameters | StatementFilter",
|
|
337
|
+
statement_config: "StatementConfig | None" = None,
|
|
338
|
+
return_format: "ArrowReturnFormat" = "table",
|
|
339
|
+
native_only: bool = False,
|
|
340
|
+
batch_size: int | None = None,
|
|
341
|
+
arrow_schema: Any = None,
|
|
342
|
+
**kwargs: Any,
|
|
343
|
+
) -> "ArrowResult":
|
|
344
|
+
"""Execute query and return results as Apache Arrow (ADBC native path).
|
|
345
|
+
|
|
346
|
+
ADBC provides zero-copy Arrow support via cursor.fetch_arrow_table().
|
|
347
|
+
This is 5-10x faster than the conversion path for large datasets.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
statement: SQL statement, string, or QueryBuilder
|
|
351
|
+
*parameters: Query parameters or filters
|
|
352
|
+
statement_config: Optional statement configuration override
|
|
353
|
+
return_format: "table" for pyarrow.Table (default), "batch" for RecordBatch,
|
|
354
|
+
"batches" for list of RecordBatch, "reader" for RecordBatchReader
|
|
355
|
+
native_only: Ignored for ADBC (always uses native path)
|
|
356
|
+
batch_size: Batch size hint (for future streaming implementation)
|
|
357
|
+
arrow_schema: Optional pyarrow.Schema for type casting
|
|
358
|
+
**kwargs: Additional keyword arguments
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
ArrowResult with native Arrow data
|
|
362
|
+
|
|
363
|
+
Example:
|
|
364
|
+
>>> result = driver.select_to_arrow(
|
|
365
|
+
... "SELECT * FROM users WHERE age > $1", 18
|
|
366
|
+
... )
|
|
367
|
+
>>> df = result.to_pandas() # Fast zero-copy conversion
|
|
368
|
+
"""
|
|
369
|
+
ensure_pyarrow()
|
|
370
|
+
|
|
371
|
+
# Prepare statement
|
|
372
|
+
config = statement_config or self.statement_config
|
|
373
|
+
prepared_statement = self.prepare_statement(statement, parameters, statement_config=config, kwargs=kwargs)
|
|
374
|
+
|
|
375
|
+
# Use ADBC cursor for native Arrow
|
|
376
|
+
with self.with_cursor(self.connection) as cursor, self.handle_database_exceptions():
|
|
377
|
+
if cursor is None:
|
|
378
|
+
msg = "Failed to create cursor"
|
|
379
|
+
raise DatabaseConnectionError(msg)
|
|
380
|
+
|
|
381
|
+
# Get compiled SQL and parameters
|
|
382
|
+
sql, driver_params = self._get_compiled_sql(prepared_statement, config)
|
|
383
|
+
|
|
384
|
+
# Execute query
|
|
385
|
+
cursor.execute(sql, driver_params or ())
|
|
386
|
+
|
|
387
|
+
# Fetch as Arrow table (zero-copy!)
|
|
388
|
+
arrow_table = cursor.fetch_arrow_table()
|
|
389
|
+
|
|
390
|
+
return build_arrow_result_from_table(
|
|
391
|
+
prepared_statement,
|
|
392
|
+
arrow_table,
|
|
393
|
+
return_format=return_format,
|
|
394
|
+
batch_size=batch_size,
|
|
395
|
+
arrow_schema=arrow_schema,
|
|
396
|
+
)
|
|
397
|
+
msg = "Unreachable"
|
|
398
|
+
raise RuntimeError(msg) # pragma: no cover
|
|
399
|
+
|
|
400
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
401
|
+
# STORAGE API METHODS
|
|
402
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
403
|
+
|
|
404
|
+
def select_to_storage(
|
|
405
|
+
self,
|
|
406
|
+
statement: "Statement | QueryBuilder | SQL | str",
|
|
407
|
+
destination: "StorageDestination",
|
|
408
|
+
/,
|
|
409
|
+
*parameters: "StatementParameters | StatementFilter",
|
|
410
|
+
statement_config: "StatementConfig | None" = None,
|
|
411
|
+
partitioner: "dict[str, object] | None" = None,
|
|
412
|
+
format_hint: "StorageFormat | None" = None,
|
|
413
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
414
|
+
**kwargs: Any,
|
|
415
|
+
) -> "StorageBridgeJob":
|
|
416
|
+
"""Stream query results to storage via the Arrow fast path."""
|
|
417
|
+
|
|
418
|
+
_ = kwargs
|
|
419
|
+
self._require_capability("arrow_export_enabled")
|
|
420
|
+
arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
421
|
+
sync_pipeline = self._storage_pipeline()
|
|
422
|
+
telemetry_payload = self._write_result_to_storage_sync(
|
|
423
|
+
arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
|
|
424
|
+
)
|
|
425
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
426
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
427
|
+
|
|
428
|
+
def load_from_arrow(
|
|
429
|
+
self,
|
|
430
|
+
table: str,
|
|
431
|
+
source: "ArrowResult | Any",
|
|
432
|
+
*,
|
|
433
|
+
partitioner: "dict[str, object] | None" = None,
|
|
434
|
+
overwrite: bool = False,
|
|
435
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
436
|
+
) -> "StorageBridgeJob":
|
|
437
|
+
"""Ingest an Arrow payload directly through the ADBC cursor."""
|
|
438
|
+
|
|
439
|
+
self._require_capability("arrow_import_enabled")
|
|
440
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
441
|
+
ingest_mode: Literal["append", "create", "replace", "create_append"]
|
|
442
|
+
ingest_mode = "replace" if overwrite else "create_append"
|
|
443
|
+
with self.with_cursor(self.connection) as cursor, self.handle_database_exceptions():
|
|
444
|
+
cursor.adbc_ingest(table, arrow_table, mode=ingest_mode)
|
|
445
|
+
telemetry_payload = self._build_ingest_telemetry(arrow_table)
|
|
446
|
+
telemetry_payload["destination"] = table
|
|
447
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
448
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
449
|
+
|
|
450
|
+
def load_from_storage(
|
|
451
|
+
self,
|
|
452
|
+
table: str,
|
|
453
|
+
source: "StorageDestination",
|
|
454
|
+
*,
|
|
455
|
+
file_format: "StorageFormat",
|
|
456
|
+
partitioner: "dict[str, object] | None" = None,
|
|
457
|
+
overwrite: bool = False,
|
|
458
|
+
) -> "StorageBridgeJob":
|
|
459
|
+
"""Read an artifact from storage and ingest it via ADBC."""
|
|
460
|
+
|
|
461
|
+
arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
|
|
462
|
+
return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
|
|
463
|
+
|
|
464
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
465
|
+
# UTILITY METHODS
|
|
466
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
467
|
+
|
|
468
|
+
@property
|
|
469
|
+
def data_dictionary(self) -> "AdbcDataDictionary":
|
|
470
|
+
"""Get the data dictionary for this driver.
|
|
471
|
+
|
|
472
|
+
Returns:
|
|
473
|
+
Data dictionary instance for metadata queries
|
|
474
|
+
"""
|
|
475
|
+
if self._data_dictionary is None:
|
|
476
|
+
self._data_dictionary = AdbcDataDictionary()
|
|
477
|
+
return self._data_dictionary
|
|
478
|
+
|
|
479
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
480
|
+
# PRIVATE/INTERNAL METHODS
|
|
481
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
482
|
+
|
|
483
|
+
def _connection_in_transaction(self) -> bool:
|
|
484
|
+
"""Check if connection is in transaction.
|
|
485
|
+
|
|
486
|
+
ADBC uses explicit BEGIN and does not expose reliable transaction state.
|
|
487
|
+
|
|
488
|
+
Returns:
|
|
489
|
+
False - ADBC requires explicit transaction management.
|
|
490
|
+
"""
|
|
491
|
+
return False
|
|
492
|
+
|
|
493
|
+
def prepare_driver_parameters(
|
|
494
|
+
self,
|
|
495
|
+
parameters: Any,
|
|
496
|
+
statement_config: "StatementConfig",
|
|
497
|
+
is_many: bool = False,
|
|
498
|
+
prepared_statement: Any | None = None,
|
|
499
|
+
) -> Any:
|
|
500
|
+
"""Prepare parameters with cast-aware type coercion for ADBC.
|
|
501
|
+
|
|
502
|
+
For PostgreSQL, applies cast-aware parameter processing using metadata from the compiled statement.
|
|
503
|
+
This allows proper handling of JSONB casts and other type conversions.
|
|
504
|
+
Respects driver_features['enable_cast_detection'] configuration.
|
|
505
|
+
|
|
506
|
+
Args:
|
|
507
|
+
parameters: Parameters in any format
|
|
508
|
+
statement_config: Statement configuration
|
|
509
|
+
is_many: Whether this is for execute_many operation
|
|
510
|
+
prepared_statement: Prepared statement containing the original SQL statement
|
|
511
|
+
|
|
512
|
+
Returns:
|
|
513
|
+
Parameters with cast-aware type coercion applied
|
|
514
|
+
"""
|
|
515
|
+
enable_cast_detection = self.driver_features.get("enable_cast_detection", True)
|
|
516
|
+
if enable_cast_detection and prepared_statement and self._is_postgres and not is_many:
|
|
517
|
+
parameter_casts = resolve_parameter_casts(prepared_statement)
|
|
518
|
+
return prepare_postgres_parameters(
|
|
519
|
+
parameters,
|
|
520
|
+
parameter_casts,
|
|
521
|
+
statement_config,
|
|
522
|
+
dialect=self._dialect_name,
|
|
523
|
+
json_serializer=self._json_serializer,
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
return super().prepare_driver_parameters(parameters, statement_config, is_many, prepared_statement)
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
register_driver_profile("adbc", driver_profile)
|