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
|
Binary file
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""DELETE statement builder.
|
|
2
|
+
|
|
3
|
+
Provides a fluent interface for building SQL DELETE queries with
|
|
4
|
+
parameter binding and validation.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
|
+
|
|
9
|
+
from sqlglot import exp
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from sqlglot.dialects.dialect import DialectType
|
|
13
|
+
|
|
14
|
+
from sqlspec.builder._base import BuiltQuery, QueryBuilder
|
|
15
|
+
from sqlspec.builder._dml import DeleteFromClauseMixin
|
|
16
|
+
from sqlspec.builder._explain import ExplainMixin
|
|
17
|
+
from sqlspec.builder._select import ReturningClauseMixin, WhereClauseMixin
|
|
18
|
+
from sqlspec.core import SQLResult
|
|
19
|
+
from sqlspec.exceptions import SQLBuilderError
|
|
20
|
+
|
|
21
|
+
__all__ = ("Delete",)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Delete(QueryBuilder, WhereClauseMixin, ReturningClauseMixin, DeleteFromClauseMixin, ExplainMixin):
|
|
25
|
+
"""Builder for DELETE statements.
|
|
26
|
+
|
|
27
|
+
Constructs SQL DELETE statements with parameter binding and validation.
|
|
28
|
+
Does not support JOIN operations to maintain cross-dialect compatibility.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
__slots__ = ()
|
|
32
|
+
_expression: exp.Expression | None
|
|
33
|
+
|
|
34
|
+
def __init__(self, table: str | None = None, **kwargs: Any) -> None:
|
|
35
|
+
"""Initialize DELETE with optional table.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
table: Target table name
|
|
39
|
+
**kwargs: Additional QueryBuilder arguments
|
|
40
|
+
"""
|
|
41
|
+
(dialect, schema, enable_optimization, optimize_joins, optimize_predicates, simplify_expressions) = (
|
|
42
|
+
self._parse_query_builder_kwargs(kwargs)
|
|
43
|
+
)
|
|
44
|
+
super().__init__(
|
|
45
|
+
dialect=dialect,
|
|
46
|
+
schema=schema,
|
|
47
|
+
enable_optimization=enable_optimization,
|
|
48
|
+
optimize_joins=optimize_joins,
|
|
49
|
+
optimize_predicates=optimize_predicates,
|
|
50
|
+
simplify_expressions=simplify_expressions,
|
|
51
|
+
)
|
|
52
|
+
self._initialize_expression()
|
|
53
|
+
|
|
54
|
+
if table:
|
|
55
|
+
self.from_(table)
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def _expected_result_type(self) -> "type[SQLResult]":
|
|
59
|
+
"""Get the expected result type for DELETE operations.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
The ExecuteResult type for DELETE statements.
|
|
63
|
+
"""
|
|
64
|
+
return SQLResult
|
|
65
|
+
|
|
66
|
+
def _create_base_expression(self) -> "exp.Delete":
|
|
67
|
+
"""Create a new sqlglot Delete expression.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
A new sqlglot Delete expression.
|
|
71
|
+
"""
|
|
72
|
+
return exp.Delete()
|
|
73
|
+
|
|
74
|
+
def build(self, dialect: "DialectType" = None) -> "BuiltQuery":
|
|
75
|
+
"""Build the DELETE query with validation.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
dialect: Optional dialect override for SQL generation.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
BuiltQuery: The built query with SQL and parameters.
|
|
82
|
+
|
|
83
|
+
Raises:
|
|
84
|
+
SQLBuilderError: If the table is not specified.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if self._expression is None or not isinstance(self._expression, exp.Delete):
|
|
88
|
+
msg = "DELETE requires a table to be specified. Use from() to set the table."
|
|
89
|
+
raise SQLBuilderError(msg)
|
|
90
|
+
|
|
91
|
+
if self._expression.this is None:
|
|
92
|
+
msg = "DELETE requires a table to be specified. Use from() to set the table."
|
|
93
|
+
raise SQLBuilderError(msg)
|
|
94
|
+
|
|
95
|
+
return super().build(dialect=dialect)
|
|
Binary file
|
sqlspec/builder/_dml.py
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"""Reusable mixins for INSERT/UPDATE/DELETE builders."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping, Sequence
|
|
4
|
+
from typing import Any, cast
|
|
5
|
+
|
|
6
|
+
from mypy_extensions import trait
|
|
7
|
+
from sqlglot import exp
|
|
8
|
+
from typing_extensions import Self
|
|
9
|
+
|
|
10
|
+
from sqlspec.builder._base import BuiltQuery, QueryBuilder
|
|
11
|
+
from sqlspec.builder._parsing_utils import extract_sql_object_expression
|
|
12
|
+
from sqlspec.exceptions import SQLBuilderError
|
|
13
|
+
from sqlspec.protocols import SQLBuilderProtocol
|
|
14
|
+
from sqlspec.utils.type_guards import has_expression_and_sql, has_parameter_builder, is_dict
|
|
15
|
+
|
|
16
|
+
__all__ = (
|
|
17
|
+
"DeleteFromClauseMixin",
|
|
18
|
+
"InsertFromSelectMixin",
|
|
19
|
+
"InsertIntoClauseMixin",
|
|
20
|
+
"InsertValuesMixin",
|
|
21
|
+
"UpdateFromClauseMixin",
|
|
22
|
+
"UpdateSetClauseMixin",
|
|
23
|
+
"UpdateTableClauseMixin",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
ARG_PAIR_COUNT = 2
|
|
27
|
+
SINGLE_VALUE_COUNT = 1
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
# DELETE helpers
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@trait
|
|
36
|
+
class DeleteFromClauseMixin:
|
|
37
|
+
"""Mixin providing FROM clause support for DELETE builders."""
|
|
38
|
+
|
|
39
|
+
__slots__ = ()
|
|
40
|
+
|
|
41
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
42
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
43
|
+
|
|
44
|
+
def from_(self, table: str) -> Self:
|
|
45
|
+
current_expr = self.get_expression()
|
|
46
|
+
if current_expr is None:
|
|
47
|
+
self.set_expression(exp.Delete())
|
|
48
|
+
current_expr = self.get_expression()
|
|
49
|
+
|
|
50
|
+
if not isinstance(current_expr, exp.Delete):
|
|
51
|
+
msg = f"Base expression for Delete is {type(current_expr).__name__}, expected Delete."
|
|
52
|
+
raise SQLBuilderError(msg)
|
|
53
|
+
|
|
54
|
+
assert current_expr is not None
|
|
55
|
+
current_expr.set("this", exp.to_table(table))
|
|
56
|
+
return self
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# ---------------------------------------------------------------------------
|
|
60
|
+
# INSERT helpers
|
|
61
|
+
# ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@trait
|
|
65
|
+
class InsertIntoClauseMixin:
|
|
66
|
+
__slots__ = ()
|
|
67
|
+
|
|
68
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
69
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
70
|
+
|
|
71
|
+
def into(self, table: str) -> Self:
|
|
72
|
+
current_expr = self.get_expression()
|
|
73
|
+
if current_expr is None:
|
|
74
|
+
self.set_expression(exp.Insert())
|
|
75
|
+
current_expr = self.get_expression()
|
|
76
|
+
|
|
77
|
+
if not isinstance(current_expr, exp.Insert):
|
|
78
|
+
msg = "Cannot set target table on a non-INSERT expression."
|
|
79
|
+
raise SQLBuilderError(msg)
|
|
80
|
+
|
|
81
|
+
assert current_expr is not None
|
|
82
|
+
current_expr.set("this", exp.to_table(table))
|
|
83
|
+
return self
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@trait
|
|
87
|
+
class InsertValuesMixin:
|
|
88
|
+
__slots__ = ()
|
|
89
|
+
|
|
90
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
91
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
92
|
+
|
|
93
|
+
_columns: list[str]
|
|
94
|
+
|
|
95
|
+
def columns(self, *columns: str | exp.Expression) -> Self:
|
|
96
|
+
current_expr = self.get_expression()
|
|
97
|
+
if current_expr is None:
|
|
98
|
+
self.set_expression(exp.Insert())
|
|
99
|
+
current_expr = self.get_expression()
|
|
100
|
+
|
|
101
|
+
if not isinstance(current_expr, exp.Insert):
|
|
102
|
+
msg = "Cannot set columns on a non-INSERT expression."
|
|
103
|
+
raise SQLBuilderError(msg)
|
|
104
|
+
|
|
105
|
+
assert current_expr is not None
|
|
106
|
+
current_this = current_expr.args.get("this")
|
|
107
|
+
if current_this is None:
|
|
108
|
+
msg = "Table must be set using .into() before setting columns."
|
|
109
|
+
raise SQLBuilderError(msg)
|
|
110
|
+
|
|
111
|
+
if columns:
|
|
112
|
+
identifiers = [exp.to_identifier(col) if isinstance(col, str) else col for col in columns]
|
|
113
|
+
table_name = current_this.this
|
|
114
|
+
current_expr.set("this", exp.Schema(this=table_name, expressions=identifiers))
|
|
115
|
+
elif isinstance(current_this, exp.Schema):
|
|
116
|
+
table_name = current_this.this
|
|
117
|
+
current_expr.set("this", exp.Table(this=table_name))
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
cols = self._columns
|
|
121
|
+
if not columns:
|
|
122
|
+
cols.clear()
|
|
123
|
+
else:
|
|
124
|
+
cols[:] = [col if isinstance(col, str) else str(col) for col in columns]
|
|
125
|
+
except AttributeError:
|
|
126
|
+
pass
|
|
127
|
+
return self
|
|
128
|
+
|
|
129
|
+
def values(self, *values: Any, **kwargs: Any) -> Self:
|
|
130
|
+
current_expr = self.get_expression()
|
|
131
|
+
if current_expr is None:
|
|
132
|
+
self.set_expression(exp.Insert())
|
|
133
|
+
current_expr = self.get_expression()
|
|
134
|
+
|
|
135
|
+
if not isinstance(current_expr, exp.Insert):
|
|
136
|
+
msg = "Cannot add values to a non-INSERT expression."
|
|
137
|
+
raise SQLBuilderError(msg)
|
|
138
|
+
|
|
139
|
+
assert current_expr is not None
|
|
140
|
+
if current_expr.args.get("this") is None:
|
|
141
|
+
msg = "The target table must be set using .into() before adding values."
|
|
142
|
+
raise SQLBuilderError(msg)
|
|
143
|
+
|
|
144
|
+
builder = cast("SQLBuilderProtocol", self)
|
|
145
|
+
|
|
146
|
+
positional_values = list(values)
|
|
147
|
+
if len(positional_values) == SINGLE_VALUE_COUNT and is_dict(positional_values[0]) and not kwargs:
|
|
148
|
+
kwargs = positional_values[0]
|
|
149
|
+
positional_values = []
|
|
150
|
+
|
|
151
|
+
if kwargs and positional_values:
|
|
152
|
+
msg = "Cannot mix positional values with keyword values."
|
|
153
|
+
raise SQLBuilderError(msg)
|
|
154
|
+
|
|
155
|
+
row_expressions: list[exp.Expression] = []
|
|
156
|
+
column_defs: list[str] = list(self._columns or [])
|
|
157
|
+
|
|
158
|
+
if kwargs:
|
|
159
|
+
if not column_defs:
|
|
160
|
+
self.columns(*kwargs.keys())
|
|
161
|
+
column_defs = list(self._columns or [])
|
|
162
|
+
for col, val in kwargs.items():
|
|
163
|
+
if isinstance(val, exp.Expression):
|
|
164
|
+
row_expressions.append(val)
|
|
165
|
+
continue
|
|
166
|
+
if has_expression_and_sql(val):
|
|
167
|
+
row_expressions.append(extract_sql_object_expression(val, builder=self))
|
|
168
|
+
continue
|
|
169
|
+
column_name = str(col).split(".")[-1]
|
|
170
|
+
placeholder, _ = builder._create_placeholder(val, column_name) # pyright: ignore[reportPrivateUsage]
|
|
171
|
+
row_expressions.append(placeholder)
|
|
172
|
+
else:
|
|
173
|
+
if column_defs and len(positional_values) != len(column_defs):
|
|
174
|
+
msg = (
|
|
175
|
+
f"Number of values ({len(positional_values)}) does not match the number of specified columns "
|
|
176
|
+
f"({len(column_defs)})."
|
|
177
|
+
)
|
|
178
|
+
raise SQLBuilderError(msg)
|
|
179
|
+
|
|
180
|
+
for index, raw_value in enumerate(positional_values):
|
|
181
|
+
if isinstance(raw_value, exp.Expression):
|
|
182
|
+
row_expressions.append(raw_value)
|
|
183
|
+
elif has_expression_and_sql(raw_value):
|
|
184
|
+
row_expressions.append(extract_sql_object_expression(raw_value, builder=self))
|
|
185
|
+
else:
|
|
186
|
+
if column_defs and index < len(column_defs):
|
|
187
|
+
column_token = column_defs[index]
|
|
188
|
+
column_name = column_token.rsplit(".", maxsplit=1)[-1]
|
|
189
|
+
else:
|
|
190
|
+
column_name = f"value_{index + 1}"
|
|
191
|
+
placeholder, _ = builder._create_placeholder(raw_value, column_name) # pyright: ignore[reportPrivateUsage]
|
|
192
|
+
row_expressions.append(placeholder)
|
|
193
|
+
|
|
194
|
+
values_node = current_expr.args.get("expression")
|
|
195
|
+
tuple_expression = exp.Tuple(expressions=row_expressions)
|
|
196
|
+
if isinstance(values_node, exp.Values):
|
|
197
|
+
values_node.expressions.append(tuple_expression)
|
|
198
|
+
else:
|
|
199
|
+
current_expr.set("expression", exp.Values(expressions=[tuple_expression]))
|
|
200
|
+
return self
|
|
201
|
+
|
|
202
|
+
def add_values(self, values: Sequence[Any]) -> Self:
|
|
203
|
+
return self.values(*values)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
@trait
|
|
207
|
+
class InsertFromSelectMixin:
|
|
208
|
+
__slots__ = ()
|
|
209
|
+
|
|
210
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
211
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
212
|
+
|
|
213
|
+
def from_select(self, select_builder: SQLBuilderProtocol) -> Self:
|
|
214
|
+
current_expr = self.get_expression()
|
|
215
|
+
if current_expr is None:
|
|
216
|
+
self.set_expression(exp.Insert())
|
|
217
|
+
current_expr = self.get_expression()
|
|
218
|
+
|
|
219
|
+
if not isinstance(current_expr, exp.Insert):
|
|
220
|
+
msg = "Cannot set INSERT source on a non-INSERT expression."
|
|
221
|
+
raise SQLBuilderError(msg)
|
|
222
|
+
|
|
223
|
+
assert current_expr is not None
|
|
224
|
+
if current_expr.args.get("this") is None:
|
|
225
|
+
msg = "The target table must be set using .into() before adding values."
|
|
226
|
+
raise SQLBuilderError(msg)
|
|
227
|
+
subquery_parameters = select_builder.parameters
|
|
228
|
+
if subquery_parameters:
|
|
229
|
+
builder_with_params = cast("SQLBuilderProtocol", self)
|
|
230
|
+
for param_name, param_value in subquery_parameters.items():
|
|
231
|
+
builder_with_params.add_parameter(param_value, name=param_name)
|
|
232
|
+
|
|
233
|
+
select_expr = select_builder.get_expression()
|
|
234
|
+
if select_expr and isinstance(select_expr, exp.Select):
|
|
235
|
+
current_expr.set("expression", select_expr.copy())
|
|
236
|
+
else:
|
|
237
|
+
msg = "SelectBuilder must have a valid SELECT expression."
|
|
238
|
+
raise SQLBuilderError(msg)
|
|
239
|
+
return self
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
# ---------------------------------------------------------------------------
|
|
243
|
+
# UPDATE helpers
|
|
244
|
+
# ---------------------------------------------------------------------------
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
@trait
|
|
248
|
+
class UpdateTableClauseMixin:
|
|
249
|
+
__slots__ = ()
|
|
250
|
+
|
|
251
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
252
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
253
|
+
|
|
254
|
+
def table(self, table_name: str, alias: str | None = None) -> Self:
|
|
255
|
+
current_expr = self.get_expression()
|
|
256
|
+
if current_expr is None or not isinstance(current_expr, exp.Update):
|
|
257
|
+
self.set_expression(exp.Update(this=None, expressions=[], joins=[]))
|
|
258
|
+
current_expr = self.get_expression()
|
|
259
|
+
|
|
260
|
+
assert current_expr is not None
|
|
261
|
+
|
|
262
|
+
table_expr: exp.Expression = exp.to_table(table_name, alias=alias)
|
|
263
|
+
current_expr.set("this", table_expr)
|
|
264
|
+
return self
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@trait
|
|
268
|
+
class UpdateSetClauseMixin:
|
|
269
|
+
__slots__ = ()
|
|
270
|
+
|
|
271
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
272
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
273
|
+
|
|
274
|
+
def _process_update_value(self, val: Any, col: Any) -> exp.Expression:
|
|
275
|
+
if isinstance(val, exp.Expression):
|
|
276
|
+
return val
|
|
277
|
+
if has_parameter_builder(val):
|
|
278
|
+
subquery = val.build()
|
|
279
|
+
sql_text = subquery.sql if isinstance(subquery, BuiltQuery) else str(subquery)
|
|
280
|
+
query_builder = cast("QueryBuilder", self)
|
|
281
|
+
value_expr = exp.paren(exp.maybe_parse(sql_text, dialect=query_builder.dialect))
|
|
282
|
+
for p_name, p_value in val.parameters.items():
|
|
283
|
+
query_builder.add_parameter(p_value, name=p_name)
|
|
284
|
+
return value_expr
|
|
285
|
+
if has_expression_and_sql(val):
|
|
286
|
+
return extract_sql_object_expression(val, builder=self)
|
|
287
|
+
sql_builder = cast("SQLBuilderProtocol", self)
|
|
288
|
+
column_name = col if isinstance(col, str) else str(col)
|
|
289
|
+
if "." in column_name:
|
|
290
|
+
column_name = column_name.split(".")[-1]
|
|
291
|
+
placeholder, _ = sql_builder.create_placeholder(val, column_name)
|
|
292
|
+
return placeholder
|
|
293
|
+
|
|
294
|
+
def set(self, *args: Any, **kwargs: Any) -> Self:
|
|
295
|
+
if not args and not kwargs:
|
|
296
|
+
return self
|
|
297
|
+
current_expr = self.get_expression()
|
|
298
|
+
if current_expr is None:
|
|
299
|
+
self.set_expression(exp.Update())
|
|
300
|
+
current_expr = self.get_expression()
|
|
301
|
+
|
|
302
|
+
if not isinstance(current_expr, exp.Update):
|
|
303
|
+
msg = "Cannot add SET clause to non-UPDATE expression."
|
|
304
|
+
raise SQLBuilderError(msg)
|
|
305
|
+
|
|
306
|
+
assert current_expr is not None
|
|
307
|
+
|
|
308
|
+
assignments: list[exp.Expression] = []
|
|
309
|
+
if len(args) == ARG_PAIR_COUNT and not kwargs:
|
|
310
|
+
col, val = args
|
|
311
|
+
col_expr = col if isinstance(col, exp.Column) else exp.column(col)
|
|
312
|
+
assignments.append(exp.EQ(this=col_expr, expression=self._process_update_value(val, col)))
|
|
313
|
+
elif (len(args) == SINGLE_VALUE_COUNT and isinstance(args[0], Mapping)) or kwargs:
|
|
314
|
+
all_values = dict(args[0] if args else {}, **kwargs)
|
|
315
|
+
for col, val in all_values.items():
|
|
316
|
+
assignments.append(exp.EQ(this=exp.column(col), expression=self._process_update_value(val, col)))
|
|
317
|
+
else:
|
|
318
|
+
msg = "Invalid arguments for set(): use (column, value), mapping, or kwargs."
|
|
319
|
+
raise SQLBuilderError(msg)
|
|
320
|
+
|
|
321
|
+
existing = current_expr.args.get("expressions", [])
|
|
322
|
+
current_expr.set("expressions", existing + assignments)
|
|
323
|
+
return self
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
@trait
|
|
327
|
+
class UpdateFromClauseMixin:
|
|
328
|
+
__slots__ = ()
|
|
329
|
+
|
|
330
|
+
def get_expression(self) -> exp.Expression | None: ...
|
|
331
|
+
def set_expression(self, expression: exp.Expression) -> None: ...
|
|
332
|
+
|
|
333
|
+
def from_(self, table: str | exp.Expression | Any, alias: str | None = None) -> Self:
|
|
334
|
+
current_expr = self.get_expression()
|
|
335
|
+
if current_expr is None or not isinstance(current_expr, exp.Update):
|
|
336
|
+
msg = "Cannot add FROM clause to non-UPDATE expression. Set the main table first."
|
|
337
|
+
raise SQLBuilderError(msg)
|
|
338
|
+
|
|
339
|
+
assert current_expr is not None
|
|
340
|
+
table_expr: exp.Expression
|
|
341
|
+
if isinstance(table, str):
|
|
342
|
+
table_expr = exp.to_table(table, alias=alias)
|
|
343
|
+
elif isinstance(table, SQLBuilderProtocol):
|
|
344
|
+
subquery_params = table.parameters
|
|
345
|
+
if subquery_params:
|
|
346
|
+
builder_with_params = cast("SQLBuilderProtocol", self)
|
|
347
|
+
for param_name, param_value in subquery_params.items():
|
|
348
|
+
builder_with_params.add_parameter(param_value, name=param_name)
|
|
349
|
+
raw_expression = table.get_expression()
|
|
350
|
+
subquery_source = raw_expression if isinstance(raw_expression, exp.Expression) else exp.select()
|
|
351
|
+
subquery_exp = exp.paren(subquery_source)
|
|
352
|
+
table_expr = exp.alias_(subquery_exp, alias) if alias else subquery_exp
|
|
353
|
+
elif isinstance(table, exp.Expression):
|
|
354
|
+
table_expr = exp.alias_(table, alias) if alias else table
|
|
355
|
+
else:
|
|
356
|
+
msg = f"Unsupported table type for FROM clause: {type(table)}"
|
|
357
|
+
raise SQLBuilderError(msg)
|
|
358
|
+
|
|
359
|
+
from_clause = current_expr.args.get("from")
|
|
360
|
+
if from_clause is None:
|
|
361
|
+
from_clause = exp.From(expressions=[])
|
|
362
|
+
current_expr.set("from", from_clause)
|
|
363
|
+
|
|
364
|
+
from_clause.append("expressions", table_expr)
|
|
365
|
+
return self
|
|
Binary file
|