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,430 @@
|
|
|
1
|
+
"""DuckDB driver implementation."""
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
5
|
+
from uuid import uuid4
|
|
6
|
+
|
|
7
|
+
import duckdb
|
|
8
|
+
|
|
9
|
+
from sqlspec.adapters.duckdb.core import (
|
|
10
|
+
apply_driver_features,
|
|
11
|
+
collect_rows,
|
|
12
|
+
create_mapped_exception,
|
|
13
|
+
default_statement_config,
|
|
14
|
+
driver_profile,
|
|
15
|
+
normalize_execute_parameters,
|
|
16
|
+
resolve_rowcount,
|
|
17
|
+
)
|
|
18
|
+
from sqlspec.adapters.duckdb.data_dictionary import DuckDBDataDictionary
|
|
19
|
+
from sqlspec.adapters.duckdb.type_converter import DuckDBOutputConverter
|
|
20
|
+
from sqlspec.core import SQL, StatementConfig, build_arrow_result_from_table, get_cache_config, register_driver_profile
|
|
21
|
+
from sqlspec.driver import SyncDriverAdapterBase
|
|
22
|
+
from sqlspec.exceptions import DatabaseConnectionError, SQLSpecError
|
|
23
|
+
from sqlspec.utils.logging import get_logger
|
|
24
|
+
from sqlspec.utils.module_loader import ensure_pyarrow
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from sqlspec.adapters.duckdb._typing import DuckDBConnection
|
|
28
|
+
from sqlspec.builder import QueryBuilder
|
|
29
|
+
from sqlspec.core import ArrowResult, Statement, StatementFilter
|
|
30
|
+
from sqlspec.driver import ExecutionResult
|
|
31
|
+
from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
|
|
32
|
+
from sqlspec.typing import ArrowReturnFormat, StatementParameters
|
|
33
|
+
|
|
34
|
+
from sqlspec.adapters.duckdb._typing import DuckDBSessionContext
|
|
35
|
+
|
|
36
|
+
__all__ = ("DuckDBCursor", "DuckDBDriver", "DuckDBExceptionHandler", "DuckDBSessionContext")
|
|
37
|
+
|
|
38
|
+
logger = get_logger("sqlspec.adapters.duckdb")
|
|
39
|
+
|
|
40
|
+
_type_converter = DuckDBOutputConverter()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class DuckDBCursor:
|
|
44
|
+
"""Context manager for DuckDB cursor management."""
|
|
45
|
+
|
|
46
|
+
__slots__ = ("connection", "cursor")
|
|
47
|
+
|
|
48
|
+
def __init__(self, connection: "DuckDBConnection") -> None:
|
|
49
|
+
self.connection = connection
|
|
50
|
+
self.cursor: Any | None = None
|
|
51
|
+
|
|
52
|
+
def __enter__(self) -> Any:
|
|
53
|
+
self.cursor = self.connection.cursor()
|
|
54
|
+
return self.cursor
|
|
55
|
+
|
|
56
|
+
def __exit__(self, *_: Any) -> None:
|
|
57
|
+
if self.cursor is not None:
|
|
58
|
+
self.cursor.close()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class DuckDBExceptionHandler:
|
|
62
|
+
"""Context manager for handling DuckDB database exceptions.
|
|
63
|
+
|
|
64
|
+
Uses exception type and message-based detection to map DuckDB errors
|
|
65
|
+
to specific SQLSpec exceptions for better error handling.
|
|
66
|
+
|
|
67
|
+
Uses deferred exception pattern for mypyc compatibility: exceptions
|
|
68
|
+
are stored in pending_exception rather than raised from __exit__
|
|
69
|
+
to avoid ABI boundary violations with compiled code.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
__slots__ = ("pending_exception",)
|
|
73
|
+
|
|
74
|
+
def __init__(self) -> None:
|
|
75
|
+
self.pending_exception: Exception | None = None
|
|
76
|
+
|
|
77
|
+
def __enter__(self) -> "DuckDBExceptionHandler":
|
|
78
|
+
return self
|
|
79
|
+
|
|
80
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
81
|
+
_ = exc_tb
|
|
82
|
+
if exc_type is None:
|
|
83
|
+
return False
|
|
84
|
+
self.pending_exception = create_mapped_exception(exc_type, exc_val)
|
|
85
|
+
return True
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class DuckDBDriver(SyncDriverAdapterBase):
|
|
89
|
+
"""Synchronous DuckDB database driver.
|
|
90
|
+
|
|
91
|
+
Provides SQL statement execution, transaction management, and result handling
|
|
92
|
+
for DuckDB databases. Supports multiple parameter styles including QMARK,
|
|
93
|
+
NUMERIC, and NAMED_DOLLAR formats.
|
|
94
|
+
|
|
95
|
+
The driver handles script execution, batch operations, and integrates with
|
|
96
|
+
the sqlspec.core modules for statement processing and caching.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
__slots__ = ("_data_dictionary",)
|
|
100
|
+
dialect = "duckdb"
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
connection: "DuckDBConnection",
|
|
105
|
+
statement_config: "StatementConfig | None" = None,
|
|
106
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
107
|
+
) -> None:
|
|
108
|
+
if statement_config is None:
|
|
109
|
+
statement_config = default_statement_config.replace(
|
|
110
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
statement_config = apply_driver_features(statement_config, driver_features)
|
|
114
|
+
|
|
115
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
116
|
+
self._data_dictionary: DuckDBDataDictionary | None = None
|
|
117
|
+
|
|
118
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
119
|
+
# CORE DISPATCH METHODS
|
|
120
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
121
|
+
|
|
122
|
+
def dispatch_execute(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
123
|
+
"""Execute single SQL statement with data handling.
|
|
124
|
+
|
|
125
|
+
Executes a SQL statement with parameter binding and processes the results.
|
|
126
|
+
Handles both data-returning queries and data modification operations.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
cursor: DuckDB cursor object
|
|
130
|
+
statement: SQL statement to execute
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
ExecutionResult with execution metadata
|
|
134
|
+
"""
|
|
135
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
136
|
+
cursor.execute(sql, normalize_execute_parameters(prepared_parameters))
|
|
137
|
+
|
|
138
|
+
is_select_like = statement.returns_rows() or self._should_force_select(statement, cursor)
|
|
139
|
+
|
|
140
|
+
if is_select_like:
|
|
141
|
+
fetched_data = cursor.fetchall()
|
|
142
|
+
dict_data, column_names = collect_rows(cast("list[Any] | None", fetched_data), cursor.description)
|
|
143
|
+
|
|
144
|
+
return self.create_execution_result(
|
|
145
|
+
cursor,
|
|
146
|
+
selected_data=dict_data,
|
|
147
|
+
column_names=column_names,
|
|
148
|
+
data_row_count=len(dict_data),
|
|
149
|
+
is_select_result=True,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
row_count = resolve_rowcount(cursor)
|
|
153
|
+
|
|
154
|
+
return self.create_execution_result(cursor, rowcount_override=row_count)
|
|
155
|
+
|
|
156
|
+
def dispatch_execute_many(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
157
|
+
"""Execute SQL with multiple parameter sets using batch processing.
|
|
158
|
+
|
|
159
|
+
Uses DuckDB's executemany method for batch operations and calculates
|
|
160
|
+
row counts for both data modification and query operations.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
cursor: DuckDB cursor object
|
|
164
|
+
statement: SQL statement with multiple parameter sets
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
ExecutionResult with batch execution metadata
|
|
168
|
+
"""
|
|
169
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
170
|
+
|
|
171
|
+
if prepared_parameters:
|
|
172
|
+
parameter_sets = cast("list[Any]", prepared_parameters)
|
|
173
|
+
cursor.executemany(sql, parameter_sets)
|
|
174
|
+
|
|
175
|
+
row_count = len(parameter_sets) if statement.is_modifying_operation() else resolve_rowcount(cursor)
|
|
176
|
+
else:
|
|
177
|
+
row_count = 0
|
|
178
|
+
|
|
179
|
+
return self.create_execution_result(cursor, rowcount_override=row_count, is_many_result=True)
|
|
180
|
+
|
|
181
|
+
def dispatch_execute_script(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
182
|
+
"""Execute SQL script with statement splitting and parameter handling.
|
|
183
|
+
|
|
184
|
+
Parses multi-statement scripts and executes each statement sequentially
|
|
185
|
+
with the provided parameters.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
cursor: DuckDB cursor object
|
|
189
|
+
statement: SQL statement with script content
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
ExecutionResult with script execution metadata
|
|
193
|
+
"""
|
|
194
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
195
|
+
statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
|
|
196
|
+
|
|
197
|
+
successful_count = 0
|
|
198
|
+
last_result = None
|
|
199
|
+
|
|
200
|
+
for stmt in statements:
|
|
201
|
+
last_result = cursor.execute(stmt, normalize_execute_parameters(prepared_parameters))
|
|
202
|
+
successful_count += 1
|
|
203
|
+
|
|
204
|
+
return self.create_execution_result(
|
|
205
|
+
last_result, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
209
|
+
# TRANSACTION MANAGEMENT
|
|
210
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
211
|
+
|
|
212
|
+
def begin(self) -> None:
|
|
213
|
+
"""Begin a database transaction."""
|
|
214
|
+
try:
|
|
215
|
+
self.connection.execute("BEGIN TRANSACTION")
|
|
216
|
+
except duckdb.Error as e:
|
|
217
|
+
msg = f"Failed to begin DuckDB transaction: {e}"
|
|
218
|
+
raise SQLSpecError(msg) from e
|
|
219
|
+
|
|
220
|
+
def commit(self) -> None:
|
|
221
|
+
"""Commit the current transaction."""
|
|
222
|
+
try:
|
|
223
|
+
self.connection.commit()
|
|
224
|
+
except duckdb.Error as e:
|
|
225
|
+
msg = f"Failed to commit DuckDB transaction: {e}"
|
|
226
|
+
raise SQLSpecError(msg) from e
|
|
227
|
+
|
|
228
|
+
def rollback(self) -> None:
|
|
229
|
+
"""Rollback the current transaction."""
|
|
230
|
+
try:
|
|
231
|
+
self.connection.rollback()
|
|
232
|
+
except duckdb.Error as e:
|
|
233
|
+
msg = f"Failed to rollback DuckDB transaction: {e}"
|
|
234
|
+
raise SQLSpecError(msg) from e
|
|
235
|
+
|
|
236
|
+
def with_cursor(self, connection: "DuckDBConnection") -> "DuckDBCursor":
|
|
237
|
+
"""Create context manager for DuckDB cursor.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
connection: DuckDB connection instance
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
DuckDBCursor context manager instance
|
|
244
|
+
"""
|
|
245
|
+
return DuckDBCursor(connection)
|
|
246
|
+
|
|
247
|
+
def handle_database_exceptions(self) -> "DuckDBExceptionHandler":
|
|
248
|
+
"""Handle database-specific exceptions and wrap them appropriately.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
Exception handler with deferred exception pattern for mypyc compatibility.
|
|
252
|
+
"""
|
|
253
|
+
return DuckDBExceptionHandler()
|
|
254
|
+
|
|
255
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
256
|
+
# ARROW API METHODS
|
|
257
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
258
|
+
|
|
259
|
+
def select_to_arrow(
|
|
260
|
+
self,
|
|
261
|
+
statement: "Statement | QueryBuilder",
|
|
262
|
+
/,
|
|
263
|
+
*parameters: "StatementParameters | StatementFilter",
|
|
264
|
+
statement_config: "StatementConfig | None" = None,
|
|
265
|
+
return_format: "ArrowReturnFormat" = "table",
|
|
266
|
+
native_only: bool = False,
|
|
267
|
+
batch_size: int | None = None,
|
|
268
|
+
arrow_schema: Any = None,
|
|
269
|
+
**kwargs: Any,
|
|
270
|
+
) -> "ArrowResult":
|
|
271
|
+
"""Execute query and return results as Apache Arrow (DuckDB native path).
|
|
272
|
+
|
|
273
|
+
DuckDB provides native Arrow support via cursor.arrow().
|
|
274
|
+
This is the fastest path due to DuckDB's columnar architecture.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
statement: SQL statement, string, or QueryBuilder
|
|
278
|
+
*parameters: Query parameters or filters
|
|
279
|
+
statement_config: Optional statement configuration override
|
|
280
|
+
return_format: "table" for pyarrow.Table (default), "batch" for RecordBatch,
|
|
281
|
+
"batches" for list of RecordBatch, "reader" for RecordBatchReader
|
|
282
|
+
native_only: Ignored for DuckDB (always uses native path)
|
|
283
|
+
batch_size: Batch size hint (for future streaming implementation)
|
|
284
|
+
arrow_schema: Optional pyarrow.Schema for type casting
|
|
285
|
+
**kwargs: Additional keyword arguments
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
ArrowResult with native Arrow data
|
|
289
|
+
Example:
|
|
290
|
+
>>> result = driver.select_to_arrow(
|
|
291
|
+
... "SELECT * FROM users WHERE age > ?", 18
|
|
292
|
+
... )
|
|
293
|
+
>>> df = result.to_pandas() # Fast zero-copy conversion
|
|
294
|
+
"""
|
|
295
|
+
ensure_pyarrow()
|
|
296
|
+
|
|
297
|
+
# Prepare statement
|
|
298
|
+
config = statement_config or self.statement_config
|
|
299
|
+
prepared_statement = self.prepare_statement(statement, parameters, statement_config=config, kwargs=kwargs)
|
|
300
|
+
|
|
301
|
+
# Execute query and get native Arrow
|
|
302
|
+
with self.with_cursor(self.connection) as cursor, self.handle_database_exceptions():
|
|
303
|
+
if cursor is None:
|
|
304
|
+
msg = "Failed to create cursor"
|
|
305
|
+
raise DatabaseConnectionError(msg)
|
|
306
|
+
|
|
307
|
+
# Get compiled SQL and parameters
|
|
308
|
+
sql, driver_params = self._get_compiled_sql(prepared_statement, config)
|
|
309
|
+
|
|
310
|
+
# Execute query
|
|
311
|
+
cursor.execute(sql, driver_params or ())
|
|
312
|
+
|
|
313
|
+
# DuckDB native Arrow (zero-copy!)
|
|
314
|
+
arrow_reader = cursor.arrow()
|
|
315
|
+
arrow_table = arrow_reader.read_all()
|
|
316
|
+
|
|
317
|
+
return build_arrow_result_from_table(
|
|
318
|
+
prepared_statement,
|
|
319
|
+
arrow_table,
|
|
320
|
+
return_format=return_format,
|
|
321
|
+
batch_size=batch_size,
|
|
322
|
+
arrow_schema=arrow_schema,
|
|
323
|
+
)
|
|
324
|
+
msg = "Unreachable"
|
|
325
|
+
raise RuntimeError(msg) # pragma: no cover
|
|
326
|
+
|
|
327
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
328
|
+
# STORAGE API METHODS
|
|
329
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
330
|
+
|
|
331
|
+
def select_to_storage(
|
|
332
|
+
self,
|
|
333
|
+
statement: "Statement | QueryBuilder | SQL | str",
|
|
334
|
+
destination: "StorageDestination",
|
|
335
|
+
/,
|
|
336
|
+
*parameters: "StatementParameters | StatementFilter",
|
|
337
|
+
statement_config: "StatementConfig | None" = None,
|
|
338
|
+
partitioner: "dict[str, object] | None" = None,
|
|
339
|
+
format_hint: "StorageFormat | None" = None,
|
|
340
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
341
|
+
**kwargs: Any,
|
|
342
|
+
) -> "StorageBridgeJob":
|
|
343
|
+
"""Persist DuckDB query output to a storage backend using Arrow fast paths."""
|
|
344
|
+
|
|
345
|
+
_ = kwargs
|
|
346
|
+
self._require_capability("arrow_export_enabled")
|
|
347
|
+
arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
348
|
+
sync_pipeline = self._storage_pipeline()
|
|
349
|
+
telemetry_payload = self._write_result_to_storage_sync(
|
|
350
|
+
arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
|
|
351
|
+
)
|
|
352
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
353
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
354
|
+
|
|
355
|
+
def load_from_arrow(
|
|
356
|
+
self,
|
|
357
|
+
table: str,
|
|
358
|
+
source: "ArrowResult | Any",
|
|
359
|
+
*,
|
|
360
|
+
partitioner: "dict[str, object] | None" = None,
|
|
361
|
+
overwrite: bool = False,
|
|
362
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
363
|
+
) -> "StorageBridgeJob":
|
|
364
|
+
"""Load Arrow data into DuckDB using temporary table registration."""
|
|
365
|
+
|
|
366
|
+
self._require_capability("arrow_import_enabled")
|
|
367
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
368
|
+
temp_view = f"_sqlspec_arrow_{uuid4().hex}"
|
|
369
|
+
if overwrite:
|
|
370
|
+
self.connection.execute(f"TRUNCATE TABLE {table}")
|
|
371
|
+
self.connection.register(temp_view, arrow_table)
|
|
372
|
+
try:
|
|
373
|
+
self.connection.execute(f"INSERT INTO {table} SELECT * FROM {temp_view}")
|
|
374
|
+
finally:
|
|
375
|
+
with contextlib.suppress(Exception):
|
|
376
|
+
self.connection.unregister(temp_view)
|
|
377
|
+
|
|
378
|
+
telemetry_payload = self._build_ingest_telemetry(arrow_table)
|
|
379
|
+
telemetry_payload["destination"] = table
|
|
380
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
381
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
382
|
+
|
|
383
|
+
def load_from_storage(
|
|
384
|
+
self,
|
|
385
|
+
table: str,
|
|
386
|
+
source: "StorageDestination",
|
|
387
|
+
*,
|
|
388
|
+
file_format: "StorageFormat",
|
|
389
|
+
partitioner: "dict[str, object] | None" = None,
|
|
390
|
+
overwrite: bool = False,
|
|
391
|
+
) -> "StorageBridgeJob":
|
|
392
|
+
"""Read an artifact from storage and load it into DuckDB."""
|
|
393
|
+
|
|
394
|
+
arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
|
|
395
|
+
return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
|
|
396
|
+
|
|
397
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
398
|
+
# UTILITY METHODS
|
|
399
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
400
|
+
|
|
401
|
+
@property
|
|
402
|
+
def data_dictionary(self) -> "DuckDBDataDictionary":
|
|
403
|
+
"""Get the data dictionary for this driver.
|
|
404
|
+
|
|
405
|
+
Returns:
|
|
406
|
+
Data dictionary instance for metadata queries
|
|
407
|
+
"""
|
|
408
|
+
if self._data_dictionary is None:
|
|
409
|
+
self._data_dictionary = DuckDBDataDictionary()
|
|
410
|
+
return self._data_dictionary
|
|
411
|
+
|
|
412
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
413
|
+
# PRIVATE / INTERNAL METHODS
|
|
414
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
415
|
+
|
|
416
|
+
def _connection_in_transaction(self) -> bool:
|
|
417
|
+
"""Check if connection is in transaction.
|
|
418
|
+
|
|
419
|
+
DuckDB uses explicit BEGIN TRANSACTION and does not expose transaction state.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
False - DuckDB requires explicit transaction management.
|
|
423
|
+
"""
|
|
424
|
+
return False
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
register_driver_profile("duckdb", driver_profile)
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
MODIFYING_OPERATIONS: "tuple[str, ...]" = ("INSERT", "UPDATE", "DELETE")
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""DuckDB event queue store.
|
|
2
|
+
|
|
3
|
+
DuckDB uses native JSON type for efficient JSON storage and querying.
|
|
4
|
+
The TIMESTAMP type provides microsecond precision for event ordering.
|
|
5
|
+
|
|
6
|
+
Configuration (optional):
|
|
7
|
+
extension_config={
|
|
8
|
+
"events": {
|
|
9
|
+
"queue_table": "custom_event_queue", # Override default table name
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from sqlspec.adapters.duckdb.config import DuckDBConfig
|
|
15
|
+
from sqlspec.extensions.events import BaseEventQueueStore
|
|
16
|
+
|
|
17
|
+
__all__ = ("DuckDBEventQueueStore",)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DuckDBEventQueueStore(BaseEventQueueStore[DuckDBConfig]):
|
|
21
|
+
"""DuckDB event queue store with native JSON support.
|
|
22
|
+
|
|
23
|
+
DuckDB supports native JSON type for efficient JSON storage and querying.
|
|
24
|
+
The table uses TIMESTAMP for event ordering with microsecond precision.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
config: DuckDBConfig with optional extension_config["events"] settings.
|
|
28
|
+
|
|
29
|
+
Notes:
|
|
30
|
+
Configuration is read from config.extension_config["events"]:
|
|
31
|
+
- queue_table: Table name (default: "sqlspec_event_queue")
|
|
32
|
+
|
|
33
|
+
DuckDB does not support native pub/sub, so events use the table-backed
|
|
34
|
+
queue backend which provides durable, exactly-once delivery semantics.
|
|
35
|
+
|
|
36
|
+
Example:
|
|
37
|
+
from sqlspec.adapters.duckdb import DuckDBConfig
|
|
38
|
+
from sqlspec.adapters.duckdb.events import DuckDBEventQueueStore
|
|
39
|
+
|
|
40
|
+
config = DuckDBConfig(
|
|
41
|
+
connection_config={"database": "events.db"},
|
|
42
|
+
extension_config={"events": {"queue_table": "my_events"}}
|
|
43
|
+
)
|
|
44
|
+
store = DuckDBEventQueueStore(config)
|
|
45
|
+
for stmt in store.create_statements():
|
|
46
|
+
driver.execute_script(stmt)
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
__slots__ = ()
|
|
50
|
+
|
|
51
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
52
|
+
"""Return DuckDB-optimized column types.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Tuple of (payload_type, metadata_type, timestamp_type).
|
|
56
|
+
"""
|
|
57
|
+
return "JSON", "JSON", "TIMESTAMP"
|