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,437 @@
|
|
|
1
|
+
"""Shared query modification utilities for SQL and builder classes.
|
|
2
|
+
|
|
3
|
+
This module provides pure functions for building SQL expressions that can be
|
|
4
|
+
used by both the immutable SQL class and the mutable builder classes. All
|
|
5
|
+
functions are designed to be mypyc-compatible with no dynamic dispatch.
|
|
6
|
+
|
|
7
|
+
The utilities are organized in layers:
|
|
8
|
+
- Expression factories: Create comparison expressions (eq, lt, like, etc.)
|
|
9
|
+
- Condition builders: Create parameterized WHERE conditions
|
|
10
|
+
- Expression modifiers: Apply WHERE, LIMIT, OFFSET to expressions
|
|
11
|
+
- CTE utilities: Safe CTE extraction and reattachment
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
>>> from sqlspec.core.query_modifiers import (
|
|
15
|
+
... expr_eq,
|
|
16
|
+
... create_condition,
|
|
17
|
+
... apply_where,
|
|
18
|
+
... )
|
|
19
|
+
>>> condition = create_condition(
|
|
20
|
+
... "status", "status_param", expr_eq
|
|
21
|
+
... )
|
|
22
|
+
>>> modified = apply_where(select_expr, condition)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from collections.abc import Callable
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
from sqlglot import exp
|
|
29
|
+
|
|
30
|
+
from sqlspec.exceptions import SQLSpecError
|
|
31
|
+
|
|
32
|
+
__all__ = (
|
|
33
|
+
"apply_limit",
|
|
34
|
+
"apply_offset",
|
|
35
|
+
"apply_or_where",
|
|
36
|
+
"apply_select_only",
|
|
37
|
+
"apply_where",
|
|
38
|
+
"create_between_condition",
|
|
39
|
+
"create_condition",
|
|
40
|
+
"create_exists_condition",
|
|
41
|
+
"create_in_condition",
|
|
42
|
+
"create_not_exists_condition",
|
|
43
|
+
"create_not_in_condition",
|
|
44
|
+
"expr_eq",
|
|
45
|
+
"expr_gt",
|
|
46
|
+
"expr_gte",
|
|
47
|
+
"expr_ilike",
|
|
48
|
+
"expr_is_not_null",
|
|
49
|
+
"expr_is_null",
|
|
50
|
+
"expr_like",
|
|
51
|
+
"expr_lt",
|
|
52
|
+
"expr_lte",
|
|
53
|
+
"expr_neq",
|
|
54
|
+
"expr_not_like",
|
|
55
|
+
"extract_column_name",
|
|
56
|
+
"parse_column_for_condition",
|
|
57
|
+
"safe_modify_with_cte",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Type alias for condition factory functions
|
|
61
|
+
ConditionFactory = Callable[[exp.Expression, exp.Placeholder], exp.Expression]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# =============================================================================
|
|
65
|
+
# Expression Factories
|
|
66
|
+
# =============================================================================
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def expr_eq(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
70
|
+
"""Create equality expression: column = :param."""
|
|
71
|
+
return exp.EQ(this=col, expression=placeholder)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def expr_neq(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
75
|
+
"""Create not-equal expression: column != :param."""
|
|
76
|
+
return exp.NEQ(this=col, expression=placeholder)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def expr_lt(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
80
|
+
"""Create less-than expression: column < :param."""
|
|
81
|
+
return exp.LT(this=col, expression=placeholder)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def expr_lte(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
85
|
+
"""Create less-than-or-equal expression: column <= :param."""
|
|
86
|
+
return exp.LTE(this=col, expression=placeholder)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def expr_gt(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
90
|
+
"""Create greater-than expression: column > :param."""
|
|
91
|
+
return exp.GT(this=col, expression=placeholder)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def expr_gte(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
95
|
+
"""Create greater-than-or-equal expression: column >= :param."""
|
|
96
|
+
return exp.GTE(this=col, expression=placeholder)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def expr_like(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
100
|
+
"""Create LIKE expression: column LIKE :param."""
|
|
101
|
+
return exp.Like(this=col, expression=placeholder)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def expr_not_like(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
105
|
+
"""Create NOT LIKE expression: NOT (column LIKE :param)."""
|
|
106
|
+
return exp.Not(this=exp.Like(this=col, expression=placeholder))
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def expr_ilike(col: exp.Expression, placeholder: exp.Placeholder) -> exp.Expression:
|
|
110
|
+
"""Create case-insensitive LIKE expression: column ILIKE :param."""
|
|
111
|
+
return exp.ILike(this=col, expression=placeholder)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def expr_is_null(col: exp.Expression, _placeholder: exp.Placeholder) -> exp.Expression:
|
|
115
|
+
"""Create IS NULL expression: column IS NULL.
|
|
116
|
+
|
|
117
|
+
Note: placeholder is ignored but kept for consistent factory signature.
|
|
118
|
+
"""
|
|
119
|
+
return exp.Is(this=col, expression=exp.null())
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def expr_is_not_null(col: exp.Expression, _placeholder: exp.Placeholder) -> exp.Expression:
|
|
123
|
+
"""Create IS NOT NULL expression: column IS NOT NULL.
|
|
124
|
+
|
|
125
|
+
Note: placeholder is ignored but kept for consistent factory signature.
|
|
126
|
+
"""
|
|
127
|
+
return exp.Not(this=exp.Is(this=col, expression=exp.null()))
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# =============================================================================
|
|
131
|
+
# Column Parsing
|
|
132
|
+
# =============================================================================
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def parse_column_for_condition(column: str | exp.Column | exp.Expression) -> exp.Expression:
|
|
136
|
+
"""Parse column specification for use in conditions.
|
|
137
|
+
|
|
138
|
+
Handles various input formats:
|
|
139
|
+
- "column_name" -> exp.Column
|
|
140
|
+
- "table.column" -> exp.Column with table
|
|
141
|
+
- exp.Column -> returned as-is
|
|
142
|
+
- Other exp.Expression -> returned as-is
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
column: Column specification
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
SQLGlot column expression
|
|
149
|
+
"""
|
|
150
|
+
if isinstance(column, exp.Expression):
|
|
151
|
+
return column
|
|
152
|
+
|
|
153
|
+
if isinstance(column, str):
|
|
154
|
+
if "." in column:
|
|
155
|
+
parts = column.split(".", 1)
|
|
156
|
+
return exp.column(parts[1], table=parts[0])
|
|
157
|
+
return exp.column(column)
|
|
158
|
+
|
|
159
|
+
return exp.column(str(column))
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def extract_column_name(column: str | exp.Column | exp.Expression) -> str:
|
|
163
|
+
"""Extract column name from column expression for parameter naming.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
column: Column expression (string or SQLGlot Column)
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Column name as string for use as parameter name base
|
|
170
|
+
"""
|
|
171
|
+
if isinstance(column, str):
|
|
172
|
+
return column.split(".")[-1] if "." in column else column
|
|
173
|
+
|
|
174
|
+
if isinstance(column, exp.Column):
|
|
175
|
+
return column.name
|
|
176
|
+
|
|
177
|
+
if isinstance(column, exp.Expression) and hasattr(column, "name") and column.name:
|
|
178
|
+
return str(column.name)
|
|
179
|
+
|
|
180
|
+
return "column"
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
# =============================================================================
|
|
184
|
+
# Condition Builders
|
|
185
|
+
# =============================================================================
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def create_condition(
|
|
189
|
+
column: str | exp.Column | exp.Expression, param_name: str, condition_factory: ConditionFactory
|
|
190
|
+
) -> exp.Expression:
|
|
191
|
+
"""Create parameterized condition expression.
|
|
192
|
+
|
|
193
|
+
This is a pure function - parameter value binding happens in the caller.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
column: Column name or expression
|
|
197
|
+
param_name: Pre-generated unique parameter name
|
|
198
|
+
condition_factory: Factory function for the condition type
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Condition expression with placeholder
|
|
202
|
+
"""
|
|
203
|
+
col_expr = parse_column_for_condition(column)
|
|
204
|
+
placeholder = exp.Placeholder(this=param_name)
|
|
205
|
+
return condition_factory(col_expr, placeholder)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def create_in_condition(column: str | exp.Column | exp.Expression, param_names: list[str]) -> exp.Expression:
|
|
209
|
+
"""Create IN condition with multiple placeholders.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
column: Column name or expression
|
|
213
|
+
param_names: Pre-generated parameter names (one per value)
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
IN expression with placeholders
|
|
217
|
+
"""
|
|
218
|
+
col_expr = parse_column_for_condition(column)
|
|
219
|
+
placeholders = [exp.Placeholder(this=name) for name in param_names]
|
|
220
|
+
return exp.In(this=col_expr, expressions=placeholders)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def create_not_in_condition(column: str | exp.Column | exp.Expression, param_names: list[str]) -> exp.Expression:
|
|
224
|
+
"""Create NOT IN condition with multiple placeholders.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
column: Column name or expression
|
|
228
|
+
param_names: Pre-generated parameter names (one per value)
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
NOT IN expression with placeholders
|
|
232
|
+
"""
|
|
233
|
+
in_expr = create_in_condition(column, param_names)
|
|
234
|
+
return exp.Not(this=in_expr)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def create_between_condition(
|
|
238
|
+
column: str | exp.Column | exp.Expression, low_param: str, high_param: str
|
|
239
|
+
) -> exp.Expression:
|
|
240
|
+
"""Create BETWEEN condition.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
column: Column name or expression
|
|
244
|
+
low_param: Parameter name for low bound
|
|
245
|
+
high_param: Parameter name for high bound
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
BETWEEN expression with placeholders
|
|
249
|
+
"""
|
|
250
|
+
col_expr = parse_column_for_condition(column)
|
|
251
|
+
low_placeholder = exp.Placeholder(this=low_param)
|
|
252
|
+
high_placeholder = exp.Placeholder(this=high_param)
|
|
253
|
+
return exp.Between(this=col_expr, low=low_placeholder, high=high_placeholder)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def create_exists_condition(subquery: exp.Expression) -> exp.Expression:
|
|
257
|
+
"""Create EXISTS condition.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
subquery: Subquery expression
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
EXISTS expression
|
|
264
|
+
"""
|
|
265
|
+
return exp.Exists(this=subquery)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def create_not_exists_condition(subquery: exp.Expression) -> exp.Expression:
|
|
269
|
+
"""Create NOT EXISTS condition.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
subquery: Subquery expression
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
NOT EXISTS expression
|
|
276
|
+
"""
|
|
277
|
+
return exp.Not(this=exp.Exists(this=subquery))
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
# =============================================================================
|
|
281
|
+
# Expression Modifiers
|
|
282
|
+
# =============================================================================
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def apply_where(expression: exp.Expression, condition: exp.Expression) -> exp.Expression:
|
|
286
|
+
"""Apply WHERE condition to an expression using AND.
|
|
287
|
+
|
|
288
|
+
Works with SELECT, UPDATE, and DELETE expressions.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
expression: Base expression to modify (will be copied)
|
|
292
|
+
condition: WHERE condition to add
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
Modified expression with WHERE condition
|
|
296
|
+
|
|
297
|
+
Raises:
|
|
298
|
+
SQLSpecError: If expression type doesn't support WHERE
|
|
299
|
+
"""
|
|
300
|
+
if not isinstance(expression, (exp.Select, exp.Update, exp.Delete)):
|
|
301
|
+
msg = f"Cannot apply WHERE to {type(expression).__name__}"
|
|
302
|
+
raise SQLSpecError(msg)
|
|
303
|
+
|
|
304
|
+
return expression.where(condition, copy=False)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def apply_or_where(expression: exp.Expression, condition: exp.Expression) -> exp.Expression:
|
|
308
|
+
"""Apply WHERE condition to an expression using OR.
|
|
309
|
+
|
|
310
|
+
Combines the new condition with any existing WHERE clause using OR.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
expression: Base expression with existing WHERE
|
|
314
|
+
condition: New condition to add with OR
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Modified expression with OR condition
|
|
318
|
+
|
|
319
|
+
Raises:
|
|
320
|
+
SQLSpecError: If expression type doesn't support WHERE or has no existing WHERE
|
|
321
|
+
"""
|
|
322
|
+
if not isinstance(expression, (exp.Select, exp.Update, exp.Delete)):
|
|
323
|
+
msg = f"Cannot apply WHERE to {type(expression).__name__}"
|
|
324
|
+
raise SQLSpecError(msg)
|
|
325
|
+
|
|
326
|
+
existing_where = expression.args.get("where")
|
|
327
|
+
if not existing_where or not isinstance(existing_where, exp.Where):
|
|
328
|
+
msg = "Cannot use OR without existing WHERE clause"
|
|
329
|
+
raise SQLSpecError(msg)
|
|
330
|
+
|
|
331
|
+
combined = exp.Or(this=existing_where.this, expression=condition)
|
|
332
|
+
existing_where.set("this", combined)
|
|
333
|
+
return expression
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def apply_limit(expression: exp.Expression, limit_value: int) -> exp.Expression:
|
|
337
|
+
"""Apply LIMIT clause to expression.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
expression: Base expression (must be SELECT)
|
|
341
|
+
limit_value: LIMIT value
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
Modified expression with LIMIT
|
|
345
|
+
|
|
346
|
+
Raises:
|
|
347
|
+
SQLSpecError: If expression is not SELECT
|
|
348
|
+
"""
|
|
349
|
+
if not isinstance(expression, exp.Select):
|
|
350
|
+
msg = f"LIMIT only valid for SELECT, got {type(expression).__name__}"
|
|
351
|
+
raise SQLSpecError(msg)
|
|
352
|
+
|
|
353
|
+
return expression.limit(limit_value, copy=False)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def apply_offset(expression: exp.Expression, offset_value: int) -> exp.Expression:
|
|
357
|
+
"""Apply OFFSET clause to expression.
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
expression: Base expression (must be SELECT)
|
|
361
|
+
offset_value: OFFSET value
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
Modified expression with OFFSET
|
|
365
|
+
|
|
366
|
+
Raises:
|
|
367
|
+
SQLSpecError: If expression is not SELECT
|
|
368
|
+
"""
|
|
369
|
+
if not isinstance(expression, exp.Select):
|
|
370
|
+
msg = f"OFFSET only valid for SELECT, got {type(expression).__name__}"
|
|
371
|
+
raise SQLSpecError(msg)
|
|
372
|
+
|
|
373
|
+
return expression.offset(offset_value, copy=False)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def apply_select_only(expression: exp.Expression, columns: tuple[str | exp.Expression, ...]) -> exp.Expression:
|
|
377
|
+
"""Replace SELECT clause with only specified columns.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
expression: Base expression (must be SELECT)
|
|
381
|
+
columns: Column names or expressions to select
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
Modified expression with new SELECT columns
|
|
385
|
+
|
|
386
|
+
Raises:
|
|
387
|
+
SQLSpecError: If expression is not SELECT
|
|
388
|
+
"""
|
|
389
|
+
if not isinstance(expression, exp.Select):
|
|
390
|
+
msg = f"select_only only valid for SELECT, got {type(expression).__name__}"
|
|
391
|
+
raise SQLSpecError(msg)
|
|
392
|
+
|
|
393
|
+
expression.set("expressions", [])
|
|
394
|
+
|
|
395
|
+
for col in columns:
|
|
396
|
+
col_expr = parse_column_for_condition(col) if isinstance(col, str) else col
|
|
397
|
+
expression = expression.select(col_expr, copy=False)
|
|
398
|
+
|
|
399
|
+
return expression
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
# =============================================================================
|
|
403
|
+
# CTE Utilities
|
|
404
|
+
# =============================================================================
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def safe_modify_with_cte(
|
|
408
|
+
expression: exp.Expression, modification_fn: Callable[[exp.Expression], exp.Expression]
|
|
409
|
+
) -> exp.Expression:
|
|
410
|
+
"""Safely apply a modification, preserving CTEs at top level.
|
|
411
|
+
|
|
412
|
+
This ensures CTEs stay at the outermost level even when the modification
|
|
413
|
+
would normally wrap them in a subquery. This fixes issue #301 where
|
|
414
|
+
CTEs inside subqueries generate invalid SQL.
|
|
415
|
+
|
|
416
|
+
Args:
|
|
417
|
+
expression: Expression that may contain CTEs
|
|
418
|
+
modification_fn: Function to apply to the expression
|
|
419
|
+
|
|
420
|
+
Returns:
|
|
421
|
+
Modified expression with CTE preserved at top level
|
|
422
|
+
"""
|
|
423
|
+
cte: Any = None
|
|
424
|
+
working_expr = expression
|
|
425
|
+
|
|
426
|
+
if isinstance(expression, exp.Select):
|
|
427
|
+
cte = expression.args.get("with_")
|
|
428
|
+
if cte:
|
|
429
|
+
working_expr = expression.copy()
|
|
430
|
+
working_expr.set("with_", None)
|
|
431
|
+
|
|
432
|
+
result = modification_fn(working_expr)
|
|
433
|
+
|
|
434
|
+
if cte and isinstance(result, exp.Select):
|
|
435
|
+
result.set("with_", cte)
|
|
436
|
+
|
|
437
|
+
return result
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""SQL result classes and helpers."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.core.result._base import (
|
|
4
|
+
ArrowResult,
|
|
5
|
+
EmptyResult,
|
|
6
|
+
SQLResult,
|
|
7
|
+
StackResult,
|
|
8
|
+
StatementResult,
|
|
9
|
+
build_arrow_result_from_table,
|
|
10
|
+
create_arrow_result,
|
|
11
|
+
create_sql_result,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = (
|
|
15
|
+
"ArrowResult",
|
|
16
|
+
"EmptyResult",
|
|
17
|
+
"SQLResult",
|
|
18
|
+
"StackResult",
|
|
19
|
+
"StatementResult",
|
|
20
|
+
"build_arrow_result_from_table",
|
|
21
|
+
"create_arrow_result",
|
|
22
|
+
"create_sql_result",
|
|
23
|
+
)
|
|
Binary file
|