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,206 @@
|
|
|
1
|
+
"""Driver parameter profile registry and StatementConfig factory."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable, Mapping
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Literal, cast
|
|
5
|
+
|
|
6
|
+
import sqlspec.exceptions
|
|
7
|
+
from sqlspec.core.parameters._types import DriverParameterProfile, ParameterStyleConfig
|
|
8
|
+
from sqlspec.utils.serializers import from_json, to_json
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from sqlspec.core.statement import StatementConfig
|
|
12
|
+
|
|
13
|
+
__all__ = (
|
|
14
|
+
"DRIVER_PARAMETER_PROFILES",
|
|
15
|
+
"build_statement_config_from_profile",
|
|
16
|
+
"get_driver_profile",
|
|
17
|
+
"register_driver_profile",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
_DEFAULT_JSON_SERIALIZER: Callable[[Any], str] = to_json
|
|
21
|
+
_DEFAULT_JSON_DESERIALIZER: Callable[[str], Any] = from_json
|
|
22
|
+
|
|
23
|
+
DRIVER_PARAMETER_PROFILES: "dict[str, DriverParameterProfile]" = {}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_driver_profile(adapter_key: str) -> "DriverParameterProfile":
|
|
27
|
+
"""Return the registered parameter profile for the specified adapter.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
adapter_key: Adapter identifier (case-insensitive).
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Registered :class:`DriverParameterProfile` instance.
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
ImproperConfigurationError: If the adapter does not have a profile.
|
|
37
|
+
"""
|
|
38
|
+
key = adapter_key.lower()
|
|
39
|
+
try:
|
|
40
|
+
return DRIVER_PARAMETER_PROFILES[key]
|
|
41
|
+
except KeyError as exc:
|
|
42
|
+
msg = f"No driver parameter profile registered for adapter '{adapter_key}'."
|
|
43
|
+
raise sqlspec.exceptions.ImproperConfigurationError(msg) from exc
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def register_driver_profile(
|
|
47
|
+
adapter_key: str, profile: "DriverParameterProfile", *, allow_override: bool = False
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Register a driver profile under the canonical adapter key.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
adapter_key: Adapter identifier (case-insensitive).
|
|
53
|
+
profile: Profile describing parameter behaviour.
|
|
54
|
+
allow_override: Whether to replace an existing entry.
|
|
55
|
+
|
|
56
|
+
Raises:
|
|
57
|
+
ImproperConfigurationError: If attempting to register a duplicate profile.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
key = adapter_key.lower()
|
|
61
|
+
if not allow_override and key in DRIVER_PARAMETER_PROFILES:
|
|
62
|
+
msg = f"Profile already registered for adapter '{adapter_key}'."
|
|
63
|
+
raise sqlspec.exceptions.ImproperConfigurationError(msg)
|
|
64
|
+
DRIVER_PARAMETER_PROFILES[key] = profile
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _build_parameter_style_config_from_profile(
|
|
68
|
+
profile: "DriverParameterProfile",
|
|
69
|
+
parameter_overrides: "dict[str, Any] | None",
|
|
70
|
+
json_serializer: "Callable[[Any], str] | None",
|
|
71
|
+
json_deserializer: "Callable[[str], Any] | None",
|
|
72
|
+
) -> "ParameterStyleConfig":
|
|
73
|
+
"""Build a :class:`ParameterStyleConfig` instance from a driver profile.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
profile: Source driver profile.
|
|
77
|
+
parameter_overrides: Optional overrides applied before instantiation.
|
|
78
|
+
json_serializer: Adapter-provided JSON serializer.
|
|
79
|
+
json_deserializer: Adapter-provided JSON deserializer.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Configured :class:`ParameterStyleConfig` ready for statement construction.
|
|
83
|
+
"""
|
|
84
|
+
overrides = dict(parameter_overrides or {})
|
|
85
|
+
supported_styles_override = overrides.pop("supported_parameter_styles", None)
|
|
86
|
+
execution_styles_override = overrides.pop("supported_execution_parameter_styles", None)
|
|
87
|
+
type_coercion_override = overrides.pop("type_coercion_map", None)
|
|
88
|
+
json_serializer_override = overrides.pop("json_serializer", None)
|
|
89
|
+
json_deserializer_override = overrides.pop("json_deserializer", None)
|
|
90
|
+
tuple_strategy_override = overrides.pop("json_tuple_strategy", None)
|
|
91
|
+
|
|
92
|
+
supported_styles = (
|
|
93
|
+
set(supported_styles_override) if supported_styles_override is not None else set(profile.supported_styles)
|
|
94
|
+
)
|
|
95
|
+
if execution_styles_override is None:
|
|
96
|
+
execution_supported = (
|
|
97
|
+
set(profile.supported_execution_styles) if profile.supported_execution_styles is not None else None
|
|
98
|
+
)
|
|
99
|
+
else:
|
|
100
|
+
execution_supported = set(execution_styles_override) if execution_styles_override is not None else None
|
|
101
|
+
|
|
102
|
+
type_map = (
|
|
103
|
+
dict(type_coercion_override) if type_coercion_override is not None else dict(profile.custom_type_coercions)
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
parameter_kwargs: dict[str, Any] = {
|
|
107
|
+
"default_parameter_style": overrides.pop("default_parameter_style", profile.default_style),
|
|
108
|
+
"supported_parameter_styles": supported_styles,
|
|
109
|
+
"supported_execution_parameter_styles": execution_supported,
|
|
110
|
+
"default_execution_parameter_style": overrides.pop(
|
|
111
|
+
"default_execution_parameter_style", profile.default_execution_style
|
|
112
|
+
),
|
|
113
|
+
"type_coercion_map": type_map,
|
|
114
|
+
"has_native_list_expansion": overrides.pop("has_native_list_expansion", profile.has_native_list_expansion),
|
|
115
|
+
"needs_static_script_compilation": overrides.pop(
|
|
116
|
+
"needs_static_script_compilation", profile.needs_static_script_compilation
|
|
117
|
+
),
|
|
118
|
+
"allow_mixed_parameter_styles": overrides.pop(
|
|
119
|
+
"allow_mixed_parameter_styles", profile.allow_mixed_parameter_styles
|
|
120
|
+
),
|
|
121
|
+
"preserve_parameter_format": overrides.pop("preserve_parameter_format", profile.preserve_parameter_format),
|
|
122
|
+
"preserve_original_params_for_many": overrides.pop(
|
|
123
|
+
"preserve_original_params_for_many", profile.preserve_original_params_for_many
|
|
124
|
+
),
|
|
125
|
+
"strict_named_parameters": overrides.pop("strict_named_parameters", profile.strict_named_parameters),
|
|
126
|
+
"output_transformer": overrides.pop("output_transformer", profile.default_output_transformer),
|
|
127
|
+
"ast_transformer": overrides.pop("ast_transformer", profile.default_ast_transformer),
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
parameter_kwargs = {k: v for k, v in parameter_kwargs.items() if v is not None}
|
|
131
|
+
|
|
132
|
+
strategy = profile.json_serializer_strategy
|
|
133
|
+
serializer_value = json_serializer_override or json_serializer
|
|
134
|
+
deserializer_value = json_deserializer_override or json_deserializer
|
|
135
|
+
|
|
136
|
+
if serializer_value is None:
|
|
137
|
+
serializer_value = profile.extras.get("default_json_serializer", _DEFAULT_JSON_SERIALIZER)
|
|
138
|
+
if deserializer_value is None:
|
|
139
|
+
deserializer_value = profile.extras.get("default_json_deserializer", _DEFAULT_JSON_DESERIALIZER)
|
|
140
|
+
|
|
141
|
+
serializer = cast("Callable[[Any], str]", serializer_value)
|
|
142
|
+
deserializer = cast("Callable[[str], Any] | None", deserializer_value)
|
|
143
|
+
|
|
144
|
+
if strategy == "driver":
|
|
145
|
+
parameter_kwargs["json_serializer"] = serializer
|
|
146
|
+
parameter_kwargs["json_deserializer"] = deserializer
|
|
147
|
+
|
|
148
|
+
parameter_kwargs.update(overrides)
|
|
149
|
+
parameter_config = ParameterStyleConfig(**parameter_kwargs)
|
|
150
|
+
|
|
151
|
+
if strategy == "helper":
|
|
152
|
+
tuple_strategy = tuple_strategy_override or profile.extras.get("json_tuple_strategy", "list")
|
|
153
|
+
tuple_strategy_literal = cast("Literal['list', 'tuple']", tuple_strategy)
|
|
154
|
+
parameter_config = parameter_config.with_json_serializers(
|
|
155
|
+
serializer, tuple_strategy=tuple_strategy_literal, deserializer=deserializer
|
|
156
|
+
)
|
|
157
|
+
elif strategy == "driver":
|
|
158
|
+
parameter_config = parameter_config.replace(json_serializer=serializer, json_deserializer=deserializer)
|
|
159
|
+
|
|
160
|
+
type_overrides = profile.extras.get("type_coercion_overrides")
|
|
161
|
+
if type_overrides:
|
|
162
|
+
coercion_overrides = cast("Mapping[type, Callable[[Any], Any]]", type_overrides)
|
|
163
|
+
updated_map: dict[type, Callable[[Any], Any]] = {}
|
|
164
|
+
updated_map.update(parameter_config.type_coercion_map)
|
|
165
|
+
updated_map.update(coercion_overrides)
|
|
166
|
+
parameter_config = parameter_config.replace(type_coercion_map=updated_map)
|
|
167
|
+
|
|
168
|
+
return parameter_config
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def build_statement_config_from_profile(
|
|
172
|
+
profile: "DriverParameterProfile",
|
|
173
|
+
*,
|
|
174
|
+
parameter_overrides: "dict[str, Any] | None" = None,
|
|
175
|
+
statement_overrides: "dict[str, Any] | None" = None,
|
|
176
|
+
json_serializer: "Callable[[Any], str] | None" = None,
|
|
177
|
+
json_deserializer: "Callable[[str], Any] | None" = None,
|
|
178
|
+
) -> "StatementConfig":
|
|
179
|
+
"""Construct a :class:`StatementConfig` seeded from a driver profile.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
profile: Driver profile providing default parameter behaviour.
|
|
183
|
+
parameter_overrides: Optional overrides for parameter config fields.
|
|
184
|
+
statement_overrides: Optional overrides for resulting statement config.
|
|
185
|
+
json_serializer: Optional JSON serializer supplied by the adapter.
|
|
186
|
+
json_deserializer: Optional JSON deserializer supplied by the adapter.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
New :class:`StatementConfig` instance with merged configuration.
|
|
190
|
+
"""
|
|
191
|
+
parameter_config = _build_parameter_style_config_from_profile(
|
|
192
|
+
profile, parameter_overrides, json_serializer, json_deserializer
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
from sqlspec.core.statement import StatementConfig as _StatementConfig
|
|
196
|
+
|
|
197
|
+
statement_kwargs: dict[str, Any] = {}
|
|
198
|
+
if profile.default_dialect is not None:
|
|
199
|
+
statement_kwargs["dialect"] = profile.default_dialect
|
|
200
|
+
if profile.statement_kwargs:
|
|
201
|
+
statement_kwargs.update(profile.statement_kwargs)
|
|
202
|
+
if statement_overrides:
|
|
203
|
+
statement_kwargs.update(statement_overrides)
|
|
204
|
+
|
|
205
|
+
filtered_statement_kwargs = {k: v for k, v in statement_kwargs.items() if v is not None}
|
|
206
|
+
return _StatementConfig(parameter_config=parameter_config, **filtered_statement_kwargs)
|
|
Binary file
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"""AST transformer helpers for parameter processing."""
|
|
2
|
+
|
|
3
|
+
import bisect
|
|
4
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
5
|
+
from typing import Any, cast
|
|
6
|
+
|
|
7
|
+
from sqlglot import exp as _exp
|
|
8
|
+
|
|
9
|
+
from sqlspec.core.parameters._alignment import (
|
|
10
|
+
collect_null_parameter_ordinals,
|
|
11
|
+
looks_like_execute_many,
|
|
12
|
+
normalize_parameter_key,
|
|
13
|
+
validate_parameter_alignment,
|
|
14
|
+
)
|
|
15
|
+
from sqlspec.core.parameters._types import ConvertedParameters, ParameterMapping, ParameterPayload, ParameterProfile
|
|
16
|
+
from sqlspec.core.parameters._validator import ParameterValidator
|
|
17
|
+
from sqlspec.utils.type_guards import get_value_attribute
|
|
18
|
+
|
|
19
|
+
__all__ = (
|
|
20
|
+
"build_literal_inlining_transform",
|
|
21
|
+
"build_null_pruning_transform",
|
|
22
|
+
"replace_null_parameters_with_literals",
|
|
23
|
+
"replace_placeholders_with_literals",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
_AST_TRANSFORMER_VALIDATOR: "ParameterValidator" = ParameterValidator()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class _NullPruningTransform:
|
|
30
|
+
__slots__ = ("_dialect", "_validator")
|
|
31
|
+
|
|
32
|
+
def __init__(self, dialect: str, validator: "ParameterValidator | None") -> None:
|
|
33
|
+
self._dialect = dialect
|
|
34
|
+
self._validator = validator
|
|
35
|
+
|
|
36
|
+
def __call__(
|
|
37
|
+
self, expression: Any, parameters: "ParameterPayload", parameter_profile: "ParameterProfile"
|
|
38
|
+
) -> "tuple[Any, ConvertedParameters]":
|
|
39
|
+
return replace_null_parameters_with_literals(
|
|
40
|
+
expression,
|
|
41
|
+
parameters,
|
|
42
|
+
dialect=self._dialect,
|
|
43
|
+
validator=self._validator,
|
|
44
|
+
parameter_profile=parameter_profile,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class _LiteralInliningTransform:
|
|
49
|
+
__slots__ = ("_json_serializer",)
|
|
50
|
+
|
|
51
|
+
def __init__(self, json_serializer: "Callable[[Any], str]") -> None:
|
|
52
|
+
self._json_serializer = json_serializer
|
|
53
|
+
|
|
54
|
+
def __call__(
|
|
55
|
+
self, expression: Any, parameters: "ParameterPayload", _parameter_profile: "ParameterProfile"
|
|
56
|
+
) -> "tuple[Any, object]":
|
|
57
|
+
literal_expression = replace_placeholders_with_literals(
|
|
58
|
+
expression, parameters, json_serializer=self._json_serializer
|
|
59
|
+
)
|
|
60
|
+
return literal_expression, parameters
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class _NullPlaceholderTransformer:
|
|
64
|
+
__slots__ = ("_null_positions", "_qmark_position", "_sorted_null_positions")
|
|
65
|
+
|
|
66
|
+
def __init__(self, null_positions: "set[int]", sorted_null_positions: "list[int]") -> None:
|
|
67
|
+
self._null_positions = null_positions
|
|
68
|
+
self._sorted_null_positions = sorted_null_positions
|
|
69
|
+
self._qmark_position = 0
|
|
70
|
+
|
|
71
|
+
def __call__(self, node: Any) -> Any:
|
|
72
|
+
if isinstance(node, _exp.Placeholder) and node.this is None:
|
|
73
|
+
current_position = self._qmark_position
|
|
74
|
+
self._qmark_position += 1
|
|
75
|
+
if current_position in self._null_positions:
|
|
76
|
+
return _exp.Null()
|
|
77
|
+
return node
|
|
78
|
+
|
|
79
|
+
if isinstance(node, _exp.Placeholder) and node.this is not None:
|
|
80
|
+
placeholder_text = str(node.this)
|
|
81
|
+
normalized_text = placeholder_text.lstrip("$")
|
|
82
|
+
if normalized_text.isdigit():
|
|
83
|
+
param_index = int(normalized_text) - 1
|
|
84
|
+
if param_index in self._null_positions:
|
|
85
|
+
return _exp.Null()
|
|
86
|
+
shift = bisect.bisect_left(self._sorted_null_positions, param_index)
|
|
87
|
+
new_param_num = param_index - shift + 1
|
|
88
|
+
return _exp.Placeholder(this=f"${new_param_num}")
|
|
89
|
+
return node
|
|
90
|
+
|
|
91
|
+
if isinstance(node, _exp.Parameter) and node.this is not None:
|
|
92
|
+
parameter_text = str(node.this)
|
|
93
|
+
if parameter_text.isdigit():
|
|
94
|
+
param_index = int(parameter_text) - 1
|
|
95
|
+
if param_index in self._null_positions:
|
|
96
|
+
return _exp.Null()
|
|
97
|
+
shift = bisect.bisect_left(self._sorted_null_positions, param_index)
|
|
98
|
+
new_param_num = param_index - shift + 1
|
|
99
|
+
return _exp.Parameter(this=str(new_param_num))
|
|
100
|
+
return node
|
|
101
|
+
|
|
102
|
+
return node
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class _PlaceholderLiteralTransformer:
|
|
106
|
+
__slots__ = ("_json_serializer", "_parameters", "_placeholder_index")
|
|
107
|
+
|
|
108
|
+
def __init__(self, parameters: "ParameterPayload", json_serializer: "Callable[[Any], str]") -> None:
|
|
109
|
+
self._parameters = parameters
|
|
110
|
+
self._json_serializer = json_serializer
|
|
111
|
+
self._placeholder_index = 0
|
|
112
|
+
|
|
113
|
+
def _resolve_mapping_value(self, param_name: str, payload: "ParameterMapping") -> object | None:
|
|
114
|
+
candidate_names = (param_name, f"@{param_name}", f":{param_name}", f"${param_name}", f"param_{param_name}")
|
|
115
|
+
for candidate in candidate_names:
|
|
116
|
+
if candidate in payload:
|
|
117
|
+
return cast("object", get_value_attribute(payload[candidate]))
|
|
118
|
+
normalized = param_name.lstrip("@:$")
|
|
119
|
+
if normalized in payload:
|
|
120
|
+
return cast("object", get_value_attribute(payload[normalized]))
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
def __call__(self, node: Any) -> Any:
|
|
124
|
+
if (
|
|
125
|
+
isinstance(node, _exp.Placeholder)
|
|
126
|
+
and isinstance(self._parameters, Sequence)
|
|
127
|
+
and not isinstance(self._parameters, (str, bytes, bytearray))
|
|
128
|
+
):
|
|
129
|
+
current_index = self._placeholder_index
|
|
130
|
+
self._placeholder_index += 1
|
|
131
|
+
if current_index < len(self._parameters):
|
|
132
|
+
literal_value = get_value_attribute(self._parameters[current_index])
|
|
133
|
+
return _create_literal_expression(literal_value, self._json_serializer)
|
|
134
|
+
return node
|
|
135
|
+
|
|
136
|
+
if isinstance(node, _exp.Parameter):
|
|
137
|
+
param_name = str(node.this) if node.this is not None else ""
|
|
138
|
+
|
|
139
|
+
if isinstance(self._parameters, Mapping):
|
|
140
|
+
resolved_value = self._resolve_mapping_value(param_name, self._parameters)
|
|
141
|
+
if resolved_value is not None:
|
|
142
|
+
return _create_literal_expression(resolved_value, self._json_serializer)
|
|
143
|
+
return node
|
|
144
|
+
|
|
145
|
+
if isinstance(self._parameters, Sequence) and not isinstance(self._parameters, (str, bytes, bytearray)):
|
|
146
|
+
name = param_name
|
|
147
|
+
try:
|
|
148
|
+
if name.startswith("param_"):
|
|
149
|
+
index_value = int(name[6:])
|
|
150
|
+
if 0 <= index_value < len(self._parameters):
|
|
151
|
+
literal_value = get_value_attribute(self._parameters[index_value])
|
|
152
|
+
return _create_literal_expression(literal_value, self._json_serializer)
|
|
153
|
+
if name.isdigit():
|
|
154
|
+
index_value = int(name)
|
|
155
|
+
if 0 <= index_value < len(self._parameters):
|
|
156
|
+
literal_value = get_value_attribute(self._parameters[index_value])
|
|
157
|
+
return _create_literal_expression(literal_value, self._json_serializer)
|
|
158
|
+
except (ValueError, AttributeError):
|
|
159
|
+
return node
|
|
160
|
+
return node
|
|
161
|
+
|
|
162
|
+
return node
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def build_null_pruning_transform(
|
|
166
|
+
*, dialect: str = "postgres", validator: "ParameterValidator | None" = None
|
|
167
|
+
) -> "Callable[[Any, ParameterPayload, ParameterProfile], tuple[Any, ConvertedParameters]]":
|
|
168
|
+
"""Return a callable that prunes NULL placeholders from an expression."""
|
|
169
|
+
return _NullPruningTransform(dialect, validator)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def build_literal_inlining_transform(
|
|
173
|
+
*, json_serializer: "Callable[[Any], str]"
|
|
174
|
+
) -> "Callable[[Any, ParameterPayload, ParameterProfile], tuple[Any, object]]":
|
|
175
|
+
"""Return a callable that replaces placeholders with SQL literals."""
|
|
176
|
+
return _LiteralInliningTransform(json_serializer)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def replace_null_parameters_with_literals(
|
|
180
|
+
expression: Any,
|
|
181
|
+
parameters: "ParameterPayload",
|
|
182
|
+
*,
|
|
183
|
+
dialect: str = "postgres",
|
|
184
|
+
validator: "ParameterValidator | None" = None,
|
|
185
|
+
parameter_profile: "ParameterProfile | None" = None,
|
|
186
|
+
) -> "tuple[Any, ConvertedParameters]":
|
|
187
|
+
"""Rewrite placeholders representing ``NULL`` values and prune parameters.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
expression: SQLGlot expression tree to transform.
|
|
191
|
+
parameters: Parameter payload provided by the caller.
|
|
192
|
+
dialect: SQLGlot dialect for serializing the expression.
|
|
193
|
+
validator: Optional validator instance for parameter extraction.
|
|
194
|
+
parameter_profile: Optional parameter profile to reuse for validation.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
Tuple containing the transformed expression and updated parameters.
|
|
198
|
+
"""
|
|
199
|
+
if not parameters:
|
|
200
|
+
if parameters is None:
|
|
201
|
+
return expression, None
|
|
202
|
+
if isinstance(parameters, dict):
|
|
203
|
+
return expression, parameters
|
|
204
|
+
if isinstance(parameters, (list, tuple)):
|
|
205
|
+
return expression, list(parameters) if isinstance(parameters, list) else tuple(parameters)
|
|
206
|
+
return expression, None
|
|
207
|
+
|
|
208
|
+
if looks_like_execute_many(parameters):
|
|
209
|
+
# For execute_many, convert to concrete type
|
|
210
|
+
if isinstance(parameters, dict):
|
|
211
|
+
return expression, parameters
|
|
212
|
+
if isinstance(parameters, (list, tuple)):
|
|
213
|
+
return expression, list(parameters) if isinstance(parameters, list) else tuple(parameters)
|
|
214
|
+
return expression, None
|
|
215
|
+
|
|
216
|
+
validator_instance = validator or _AST_TRANSFORMER_VALIDATOR
|
|
217
|
+
profile = parameter_profile
|
|
218
|
+
if profile is None:
|
|
219
|
+
parameter_info = validator_instance.extract_parameters(expression.sql(dialect=dialect))
|
|
220
|
+
profile = ParameterProfile(parameter_info)
|
|
221
|
+
validate_parameter_alignment(profile, parameters)
|
|
222
|
+
|
|
223
|
+
null_positions = collect_null_parameter_ordinals(parameters, profile)
|
|
224
|
+
if not null_positions:
|
|
225
|
+
# Convert to concrete type for return
|
|
226
|
+
if isinstance(parameters, dict):
|
|
227
|
+
return expression, parameters
|
|
228
|
+
if isinstance(parameters, (list, tuple)):
|
|
229
|
+
return expression, list(parameters) if isinstance(parameters, list) else tuple(parameters)
|
|
230
|
+
if isinstance(parameters, Mapping):
|
|
231
|
+
return expression, dict(parameters)
|
|
232
|
+
if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
|
|
233
|
+
return expression, list(parameters)
|
|
234
|
+
return expression, None
|
|
235
|
+
|
|
236
|
+
sorted_null_positions = sorted(null_positions)
|
|
237
|
+
|
|
238
|
+
transformer = _NullPlaceholderTransformer(null_positions, sorted_null_positions)
|
|
239
|
+
transformed_expression = expression.transform(transformer)
|
|
240
|
+
|
|
241
|
+
cleaned_parameters: ConvertedParameters
|
|
242
|
+
if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes, bytearray)):
|
|
243
|
+
cleaned_list = [value for index, value in enumerate(parameters) if index not in null_positions]
|
|
244
|
+
cleaned_parameters = tuple(cleaned_list) if isinstance(parameters, tuple) else cleaned_list
|
|
245
|
+
elif isinstance(parameters, Mapping):
|
|
246
|
+
cleaned_dict: dict[str, Any] = {}
|
|
247
|
+
next_numeric_index = 1
|
|
248
|
+
|
|
249
|
+
for key, value in parameters.items():
|
|
250
|
+
if value is None:
|
|
251
|
+
continue
|
|
252
|
+
key_kind, normalized_key = normalize_parameter_key(key)
|
|
253
|
+
if key_kind == "index" and isinstance(normalized_key, int):
|
|
254
|
+
cleaned_dict[str(next_numeric_index)] = value
|
|
255
|
+
next_numeric_index += 1
|
|
256
|
+
else:
|
|
257
|
+
cleaned_dict[str(normalized_key)] = value
|
|
258
|
+
cleaned_parameters = cleaned_dict
|
|
259
|
+
else:
|
|
260
|
+
cleaned_parameters = None
|
|
261
|
+
|
|
262
|
+
return transformed_expression, cleaned_parameters
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _create_literal_expression(value: Any, json_serializer: "Callable[[Any], str]") -> Any:
|
|
266
|
+
"""Create a SQLGlot literal expression for the given value."""
|
|
267
|
+
if value is None:
|
|
268
|
+
return _exp.Null()
|
|
269
|
+
if isinstance(value, bool):
|
|
270
|
+
return _exp.Boolean(this=value)
|
|
271
|
+
if isinstance(value, (int, float)):
|
|
272
|
+
return _exp.Literal.number(str(value))
|
|
273
|
+
if isinstance(value, str):
|
|
274
|
+
return _exp.Literal.string(value)
|
|
275
|
+
if isinstance(value, (list, tuple)):
|
|
276
|
+
items = [_create_literal_expression(item, json_serializer) for item in value]
|
|
277
|
+
return _exp.Array(expressions=items)
|
|
278
|
+
if isinstance(value, dict):
|
|
279
|
+
json_value = json_serializer(value)
|
|
280
|
+
return _exp.Literal.string(json_value)
|
|
281
|
+
return _exp.Literal.string(str(value))
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def replace_placeholders_with_literals(
|
|
285
|
+
expression: Any, parameters: "ParameterPayload", *, json_serializer: "Callable[[Any], str]"
|
|
286
|
+
) -> Any:
|
|
287
|
+
"""Replace placeholders in an expression tree with literal values."""
|
|
288
|
+
if not parameters:
|
|
289
|
+
return expression
|
|
290
|
+
|
|
291
|
+
transformer = _PlaceholderLiteralTransformer(parameters, json_serializer)
|
|
292
|
+
return expression.transform(transformer)
|
|
Binary file
|