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,505 @@
|
|
|
1
|
+
"""Parameter processing pipeline orchestrator."""
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
from collections import OrderedDict
|
|
5
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from mypy_extensions import mypyc_attr
|
|
9
|
+
|
|
10
|
+
from sqlspec.core.parameters._alignment import looks_like_execute_many
|
|
11
|
+
from sqlspec.core.parameters._converter import ParameterConverter
|
|
12
|
+
from sqlspec.core.parameters._types import (
|
|
13
|
+
ConvertedParameters,
|
|
14
|
+
ParameterInfo,
|
|
15
|
+
ParameterPayload,
|
|
16
|
+
ParameterProcessingResult,
|
|
17
|
+
ParameterProfile,
|
|
18
|
+
ParameterStyle,
|
|
19
|
+
ParameterStyleConfig,
|
|
20
|
+
TypedParameter,
|
|
21
|
+
wrap_with_type,
|
|
22
|
+
)
|
|
23
|
+
from sqlspec.core.parameters._validator import ParameterValidator
|
|
24
|
+
|
|
25
|
+
__all__ = ("ParameterProcessor", "fingerprint_parameters")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _mapping_item_sort_key(item: "tuple[object, object]") -> str:
|
|
29
|
+
return repr(item[0])
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _fingerprint_parameters(parameters: "ParameterPayload") -> str:
|
|
33
|
+
"""Return a stable fingerprint for caching parameter payloads.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
parameters: Original parameter payload supplied by the caller.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Deterministic fingerprint string derived from the parameter payload.
|
|
40
|
+
"""
|
|
41
|
+
if parameters is None:
|
|
42
|
+
return "none"
|
|
43
|
+
|
|
44
|
+
if isinstance(parameters, Mapping):
|
|
45
|
+
if not parameters:
|
|
46
|
+
return f"{type(parameters).__name__}:empty"
|
|
47
|
+
try:
|
|
48
|
+
items = sorted(parameters.items(), key=_mapping_item_sort_key)
|
|
49
|
+
except Exception:
|
|
50
|
+
items = list(parameters.items())
|
|
51
|
+
data = repr(tuple(items))
|
|
52
|
+
elif isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes, bytearray)):
|
|
53
|
+
if not parameters:
|
|
54
|
+
return f"{type(parameters).__name__}:empty"
|
|
55
|
+
data = repr(tuple(parameters))
|
|
56
|
+
else:
|
|
57
|
+
data = repr(parameters)
|
|
58
|
+
|
|
59
|
+
digest = hashlib.blake2b(data.encode("utf-8"), digest_size=8).hexdigest()
|
|
60
|
+
return f"{type(parameters).__name__}:{digest}"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def fingerprint_parameters(parameters: "ParameterPayload") -> str:
|
|
64
|
+
"""Return a stable fingerprint for parameter payloads.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
parameters: Original parameter payload supplied by the caller.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
Deterministic fingerprint string derived from the parameter payload.
|
|
71
|
+
"""
|
|
72
|
+
return _fingerprint_parameters(parameters)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _coerce_nested_value(value: object, type_coercion_map: "dict[type, Callable[[Any], Any]]") -> object:
|
|
76
|
+
if isinstance(value, (list, tuple)) and not isinstance(value, (str, bytes)):
|
|
77
|
+
return [_coerce_parameter_value(item, type_coercion_map) for item in value]
|
|
78
|
+
if isinstance(value, dict):
|
|
79
|
+
return {key: _coerce_parameter_value(val, type_coercion_map) for key, val in value.items()}
|
|
80
|
+
return value
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _coerce_parameter_value(value: object, type_coercion_map: "dict[type, Callable[[Any], Any]]") -> object:
|
|
84
|
+
if value is None:
|
|
85
|
+
return value
|
|
86
|
+
|
|
87
|
+
if isinstance(value, TypedParameter):
|
|
88
|
+
wrapped_value: object = value.value
|
|
89
|
+
if wrapped_value is None:
|
|
90
|
+
return wrapped_value
|
|
91
|
+
original_type = value.original_type
|
|
92
|
+
if original_type in type_coercion_map:
|
|
93
|
+
coerced = type_coercion_map[original_type](wrapped_value)
|
|
94
|
+
return _coerce_nested_value(coerced, type_coercion_map)
|
|
95
|
+
return wrapped_value
|
|
96
|
+
|
|
97
|
+
value_type = type(value)
|
|
98
|
+
if value_type in type_coercion_map:
|
|
99
|
+
coerced = type_coercion_map[value_type](value)
|
|
100
|
+
return _coerce_nested_value(coerced, type_coercion_map)
|
|
101
|
+
return value
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _coerce_parameter_set(param_set: object, type_coercion_map: "dict[type, Callable[[Any], Any]]") -> object:
|
|
105
|
+
if isinstance(param_set, Sequence) and not isinstance(param_set, (str, bytes)):
|
|
106
|
+
return [_coerce_parameter_value(item, type_coercion_map) for item in param_set]
|
|
107
|
+
if isinstance(param_set, Mapping):
|
|
108
|
+
return {key: _coerce_parameter_value(val, type_coercion_map) for key, val in param_set.items()}
|
|
109
|
+
return _coerce_parameter_value(param_set, type_coercion_map)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _coerce_parameters_payload(
|
|
113
|
+
parameters: "ParameterPayload", type_coercion_map: "dict[type, Callable[[Any], Any]]", is_many: bool
|
|
114
|
+
) -> object:
|
|
115
|
+
if is_many and isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
|
|
116
|
+
return [_coerce_parameter_set(param_set, type_coercion_map) for param_set in parameters]
|
|
117
|
+
if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
|
|
118
|
+
return [_coerce_parameter_value(item, type_coercion_map) for item in parameters]
|
|
119
|
+
if isinstance(parameters, Mapping):
|
|
120
|
+
return {key: _coerce_parameter_value(val, type_coercion_map) for key, val in parameters.items()}
|
|
121
|
+
return _coerce_parameter_value(parameters, type_coercion_map)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@mypyc_attr(allow_interpreted_subclasses=False)
|
|
125
|
+
class ParameterProcessor:
|
|
126
|
+
"""Parameter processing engine coordinating conversion phases."""
|
|
127
|
+
|
|
128
|
+
__slots__ = ("_cache", "_cache_hits", "_cache_max_size", "_cache_misses", "_converter", "_validator")
|
|
129
|
+
|
|
130
|
+
DEFAULT_CACHE_SIZE = 1000
|
|
131
|
+
|
|
132
|
+
def __init__(
|
|
133
|
+
self,
|
|
134
|
+
*,
|
|
135
|
+
converter: "ParameterConverter | None" = None,
|
|
136
|
+
validator: "ParameterValidator | None" = None,
|
|
137
|
+
cache_max_size: int | None = None,
|
|
138
|
+
validator_cache_max_size: int | None = None,
|
|
139
|
+
) -> None:
|
|
140
|
+
self._cache: OrderedDict[str, ParameterProcessingResult] = OrderedDict()
|
|
141
|
+
if cache_max_size is None:
|
|
142
|
+
cache_max_size = self.DEFAULT_CACHE_SIZE
|
|
143
|
+
self._cache_max_size = max(cache_max_size, 0)
|
|
144
|
+
self._cache_hits = 0
|
|
145
|
+
self._cache_misses = 0
|
|
146
|
+
if converter is None:
|
|
147
|
+
if validator is None:
|
|
148
|
+
validator_cache = validator_cache_max_size
|
|
149
|
+
if validator_cache is None:
|
|
150
|
+
validator_cache = self._cache_max_size
|
|
151
|
+
validator = ParameterValidator(cache_max_size=validator_cache)
|
|
152
|
+
self._validator = validator
|
|
153
|
+
self._converter = ParameterConverter(self._validator)
|
|
154
|
+
else:
|
|
155
|
+
self._converter = converter
|
|
156
|
+
if validator is None:
|
|
157
|
+
self._validator = converter.validator
|
|
158
|
+
else:
|
|
159
|
+
self._validator = validator
|
|
160
|
+
self._converter.validator = validator
|
|
161
|
+
if validator_cache_max_size is not None and isinstance(self._validator, ParameterValidator):
|
|
162
|
+
self._validator.set_cache_max_size(validator_cache_max_size)
|
|
163
|
+
|
|
164
|
+
def clear_cache(self) -> None:
|
|
165
|
+
"""Clear cached processing results and reset stats."""
|
|
166
|
+
self._cache.clear()
|
|
167
|
+
self._cache_hits = 0
|
|
168
|
+
self._cache_misses = 0
|
|
169
|
+
if isinstance(self._validator, ParameterValidator):
|
|
170
|
+
self._validator.clear_cache()
|
|
171
|
+
|
|
172
|
+
def cache_stats(self) -> "dict[str, int]":
|
|
173
|
+
"""Return cache statistics for parameter processing."""
|
|
174
|
+
stats = {
|
|
175
|
+
"hits": self._cache_hits,
|
|
176
|
+
"misses": self._cache_misses,
|
|
177
|
+
"size": len(self._cache),
|
|
178
|
+
"max_size": self._cache_max_size,
|
|
179
|
+
}
|
|
180
|
+
if isinstance(self._validator, ParameterValidator):
|
|
181
|
+
validator_stats = self._validator.cache_stats()
|
|
182
|
+
stats["validator_hits"] = validator_stats["hits"]
|
|
183
|
+
stats["validator_misses"] = validator_stats["misses"]
|
|
184
|
+
stats["validator_size"] = validator_stats["size"]
|
|
185
|
+
stats["validator_max_size"] = validator_stats["max_size"]
|
|
186
|
+
else:
|
|
187
|
+
stats["validator_hits"] = 0
|
|
188
|
+
stats["validator_misses"] = 0
|
|
189
|
+
stats["validator_size"] = 0
|
|
190
|
+
stats["validator_max_size"] = 0
|
|
191
|
+
return stats
|
|
192
|
+
|
|
193
|
+
def _compile_static_script(
|
|
194
|
+
self, sql: str, parameters: "ParameterPayload", config: "ParameterStyleConfig", is_many: bool, cache_key: str
|
|
195
|
+
) -> "ParameterProcessingResult":
|
|
196
|
+
coerced_params = parameters
|
|
197
|
+
if config.type_coercion_map and parameters:
|
|
198
|
+
coerced_params = self._coerce_parameter_types(parameters, config.type_coercion_map, is_many)
|
|
199
|
+
|
|
200
|
+
static_sql, static_params = self._converter.convert_placeholder_style(
|
|
201
|
+
sql, coerced_params, ParameterStyle.STATIC, is_many, strict_named_parameters=config.strict_named_parameters
|
|
202
|
+
)
|
|
203
|
+
result = ParameterProcessingResult(static_sql, static_params, ParameterProfile.empty(), sqlglot_sql=static_sql)
|
|
204
|
+
return self._store_cached_result(cache_key, result)
|
|
205
|
+
|
|
206
|
+
def _select_execution_style(
|
|
207
|
+
self, original_styles: "set[ParameterStyle]", config: "ParameterStyleConfig"
|
|
208
|
+
) -> "ParameterStyle":
|
|
209
|
+
if len(original_styles) == 1 and config.supported_execution_parameter_styles is not None:
|
|
210
|
+
original_style = next(iter(original_styles))
|
|
211
|
+
if original_style in config.supported_execution_parameter_styles:
|
|
212
|
+
return original_style
|
|
213
|
+
return config.default_execution_parameter_style or config.default_parameter_style
|
|
214
|
+
|
|
215
|
+
def _wrap_parameter_types(self, parameters: "ParameterPayload") -> "ConvertedParameters":
|
|
216
|
+
if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
|
|
217
|
+
return [wrap_with_type(p) for p in parameters]
|
|
218
|
+
if isinstance(parameters, Mapping):
|
|
219
|
+
return {k: wrap_with_type(v) for k, v in parameters.items()}
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
def _coerce_parameter_types(
|
|
223
|
+
self,
|
|
224
|
+
parameters: "ParameterPayload",
|
|
225
|
+
type_coercion_map: "dict[type, Callable[[Any], Any]]",
|
|
226
|
+
is_many: bool = False,
|
|
227
|
+
) -> "ConvertedParameters":
|
|
228
|
+
result = _coerce_parameters_payload(parameters, type_coercion_map, is_many)
|
|
229
|
+
# Type narrow the result - _coerce_parameters_payload returns object but we know it produces concrete types
|
|
230
|
+
if result is None:
|
|
231
|
+
return None
|
|
232
|
+
if isinstance(result, dict):
|
|
233
|
+
return result
|
|
234
|
+
if isinstance(result, list):
|
|
235
|
+
return result
|
|
236
|
+
if isinstance(result, tuple):
|
|
237
|
+
return result
|
|
238
|
+
return None
|
|
239
|
+
|
|
240
|
+
def _store_cached_result(self, cache_key: str, result: "ParameterProcessingResult") -> "ParameterProcessingResult":
|
|
241
|
+
if self._cache_max_size <= 0:
|
|
242
|
+
return result
|
|
243
|
+
self._cache[cache_key] = result
|
|
244
|
+
self._cache.move_to_end(cache_key)
|
|
245
|
+
if len(self._cache) > self._cache_max_size:
|
|
246
|
+
self._cache.popitem(last=False)
|
|
247
|
+
return result
|
|
248
|
+
|
|
249
|
+
def _needs_mapping_normalization(
|
|
250
|
+
self, payload: "ParameterPayload", param_info: "list[ParameterInfo]", is_many: bool
|
|
251
|
+
) -> bool:
|
|
252
|
+
if not payload or not param_info:
|
|
253
|
+
return False
|
|
254
|
+
|
|
255
|
+
has_named_placeholders = any(
|
|
256
|
+
param.style
|
|
257
|
+
in {
|
|
258
|
+
ParameterStyle.NAMED_COLON,
|
|
259
|
+
ParameterStyle.NAMED_AT,
|
|
260
|
+
ParameterStyle.NAMED_DOLLAR,
|
|
261
|
+
ParameterStyle.NAMED_PYFORMAT,
|
|
262
|
+
}
|
|
263
|
+
for param in param_info
|
|
264
|
+
)
|
|
265
|
+
if has_named_placeholders:
|
|
266
|
+
return False
|
|
267
|
+
|
|
268
|
+
looks_many = is_many or looks_like_execute_many(payload)
|
|
269
|
+
if not looks_many:
|
|
270
|
+
return False
|
|
271
|
+
|
|
272
|
+
if isinstance(payload, Mapping):
|
|
273
|
+
return True
|
|
274
|
+
|
|
275
|
+
if isinstance(payload, Sequence) and not isinstance(payload, (str, bytes, bytearray)):
|
|
276
|
+
return any(isinstance(item, Mapping) for item in payload)
|
|
277
|
+
|
|
278
|
+
return False
|
|
279
|
+
|
|
280
|
+
def _normalize_sql_for_parsing(self, sql: str, param_info: "list[ParameterInfo]", dialect: str | None) -> str:
|
|
281
|
+
if not self._needs_parse_normalization(param_info, dialect):
|
|
282
|
+
return sql
|
|
283
|
+
normalized_sql, _ = self._converter.normalize_sql_for_parsing(sql, dialect, param_info=param_info)
|
|
284
|
+
return normalized_sql
|
|
285
|
+
|
|
286
|
+
def _make_processor_cache_key(
|
|
287
|
+
self,
|
|
288
|
+
sql: str,
|
|
289
|
+
parameters: "ParameterPayload",
|
|
290
|
+
config: "ParameterStyleConfig",
|
|
291
|
+
is_many: bool,
|
|
292
|
+
dialect: str | None,
|
|
293
|
+
wrap_types: bool,
|
|
294
|
+
normalize_for_parsing: bool,
|
|
295
|
+
) -> str:
|
|
296
|
+
param_fingerprint = _fingerprint_parameters(parameters)
|
|
297
|
+
dialect_marker = dialect or "default"
|
|
298
|
+
default_style = config.default_parameter_style.value if config.default_parameter_style else "unknown"
|
|
299
|
+
return (
|
|
300
|
+
f"{sql}:{param_fingerprint}:{default_style}:{is_many}:{dialect_marker}:{wrap_types}:{normalize_for_parsing}"
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
def process(
|
|
304
|
+
self,
|
|
305
|
+
sql: str,
|
|
306
|
+
parameters: "ParameterPayload",
|
|
307
|
+
config: "ParameterStyleConfig",
|
|
308
|
+
dialect: str | None = None,
|
|
309
|
+
is_many: bool = False,
|
|
310
|
+
wrap_types: bool = True,
|
|
311
|
+
) -> "ParameterProcessingResult":
|
|
312
|
+
return self._process_internal(
|
|
313
|
+
sql, parameters, config, dialect=dialect, is_many=is_many, wrap_types=wrap_types, normalize_for_parsing=True
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
def process_for_execution(
|
|
317
|
+
self,
|
|
318
|
+
sql: str,
|
|
319
|
+
parameters: "ParameterPayload",
|
|
320
|
+
config: "ParameterStyleConfig",
|
|
321
|
+
dialect: str | None = None,
|
|
322
|
+
is_many: bool = False,
|
|
323
|
+
wrap_types: bool = True,
|
|
324
|
+
) -> "ParameterProcessingResult":
|
|
325
|
+
"""Process parameters for execution without parse normalization.
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
sql: SQL string to process.
|
|
329
|
+
parameters: Parameter payload.
|
|
330
|
+
config: Parameter style configuration.
|
|
331
|
+
dialect: Optional SQL dialect.
|
|
332
|
+
is_many: Whether this is execute_many.
|
|
333
|
+
wrap_types: Whether to wrap parameters with type metadata.
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
ParameterProcessingResult with execution SQL and parameters.
|
|
337
|
+
"""
|
|
338
|
+
return self._process_internal(
|
|
339
|
+
sql,
|
|
340
|
+
parameters,
|
|
341
|
+
config,
|
|
342
|
+
dialect=dialect,
|
|
343
|
+
is_many=is_many,
|
|
344
|
+
wrap_types=wrap_types,
|
|
345
|
+
normalize_for_parsing=False,
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
def _process_internal(
|
|
349
|
+
self,
|
|
350
|
+
sql: str,
|
|
351
|
+
parameters: "ParameterPayload",
|
|
352
|
+
config: "ParameterStyleConfig",
|
|
353
|
+
*,
|
|
354
|
+
dialect: str | None,
|
|
355
|
+
is_many: bool,
|
|
356
|
+
wrap_types: bool,
|
|
357
|
+
normalize_for_parsing: bool,
|
|
358
|
+
) -> "ParameterProcessingResult":
|
|
359
|
+
cache_key = self._make_processor_cache_key(
|
|
360
|
+
sql, parameters, config, is_many, dialect, wrap_types, normalize_for_parsing
|
|
361
|
+
)
|
|
362
|
+
if self._cache_max_size > 0:
|
|
363
|
+
cached_result = self._cache.get(cache_key)
|
|
364
|
+
if cached_result is not None:
|
|
365
|
+
self._cache.move_to_end(cache_key)
|
|
366
|
+
self._cache_hits += 1
|
|
367
|
+
return cached_result
|
|
368
|
+
self._cache_misses += 1
|
|
369
|
+
|
|
370
|
+
param_info = self._validator.extract_parameters(sql)
|
|
371
|
+
original_styles = {p.style for p in param_info} if param_info else set()
|
|
372
|
+
needs_execution_conversion = self._needs_execution_placeholder_conversion(param_info, config)
|
|
373
|
+
|
|
374
|
+
if config.needs_static_script_compilation and param_info and parameters and not is_many:
|
|
375
|
+
return self._compile_static_script(sql, parameters, config, is_many, cache_key)
|
|
376
|
+
|
|
377
|
+
requires_mapping = self._needs_mapping_normalization(parameters, param_info, is_many)
|
|
378
|
+
if (
|
|
379
|
+
not needs_execution_conversion
|
|
380
|
+
and not config.type_coercion_map
|
|
381
|
+
and not config.output_transformer
|
|
382
|
+
and not requires_mapping
|
|
383
|
+
):
|
|
384
|
+
normalized_sql = self._normalize_sql_for_parsing(sql, param_info, dialect) if normalize_for_parsing else sql
|
|
385
|
+
result = ParameterProcessingResult(
|
|
386
|
+
sql, parameters, ParameterProfile(param_info), sqlglot_sql=normalized_sql
|
|
387
|
+
)
|
|
388
|
+
return self._store_cached_result(cache_key, result)
|
|
389
|
+
|
|
390
|
+
processed_sql, processed_parameters = sql, parameters
|
|
391
|
+
|
|
392
|
+
if requires_mapping:
|
|
393
|
+
target_style = self._select_execution_style(original_styles, config)
|
|
394
|
+
processed_sql, processed_parameters = self._converter.convert_placeholder_style(
|
|
395
|
+
processed_sql,
|
|
396
|
+
processed_parameters,
|
|
397
|
+
target_style,
|
|
398
|
+
is_many,
|
|
399
|
+
strict_named_parameters=config.strict_named_parameters,
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
if processed_parameters and wrap_types:
|
|
403
|
+
processed_parameters = self._wrap_parameter_types(processed_parameters)
|
|
404
|
+
|
|
405
|
+
if config.type_coercion_map and processed_parameters:
|
|
406
|
+
processed_parameters = self._coerce_parameter_types(processed_parameters, config.type_coercion_map, is_many)
|
|
407
|
+
|
|
408
|
+
processed_sql, processed_parameters = self._convert_placeholders_for_execution(
|
|
409
|
+
processed_sql, processed_parameters, config, original_styles, needs_execution_conversion, is_many
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
if config.output_transformer:
|
|
413
|
+
processed_sql, processed_parameters = config.output_transformer(processed_sql, processed_parameters)
|
|
414
|
+
|
|
415
|
+
final_param_info = self._validator.extract_parameters(processed_sql)
|
|
416
|
+
final_profile = ParameterProfile(final_param_info)
|
|
417
|
+
sqlglot_sql = (
|
|
418
|
+
self._normalize_sql_for_parsing(processed_sql, final_param_info, dialect)
|
|
419
|
+
if normalize_for_parsing
|
|
420
|
+
else processed_sql
|
|
421
|
+
)
|
|
422
|
+
result = ParameterProcessingResult(processed_sql, processed_parameters, final_profile, sqlglot_sql=sqlglot_sql)
|
|
423
|
+
|
|
424
|
+
return self._store_cached_result(cache_key, result)
|
|
425
|
+
|
|
426
|
+
def _needs_execution_placeholder_conversion(
|
|
427
|
+
self, param_info: "list[ParameterInfo]", config: "ParameterStyleConfig"
|
|
428
|
+
) -> bool:
|
|
429
|
+
"""Determine whether execution placeholder conversion is required."""
|
|
430
|
+
if config.needs_static_script_compilation:
|
|
431
|
+
return True
|
|
432
|
+
|
|
433
|
+
if not param_info:
|
|
434
|
+
return False
|
|
435
|
+
|
|
436
|
+
current_styles = {param.style for param in param_info}
|
|
437
|
+
|
|
438
|
+
if (
|
|
439
|
+
config.allow_mixed_parameter_styles
|
|
440
|
+
and len(current_styles) > 1
|
|
441
|
+
and config.supported_execution_parameter_styles is not None
|
|
442
|
+
and len(config.supported_execution_parameter_styles) > 1
|
|
443
|
+
and all(style in config.supported_execution_parameter_styles for style in current_styles)
|
|
444
|
+
):
|
|
445
|
+
return False
|
|
446
|
+
|
|
447
|
+
if (
|
|
448
|
+
config.supported_execution_parameter_styles is not None
|
|
449
|
+
and len(config.supported_execution_parameter_styles) > 1
|
|
450
|
+
and all(style in config.supported_execution_parameter_styles for style in current_styles)
|
|
451
|
+
):
|
|
452
|
+
return False
|
|
453
|
+
|
|
454
|
+
if len(current_styles) > 1:
|
|
455
|
+
return True
|
|
456
|
+
|
|
457
|
+
if len(current_styles) == 1:
|
|
458
|
+
current_style = next(iter(current_styles))
|
|
459
|
+
supported_styles = config.supported_execution_parameter_styles
|
|
460
|
+
if supported_styles is None:
|
|
461
|
+
return True
|
|
462
|
+
return current_style not in supported_styles
|
|
463
|
+
|
|
464
|
+
return True
|
|
465
|
+
|
|
466
|
+
def _needs_parse_normalization(self, param_info: "list[ParameterInfo]", dialect: str | None = None) -> bool:
|
|
467
|
+
incompatible_styles = self._validator.get_sqlglot_incompatible_styles(dialect)
|
|
468
|
+
return any(p.style in incompatible_styles for p in param_info)
|
|
469
|
+
|
|
470
|
+
def _convert_placeholders_for_execution(
|
|
471
|
+
self,
|
|
472
|
+
sql: str,
|
|
473
|
+
parameters: "ParameterPayload",
|
|
474
|
+
config: "ParameterStyleConfig",
|
|
475
|
+
original_styles: "set[ParameterStyle]",
|
|
476
|
+
needs_execution_conversion: bool,
|
|
477
|
+
is_many: bool,
|
|
478
|
+
) -> "tuple[str, ConvertedParameters]":
|
|
479
|
+
if not needs_execution_conversion:
|
|
480
|
+
# Convert parameters to concrete type for return
|
|
481
|
+
if parameters is None:
|
|
482
|
+
return sql, None
|
|
483
|
+
if isinstance(parameters, dict):
|
|
484
|
+
return sql, parameters
|
|
485
|
+
if isinstance(parameters, list):
|
|
486
|
+
return sql, parameters
|
|
487
|
+
if isinstance(parameters, tuple):
|
|
488
|
+
return sql, parameters
|
|
489
|
+
if isinstance(parameters, Mapping):
|
|
490
|
+
return sql, dict(parameters)
|
|
491
|
+
if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
|
|
492
|
+
return sql, list(parameters)
|
|
493
|
+
return sql, None
|
|
494
|
+
|
|
495
|
+
if is_many and config.preserve_original_params_for_many and isinstance(parameters, (list, tuple)):
|
|
496
|
+
target_style = self._select_execution_style(original_styles, config)
|
|
497
|
+
processed_sql, _ = self._converter.convert_placeholder_style(
|
|
498
|
+
sql, parameters, target_style, is_many, strict_named_parameters=config.strict_named_parameters
|
|
499
|
+
)
|
|
500
|
+
return processed_sql, parameters
|
|
501
|
+
|
|
502
|
+
target_style = self._select_execution_style(original_styles, config)
|
|
503
|
+
return self._converter.convert_placeholder_style(
|
|
504
|
+
sql, parameters, target_style, is_many, strict_named_parameters=config.strict_named_parameters
|
|
505
|
+
)
|
|
Binary file
|