sqlspec 0.47.0__cp314-cp314-win_amd64.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.
- f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
- sqlspec/__init__.py +167 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_typing.py +714 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +13 -0
- sqlspec/adapters/adbc/_typing.py +106 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1280 -0
- sqlspec/adapters/adbc/config.py +378 -0
- sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/core.py +922 -0
- sqlspec/adapters/adbc/data_dictionary.py +339 -0
- sqlspec/adapters/adbc/driver.py +534 -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 +534 -0
- sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/type_converter.py +142 -0
- sqlspec/adapters/aiomysql/__init__.py +21 -0
- sqlspec/adapters/aiomysql/_typing.py +137 -0
- sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
- sqlspec/adapters/aiomysql/adk/store.py +678 -0
- sqlspec/adapters/aiomysql/config.py +305 -0
- sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiomysql/core.py +536 -0
- sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
- sqlspec/adapters/aiomysql/driver.py +386 -0
- sqlspec/adapters/aiomysql/events/__init__.py +5 -0
- sqlspec/adapters/aiomysql/events/store.py +104 -0
- sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
- sqlspec/adapters/aiomysql/litestar/store.py +314 -0
- sqlspec/adapters/aiosqlite/__init__.py +26 -0
- sqlspec/adapters/aiosqlite/_typing.py +109 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +829 -0
- sqlspec/adapters/aiosqlite/config.py +315 -0
- sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
- sqlspec/adapters/aiosqlite/driver.py +311 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/pool.py +734 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +113 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +644 -0
- sqlspec/adapters/asyncmy/config.py +307 -0
- sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncmy/core.py +538 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
- sqlspec/adapters/asyncmy/driver.py +391 -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 +26 -0
- sqlspec/adapters/asyncpg/_typing.py +103 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +483 -0
- sqlspec/adapters/asyncpg/config.py +575 -0
- sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncpg/core.py +480 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/_hub.py +181 -0
- sqlspec/adapters/asyncpg/events/backend.py +210 -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 +15 -0
- sqlspec/adapters/bigquery/_typing.py +108 -0
- sqlspec/adapters/bigquery/config.py +362 -0
- sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/core.py +768 -0
- sqlspec/adapters/bigquery/data_dictionary.py +120 -0
- sqlspec/adapters/bigquery/driver.py +542 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
- sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +142 -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 +39 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
- sqlspec/adapters/cockroach_psycopg/config.py +511 -0
- sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +273 -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 +327 -0
- sqlspec/adapters/duckdb/__init__.py +29 -0
- sqlspec/adapters/duckdb/_typing.py +104 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +935 -0
- sqlspec/adapters/duckdb/config.py +386 -0
- sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/core.py +332 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +426 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/pool.py +350 -0
- sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mysqlconnector/__init__.py +39 -0
- sqlspec/adapters/mysqlconnector/_typing.py +186 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
- sqlspec/adapters/mysqlconnector/config.py +421 -0
- sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/mysqlconnector/core.py +472 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
- sqlspec/adapters/mysqlconnector/driver.py +516 -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 +39 -0
- sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_json_handlers.py +196 -0
- sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_param_types.py +46 -0
- sqlspec/adapters/oracledb/_typing.py +258 -0
- sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
- sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
- sqlspec/adapters/oracledb/adk/__init__.py +21 -0
- sqlspec/adapters/oracledb/adk/store.py +2453 -0
- sqlspec/adapters/oracledb/config.py +575 -0
- sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/core.py +820 -0
- sqlspec/adapters/oracledb/data_dictionary.py +404 -0
- sqlspec/adapters/oracledb/driver.py +1277 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/_hub.py +345 -0
- sqlspec/adapters/oracledb/events/backend.py +300 -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 +539 -0
- sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +18 -0
- sqlspec/adapters/psqlpy/_typing.py +121 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +591 -0
- sqlspec/adapters/psqlpy/config.py +376 -0
- sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/core.py +694 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
- sqlspec/adapters/psqlpy/driver.py +411 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/_hub.py +204 -0
- sqlspec/adapters/psqlpy/events/backend.py +210 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +38 -0
- sqlspec/adapters/psycopg/_typing.py +218 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1106 -0
- sqlspec/adapters/psycopg/config.py +695 -0
- sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/core.py +520 -0
- sqlspec/adapters/psycopg/data_dictionary.py +278 -0
- sqlspec/adapters/psycopg/driver.py +1033 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/_hub.py +388 -0
- sqlspec/adapters/psycopg/events/backend.py +398 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +554 -0
- sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +92 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +657 -0
- sqlspec/adapters/pymysql/config.py +176 -0
- sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/core.py +469 -0
- sqlspec/adapters/pymysql/data_dictionary.py +120 -0
- sqlspec/adapters/pymysql/driver.py +271 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/pool.py +184 -0
- sqlspec/adapters/spanner/__init__.py +33 -0
- sqlspec/adapters/spanner/_typing.py +102 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +758 -0
- sqlspec/adapters/spanner/config.py +355 -0
- sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/core.py +263 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/driver.py +407 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/type_converter.py +342 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +123 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +992 -0
- sqlspec/adapters/sqlite/config.py +240 -0
- sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/core.py +357 -0
- sqlspec/adapters/sqlite/data_dictionary.py +198 -0
- sqlspec/adapters/sqlite/driver.py +527 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/pool.py +237 -0
- sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +832 -0
- sqlspec/builder/__init__.py +181 -0
- sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_base.py +1071 -0
- sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_ddl.py +1691 -0
- sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_dml.py +386 -0
- sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_factory.py +1884 -0
- sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_insert.py +405 -0
- sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_join.py +489 -0
- sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_merge.py +823 -0
- sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_parsing_utils.py +295 -0
- sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_select.py +1666 -0
- sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_temporal.py +167 -0
- sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_vector_distance.py +330 -0
- sqlspec/cli.py +1095 -0
- sqlspec/config.py +2383 -0
- sqlspec/core/__init__.py +372 -0
- sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/_pagination.py +42 -0
- sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_pool.py +76 -0
- sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
- sqlspec/core/cache.py +1085 -0
- sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
- sqlspec/core/compiler.py +1090 -0
- sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/core/config_runtime.py +174 -0
- sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
- sqlspec/core/filters.py +969 -0
- sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
- sqlspec/core/hashing.py +266 -0
- sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +72 -0
- sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_alignment.py +283 -0
- sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_converter.py +554 -0
- sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_processor.py +1182 -0
- sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_transformers.py +324 -0
- sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_types.py +536 -0
- sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_validator.py +171 -0
- sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/core/pipeline.py +333 -0
- sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/query_modifiers.py +508 -0
- sqlspec/core/result/__init__.py +25 -0
- sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_base.py +1232 -0
- sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/splitter.py +1021 -0
- sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/sqlcommenter.py +249 -0
- sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
- sqlspec/core/statement.py +1865 -0
- sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/type_converter.py +340 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_loader.py +138 -0
- sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +81 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
- sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +53 -0
- sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +197 -0
- sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +69 -0
- sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +59 -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/dialects/__init__.py +22 -0
- sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/_compat.py +14 -0
- sqlspec/dialects/postgres/__init__.py +9 -0
- sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_generators.py +57 -0
- sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_operators.py +81 -0
- sqlspec/dialects/postgres/_paradedb.py +50 -0
- sqlspec/dialects/postgres/_pgvector.py +36 -0
- sqlspec/dialects/spanner/__init__.py +6 -0
- sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/spanner/_generators.py +206 -0
- sqlspec/dialects/spanner/_spangres.py +77 -0
- sqlspec/dialects/spanner/_spanner.py +179 -0
- sqlspec/driver/__init__.py +49 -0
- sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_async.py +1830 -0
- sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_common.py +2292 -0
- sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_exception_handler.py +108 -0
- sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_query_cache.py +96 -0
- sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sql_helpers.py +139 -0
- sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_storage_helpers.py +153 -0
- sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sync.py +1817 -0
- sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
- sqlspec/exceptions.py +480 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +84 -0
- sqlspec/extensions/adk/_config_utils.py +199 -0
- sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/_types.py +41 -0
- sqlspec/extensions/adk/artifact/__init__.py +57 -0
- sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/artifact/_types.py +32 -0
- sqlspec/extensions/adk/artifact/service.py +508 -0
- sqlspec/extensions/adk/artifact/store.py +361 -0
- sqlspec/extensions/adk/converters.py +212 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +225 -0
- sqlspec/extensions/adk/memory/service.py +316 -0
- sqlspec/extensions/adk/memory/store.py +525 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +279 -0
- sqlspec/extensions/adk/store.py +590 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +462 -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 +22 -0
- sqlspec/extensions/fastapi/extension.py +391 -0
- sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/fastapi/providers.py +712 -0
- sqlspec/extensions/flask/__init__.py +38 -0
- sqlspec/extensions/flask/_state.py +87 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +539 -0
- sqlspec/extensions/litestar/__init__.py +31 -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 +1066 -0
- sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/litestar/providers.py +784 -0
- sqlspec/extensions/litestar/store.py +298 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/sanic/__init__.py +19 -0
- sqlspec/extensions/sanic/_state.py +43 -0
- sqlspec/extensions/sanic/_utils.py +127 -0
- sqlspec/extensions/sanic/extension.py +647 -0
- sqlspec/extensions/starlette/__init__.py +22 -0
- sqlspec/extensions/starlette/_state.py +42 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +374 -0
- sqlspec/extensions/starlette/middleware.py +281 -0
- sqlspec/loader.cp314-win_amd64.pyd +0 -0
- sqlspec/loader.py +727 -0
- sqlspec/migrations/__init__.py +39 -0
- sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/base.py +862 -0
- sqlspec/migrations/commands.py +2151 -0
- sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/runner.py +1195 -0
- sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/squash.py +490 -0
- sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/tracker.py +792 -0
- sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/validation.py +359 -0
- sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +57 -0
- sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_config.py +364 -0
- sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_dispatcher.py +200 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_observer.py +361 -0
- sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_runtime.py +461 -0
- sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +955 -0
- sqlspec/py.typed +0 -0
- sqlspec/service.py +433 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_arrow_payload.py +68 -0
- sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/_paths.py +58 -0
- sqlspec/storage/_utils.py +46 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/backends/base.py +374 -0
- sqlspec/storage/backends/fsspec.py +574 -0
- sqlspec/storage/backends/local.py +468 -0
- sqlspec/storage/backends/obstore.py +956 -0
- sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/errors.py +102 -0
- sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/pipeline.py +628 -0
- sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/registry.py +329 -0
- sqlspec/typing.py +405 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +384 -0
- sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/config_tools.py +314 -0
- sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/deprecation.py +157 -0
- sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/dispatch.py +101 -0
- sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/fixtures.py +260 -0
- sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/logging.py +251 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/portal.py +377 -0
- sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/schema.py +1040 -0
- sqlspec/utils/serializers/__init__.py +30 -0
- sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_json.py +415 -0
- sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_numpy.py +65 -0
- sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_schema.py +285 -0
- sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/sync_tools.py +316 -0
- sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/text.py +109 -0
- sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_converters.py +216 -0
- sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_guards.py +1508 -0
- sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/uuids.py +241 -0
- sqlspec-0.47.0.dist-info/METADATA +202 -0
- sqlspec-0.47.0.dist-info/RECORD +621 -0
- sqlspec-0.47.0.dist-info/WHEEL +4 -0
- sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
- sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
|
Binary file
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""Temporal query expressions.
|
|
2
|
+
|
|
3
|
+
Overrides sqlglot's built-in version_sql generators to produce dialect-specific
|
|
4
|
+
time-travel query syntax. Uses sqlglot's exp.Version and Table.version slot.
|
|
5
|
+
|
|
6
|
+
Supported syntax by dialect:
|
|
7
|
+
- BigQuery: table FOR SYSTEM_TIME AS OF timestamp (built-in)
|
|
8
|
+
- Oracle: table AS OF TIMESTAMP timestamp / AS OF SCN scn
|
|
9
|
+
- Snowflake: table AT (TIMESTAMP => timestamp) / BEFORE (...)
|
|
10
|
+
- DuckDB: table AT (TIMESTAMP => timestamp)
|
|
11
|
+
- CockroachDB (Postgres): table AS OF SYSTEM TIME timestamp
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from sqlglot import exp
|
|
15
|
+
from sqlglot.dialects.bigquery import BigQuery
|
|
16
|
+
from sqlglot.dialects.duckdb import DuckDB
|
|
17
|
+
from sqlglot.dialects.oracle import Oracle
|
|
18
|
+
from sqlglot.dialects.postgres import Postgres
|
|
19
|
+
from sqlglot.dialects.snowflake import Snowflake
|
|
20
|
+
from sqlglot.generator import (
|
|
21
|
+
_DISPATCH_CACHE, # pyright: ignore[reportPrivateUsage]
|
|
22
|
+
Generator,
|
|
23
|
+
)
|
|
24
|
+
from sqlglot.generators.bigquery import BigQueryGenerator
|
|
25
|
+
from sqlglot.generators.duckdb import DuckDBGenerator
|
|
26
|
+
from sqlglot.generators.oracle import OracleGenerator
|
|
27
|
+
from sqlglot.generators.postgres import PostgresGenerator
|
|
28
|
+
from sqlglot.generators.snowflake import SnowflakeGenerator
|
|
29
|
+
|
|
30
|
+
__all__ = ("create_temporal_table", "register_version_generators")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _oracle_version_sql(self: OracleGenerator, expression: exp.Version) -> str:
|
|
34
|
+
"""Oracle: AS OF TIMESTAMP timestamp or AS OF SCN scn."""
|
|
35
|
+
expr = self.sql(expression, "expression")
|
|
36
|
+
this = expression.name or "TIMESTAMP"
|
|
37
|
+
return f"AS OF {this} {expr}"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _bigquery_version_sql(self: BigQueryGenerator, expression: exp.Version) -> str:
|
|
41
|
+
"""BigQuery: FOR SYSTEM_TIME AS OF timestamp."""
|
|
42
|
+
expr = self.sql(expression, "expression")
|
|
43
|
+
return f"FOR SYSTEM_TIME AS OF {expr}"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _snowflake_version_sql(self: SnowflakeGenerator, expression: exp.Version) -> str:
|
|
47
|
+
"""Snowflake: AT (TIMESTAMP => timestamp) or BEFORE (TIMESTAMP => ...).
|
|
48
|
+
|
|
49
|
+
AS OF is mapped to AT, and BEFORE is supported for point-before queries.
|
|
50
|
+
"""
|
|
51
|
+
kind = expression.text("kind")
|
|
52
|
+
expr = self.sql(expression, "expression")
|
|
53
|
+
this = expression.name or "TIMESTAMP"
|
|
54
|
+
if kind and "BEFORE" in kind.upper():
|
|
55
|
+
return f"BEFORE ({this} => {expr})"
|
|
56
|
+
return f"AT ({this} => {expr})"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _duckdb_version_sql(self: DuckDBGenerator, expression: exp.Version) -> str:
|
|
60
|
+
"""DuckDB: AT (TIMESTAMP => timestamp)."""
|
|
61
|
+
expr = self.sql(expression, "expression")
|
|
62
|
+
return f"AT (TIMESTAMP => {expr})"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _cockroachdb_version_sql(self: PostgresGenerator, expression: exp.Version) -> str:
|
|
66
|
+
"""CockroachDB (via Postgres dialect): AS OF SYSTEM TIME timestamp."""
|
|
67
|
+
expr = self.sql(expression, "expression")
|
|
68
|
+
return f"AS OF SYSTEM TIME {expr}"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _default_version_sql(self: Generator, expression: exp.Version) -> str:
|
|
72
|
+
"""Default: AS OF SYSTEM TIME timestamp (CockroachDB style).
|
|
73
|
+
|
|
74
|
+
When no dialect is specified, we default to CockroachDB/Postgres style
|
|
75
|
+
which is commonly expected for time-travel queries.
|
|
76
|
+
"""
|
|
77
|
+
expr = self.sql(expression, "expression")
|
|
78
|
+
return f"AS OF SYSTEM TIME {expr}"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def create_temporal_table(
|
|
82
|
+
table: "str | exp.Table | exp.Expr", as_of: "exp.Expr | str", kind: "str | None" = None
|
|
83
|
+
) -> exp.Table:
|
|
84
|
+
"""Create a table expression with temporal (time-travel) version clause.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
table: Table name or expression.
|
|
88
|
+
as_of: Timestamp or SCN expression for the point-in-time.
|
|
89
|
+
kind: Optional version kind (e.g., "TIMESTAMP", "SCN", "SYSTEM TIME").
|
|
90
|
+
Defaults to dialect-appropriate value.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Table expression with version clause that generates dialect-specific SQL.
|
|
94
|
+
|
|
95
|
+
Notes:
|
|
96
|
+
Inputs are normalized before building the ``exp.Version`` clause so both string table names and literal timestamps
|
|
97
|
+
work consistently.
|
|
98
|
+
|
|
99
|
+
Example:
|
|
100
|
+
>>> from sqlspec.builder import create_temporal_table
|
|
101
|
+
>>> from sqlglot import exp
|
|
102
|
+
>>> t = create_temporal_table(
|
|
103
|
+
... "orders", exp.Literal.string("2024-01-01")
|
|
104
|
+
... )
|
|
105
|
+
>>> t.sql(dialect="oracle")
|
|
106
|
+
"orders AS OF TIMESTAMP '2024-01-01'"
|
|
107
|
+
>>> t.sql(dialect="bigquery")
|
|
108
|
+
"orders FOR SYSTEM_TIME AS OF '2024-01-01'"
|
|
109
|
+
"""
|
|
110
|
+
if isinstance(table, str):
|
|
111
|
+
table_expr = exp.to_table(table)
|
|
112
|
+
elif isinstance(table, exp.Table):
|
|
113
|
+
table_expr = table.copy()
|
|
114
|
+
else:
|
|
115
|
+
table_expr = exp.to_table(str(table))
|
|
116
|
+
|
|
117
|
+
as_of_expr = exp.Literal.string(as_of) if isinstance(as_of, str) else as_of
|
|
118
|
+
|
|
119
|
+
version = exp.Version(this=kind or "TIMESTAMP", kind="AS OF", expression=as_of_expr)
|
|
120
|
+
|
|
121
|
+
table_expr.set("version", version)
|
|
122
|
+
return table_expr
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
_VERSION_GENERATORS_REGISTERED = False
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def register_version_generators() -> None:
|
|
129
|
+
"""Register dialect-specific version_sql generators.
|
|
130
|
+
|
|
131
|
+
This function is idempotent - calling it multiple times has no effect
|
|
132
|
+
after the first call. It is called automatically when the builder
|
|
133
|
+
module is imported.
|
|
134
|
+
|
|
135
|
+
Registers custom SQL generators for temporal (time-travel) queries:
|
|
136
|
+
- Default (no dialect): AS OF SYSTEM TIME (CockroachDB style)
|
|
137
|
+
- BigQuery: FOR SYSTEM_TIME AS OF
|
|
138
|
+
- Oracle: AS OF TIMESTAMP / AS OF SCN
|
|
139
|
+
- Snowflake: AT (TIMESTAMP => ...) / BEFORE (...)
|
|
140
|
+
- DuckDB: AT (TIMESTAMP => ...)
|
|
141
|
+
- Postgres/CockroachDB: AS OF SYSTEM TIME
|
|
142
|
+
"""
|
|
143
|
+
global _VERSION_GENERATORS_REGISTERED
|
|
144
|
+
if _VERSION_GENERATORS_REGISTERED:
|
|
145
|
+
return
|
|
146
|
+
|
|
147
|
+
Generator.TRANSFORMS[exp.Version] = _default_version_sql
|
|
148
|
+
|
|
149
|
+
BigQuery.Generator.TRANSFORMS[exp.Version] = _bigquery_version_sql
|
|
150
|
+
Oracle.Generator.TRANSFORMS[exp.Version] = _oracle_version_sql
|
|
151
|
+
Snowflake.Generator.TRANSFORMS[exp.Version] = _snowflake_version_sql
|
|
152
|
+
DuckDB.Generator.TRANSFORMS[exp.Version] = _duckdb_version_sql
|
|
153
|
+
Postgres.Generator.TRANSFORMS[exp.Version] = _cockroachdb_version_sql
|
|
154
|
+
|
|
155
|
+
# Invalidate sqlglot's per-class dispatch cache so new TRANSFORMS entries
|
|
156
|
+
# are picked up by the next Generator instantiation.
|
|
157
|
+
for gen_cls in (
|
|
158
|
+
Generator,
|
|
159
|
+
BigQuery.Generator,
|
|
160
|
+
Oracle.Generator,
|
|
161
|
+
Snowflake.Generator,
|
|
162
|
+
DuckDB.Generator,
|
|
163
|
+
Postgres.Generator,
|
|
164
|
+
):
|
|
165
|
+
_DISPATCH_CACHE.pop(gen_cls, None)
|
|
166
|
+
|
|
167
|
+
_VERSION_GENERATORS_REGISTERED = True
|
|
Binary file
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"""UPDATE statement builder.
|
|
2
|
+
|
|
3
|
+
Provides a fluent interface for building SQL UPDATE queries with
|
|
4
|
+
parameter binding and validation.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
8
|
+
|
|
9
|
+
from sqlglot import exp
|
|
10
|
+
from typing_extensions import Self
|
|
11
|
+
|
|
12
|
+
from sqlspec.builder._base import BuiltQuery, QueryBuilder
|
|
13
|
+
from sqlspec.builder._dml import UpdateFromClauseMixin, UpdateSetClauseMixin, UpdateTableClauseMixin
|
|
14
|
+
from sqlspec.builder._explain import ExplainMixin
|
|
15
|
+
from sqlspec.builder._join import build_join_clause
|
|
16
|
+
from sqlspec.builder._select import ReturningClauseMixin, WhereClauseMixin
|
|
17
|
+
from sqlspec.core import SQLResult
|
|
18
|
+
from sqlspec.exceptions import SQLBuilderError
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from sqlglot.dialects.dialect import DialectType
|
|
22
|
+
|
|
23
|
+
from sqlspec.builder._select import Select
|
|
24
|
+
from sqlspec.protocols import SQLBuilderProtocol
|
|
25
|
+
|
|
26
|
+
__all__ = ("Update",)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Update(
|
|
30
|
+
QueryBuilder,
|
|
31
|
+
WhereClauseMixin,
|
|
32
|
+
ReturningClauseMixin,
|
|
33
|
+
UpdateSetClauseMixin,
|
|
34
|
+
UpdateFromClauseMixin,
|
|
35
|
+
UpdateTableClauseMixin,
|
|
36
|
+
ExplainMixin,
|
|
37
|
+
):
|
|
38
|
+
"""Builder for UPDATE statements.
|
|
39
|
+
|
|
40
|
+
Constructs SQL UPDATE statements with parameter binding and validation.
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
```python
|
|
44
|
+
update_query = (
|
|
45
|
+
Update()
|
|
46
|
+
.table("users")
|
|
47
|
+
.set_(name="John Doe")
|
|
48
|
+
.set_(email="john@example.com")
|
|
49
|
+
.where("id = 1")
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
update_query = (
|
|
53
|
+
Update("users").set_(name="John Doe").where("id = 1")
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
update_query = (
|
|
57
|
+
Update()
|
|
58
|
+
.table("users")
|
|
59
|
+
.set_(status="active")
|
|
60
|
+
.where_eq("id", 123)
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
update_query = (
|
|
64
|
+
Update()
|
|
65
|
+
.table("users", "u")
|
|
66
|
+
.set_(name="Updated Name")
|
|
67
|
+
.from_("profiles", "p")
|
|
68
|
+
.where("u.id = p.user_id AND p.is_verified = true")
|
|
69
|
+
)
|
|
70
|
+
```
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
__slots__ = ()
|
|
74
|
+
_expression: exp.Expr | None
|
|
75
|
+
|
|
76
|
+
def __init__(self, table: str | None = None, **kwargs: Any) -> None:
|
|
77
|
+
"""Initialize UPDATE with optional table.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
table: Target table name
|
|
81
|
+
**kwargs: Additional QueryBuilder arguments
|
|
82
|
+
"""
|
|
83
|
+
(dialect, schema, enable_optimization, optimize_joins, optimize_predicates, simplify_expressions) = (
|
|
84
|
+
self._parse_query_builder_kwargs(kwargs)
|
|
85
|
+
)
|
|
86
|
+
super().__init__(
|
|
87
|
+
dialect=dialect,
|
|
88
|
+
schema=schema,
|
|
89
|
+
enable_optimization=enable_optimization,
|
|
90
|
+
optimize_joins=optimize_joins,
|
|
91
|
+
optimize_predicates=optimize_predicates,
|
|
92
|
+
simplify_expressions=simplify_expressions,
|
|
93
|
+
)
|
|
94
|
+
self._initialize_expression()
|
|
95
|
+
|
|
96
|
+
if table:
|
|
97
|
+
self.table(table)
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def _expected_result_type(self) -> "type[SQLResult]":
|
|
101
|
+
"""Return the expected result type for this builder."""
|
|
102
|
+
return SQLResult
|
|
103
|
+
|
|
104
|
+
def _create_base_expression(self) -> exp.Update:
|
|
105
|
+
"""Create a base UPDATE expression.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
A new sqlglot Update expression with empty clauses.
|
|
109
|
+
"""
|
|
110
|
+
return exp.Update(this=None, expressions=[], joins=[])
|
|
111
|
+
|
|
112
|
+
def join(
|
|
113
|
+
self,
|
|
114
|
+
table: "str | exp.Expr | Select",
|
|
115
|
+
on: "str | exp.Expr",
|
|
116
|
+
alias: "str | None" = None,
|
|
117
|
+
join_type: str = "INNER",
|
|
118
|
+
) -> "Self":
|
|
119
|
+
"""Add JOIN clause to the UPDATE statement.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
table: The table name, expression, or subquery to join.
|
|
123
|
+
on: The JOIN condition.
|
|
124
|
+
alias: Optional alias for the joined table.
|
|
125
|
+
join_type: Type of join (INNER, LEFT, RIGHT, FULL).
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
The current builder instance for method chaining.
|
|
129
|
+
|
|
130
|
+
Raises:
|
|
131
|
+
SQLBuilderError: If the current expression is not an UPDATE statement.
|
|
132
|
+
"""
|
|
133
|
+
if self._expression is None or not isinstance(self._expression, exp.Update):
|
|
134
|
+
msg = "Cannot add JOIN clause to non-UPDATE expression."
|
|
135
|
+
raise SQLBuilderError(msg)
|
|
136
|
+
|
|
137
|
+
join_expr = build_join_clause(cast("SQLBuilderProtocol", self), table, on, alias, join_type)
|
|
138
|
+
|
|
139
|
+
if not self._expression.args.get("joins"):
|
|
140
|
+
self._expression.set("joins", [])
|
|
141
|
+
self._expression.args["joins"].append(join_expr)
|
|
142
|
+
|
|
143
|
+
return self
|
|
144
|
+
|
|
145
|
+
def build(self, dialect: "DialectType" = None) -> "BuiltQuery":
|
|
146
|
+
"""Build the UPDATE query with validation.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
dialect: Optional dialect override for SQL generation.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
BuiltQuery: The built query with SQL and parameters.
|
|
153
|
+
|
|
154
|
+
Raises:
|
|
155
|
+
SQLBuilderError: If no table is set or expression is not an UPDATE.
|
|
156
|
+
"""
|
|
157
|
+
if self._expression is None:
|
|
158
|
+
msg = "UPDATE expression not initialized."
|
|
159
|
+
raise SQLBuilderError(msg)
|
|
160
|
+
|
|
161
|
+
if not isinstance(self._expression, exp.Update):
|
|
162
|
+
msg = "No UPDATE expression to build or expression is of the wrong type."
|
|
163
|
+
raise SQLBuilderError(msg)
|
|
164
|
+
|
|
165
|
+
if self._expression.this is None:
|
|
166
|
+
msg = "No table specified for UPDATE statement."
|
|
167
|
+
raise SQLBuilderError(msg)
|
|
168
|
+
|
|
169
|
+
if not self._expression.args.get("expressions"):
|
|
170
|
+
msg = "At least one SET clause must be specified for UPDATE statement."
|
|
171
|
+
raise SQLBuilderError(msg)
|
|
172
|
+
|
|
173
|
+
return super().build(dialect=dialect)
|
|
Binary file
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
"""Vector distance helpers and SQL generator registration."""
|
|
2
|
+
|
|
3
|
+
# ruff: noqa: N802
|
|
4
|
+
# pyright: ignore[reportConstantRedefinition]
|
|
5
|
+
from collections.abc import Callable, MutableMapping
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Final, TypeAlias, cast
|
|
7
|
+
|
|
8
|
+
from sqlglot import exp
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from sqlglot.dialects.bigquery import BigQuery
|
|
12
|
+
from sqlglot.dialects.duckdb import DuckDB
|
|
13
|
+
from sqlglot.dialects.mysql import MySQL
|
|
14
|
+
from sqlglot.dialects.oracle import Oracle
|
|
15
|
+
from sqlglot.dialects.postgres import Postgres
|
|
16
|
+
from sqlglot.generator import Generator
|
|
17
|
+
|
|
18
|
+
from sqlspec.dialects.spanner import Spangres, Spanner
|
|
19
|
+
|
|
20
|
+
SupportedVectorDistanceDialect: TypeAlias = "BigQuery | DuckDB | MySQL | Oracle | Postgres | Spangres | Spanner"
|
|
21
|
+
|
|
22
|
+
__all__ = (
|
|
23
|
+
"VectorDistance",
|
|
24
|
+
"has_vector_distance_ancestor",
|
|
25
|
+
"is_vector_distance_expression",
|
|
26
|
+
"render_vector_distance_bigquery",
|
|
27
|
+
"render_vector_distance_duckdb",
|
|
28
|
+
"render_vector_distance_generic",
|
|
29
|
+
"render_vector_distance_mysql",
|
|
30
|
+
"render_vector_distance_oracle",
|
|
31
|
+
"render_vector_distance_postgres",
|
|
32
|
+
"vector_distance_metric",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
_VECTOR_DISTANCE_META_KEY: Final[str] = "sqlspec_vector_distance_metric"
|
|
36
|
+
_OperatorTransform = Callable[[Any, exp.Operator], str]
|
|
37
|
+
_SQLGLOT_VECTOR_DISTANCE_REGISTERED = False
|
|
38
|
+
_BASE_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
39
|
+
_POSTGRES_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
40
|
+
_MYSQL_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
41
|
+
_ORACLE_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
42
|
+
_BIGQUERY_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
43
|
+
_DUCKDB_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
44
|
+
_SPANNER_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
45
|
+
_SPANGRES_OPERATOR_TRANSFORM: _OperatorTransform | None = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _normalize_metric(metric: Any) -> str:
|
|
49
|
+
"""Normalize vector metrics to a lowercase string."""
|
|
50
|
+
if isinstance(metric, exp.Literal):
|
|
51
|
+
return str(metric.this).lower()
|
|
52
|
+
if isinstance(metric, exp.Identifier):
|
|
53
|
+
identifier = metric.this
|
|
54
|
+
return identifier.lower() if isinstance(identifier, str) else "euclidean"
|
|
55
|
+
if isinstance(metric, str):
|
|
56
|
+
return metric.lower()
|
|
57
|
+
return "euclidean"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def is_vector_distance_expression(expression: object) -> bool:
|
|
61
|
+
"""Return True when an Operator node is a SQLSpec vector-distance expression."""
|
|
62
|
+
return isinstance(expression, exp.Operator) and _VECTOR_DISTANCE_META_KEY in expression.meta
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def has_vector_distance_ancestor(expression: exp.Expr) -> bool:
|
|
66
|
+
"""Return True when any ancestor is a SQLSpec vector-distance expression."""
|
|
67
|
+
parent = expression.parent
|
|
68
|
+
while parent is not None:
|
|
69
|
+
if is_vector_distance_expression(parent):
|
|
70
|
+
return True
|
|
71
|
+
parent = parent.parent
|
|
72
|
+
return False
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def vector_distance_metric(expression: object) -> str:
|
|
76
|
+
"""Get the normalized vector-distance metric from an Operator node."""
|
|
77
|
+
if not isinstance(expression, exp.Operator):
|
|
78
|
+
msg = f"Expected sqlglot Operator, got {type(expression)}"
|
|
79
|
+
raise TypeError(msg)
|
|
80
|
+
metric = expression.meta.get(_VECTOR_DISTANCE_META_KEY)
|
|
81
|
+
if isinstance(metric, str):
|
|
82
|
+
return metric
|
|
83
|
+
operator = expression.args.get("operator")
|
|
84
|
+
return str(operator).lower() if operator is not None else "euclidean"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _build_vector_distance(this: exp.Expr, expression: exp.Expr, metric: Any = "euclidean") -> exp.Operator:
|
|
88
|
+
normalized_metric = _normalize_metric(metric)
|
|
89
|
+
node = exp.Operator(this=this, expression=expression, operator=normalized_metric)
|
|
90
|
+
node.meta[_VECTOR_DISTANCE_META_KEY] = normalized_metric
|
|
91
|
+
return node
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def VectorDistance(*, this: exp.Expr, expression: exp.Expr, metric: Any = "euclidean") -> exp.Operator:
|
|
95
|
+
"""Build a SQLSpec vector-distance expression."""
|
|
96
|
+
_register_with_sqlglot()
|
|
97
|
+
return _build_vector_distance(this=this, expression=expression, metric=metric)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def render_vector_distance_postgres(left: str, right: str, metric: str) -> str:
|
|
101
|
+
"""Render PostgreSQL pgvector operator syntax."""
|
|
102
|
+
operator_map = {"euclidean": "<->", "cosine": "<=>", "inner_product": "<#>"}
|
|
103
|
+
|
|
104
|
+
operator = operator_map.get(metric)
|
|
105
|
+
if operator:
|
|
106
|
+
return f"{left} {operator} {right}"
|
|
107
|
+
|
|
108
|
+
return render_vector_distance_generic(left, right, metric)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def render_vector_distance_mysql(left: str, right: str, metric: str) -> str:
|
|
112
|
+
"""Render MySQL DISTANCE function syntax."""
|
|
113
|
+
metric_map = {"euclidean": "EUCLIDEAN", "cosine": "COSINE", "inner_product": "DOT"}
|
|
114
|
+
|
|
115
|
+
mysql_metric = metric_map.get(metric, "EUCLIDEAN")
|
|
116
|
+
|
|
117
|
+
if ("ARRAY" in right or "[" in right) and "STRING_TO_VECTOR" not in right:
|
|
118
|
+
right = f"STRING_TO_VECTOR({right})"
|
|
119
|
+
|
|
120
|
+
return f"DISTANCE({left}, {right}, '{mysql_metric}')"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def render_vector_distance_oracle(left: str, right: str, metric: str) -> str:
|
|
124
|
+
"""Render Oracle VECTOR_DISTANCE function syntax."""
|
|
125
|
+
metric_map = {
|
|
126
|
+
"euclidean": "EUCLIDEAN",
|
|
127
|
+
"cosine": "COSINE",
|
|
128
|
+
"inner_product": "DOT",
|
|
129
|
+
"euclidean_squared": "EUCLIDEAN_SQUARED",
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
oracle_metric = metric_map.get(metric, "EUCLIDEAN")
|
|
133
|
+
|
|
134
|
+
if ("[" in right or "ARRAY" in right) and "TO_VECTOR" not in right:
|
|
135
|
+
right = f"TO_VECTOR({right})"
|
|
136
|
+
|
|
137
|
+
return f"VECTOR_DISTANCE({left}, {right}, {oracle_metric})"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def render_vector_distance_bigquery(left: str, right: str, metric: str) -> str:
|
|
141
|
+
"""Render BigQuery vector distance function syntax."""
|
|
142
|
+
function_map = {"euclidean": "EUCLIDEAN_DISTANCE", "cosine": "COSINE_DISTANCE", "inner_product": "DOT_PRODUCT"}
|
|
143
|
+
|
|
144
|
+
function_name = function_map.get(metric)
|
|
145
|
+
if function_name:
|
|
146
|
+
return f"{function_name}({left}, {right})"
|
|
147
|
+
|
|
148
|
+
return render_vector_distance_generic(left, right, metric)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def render_vector_distance_duckdb(left: str, right: str, metric: str) -> str:
|
|
152
|
+
"""Render DuckDB VSS extension function syntax."""
|
|
153
|
+
function_map = {
|
|
154
|
+
"euclidean": "array_distance",
|
|
155
|
+
"cosine": "array_cosine_distance",
|
|
156
|
+
"inner_product": "array_negative_inner_product",
|
|
157
|
+
}
|
|
158
|
+
function_name = function_map.get(metric)
|
|
159
|
+
if function_name:
|
|
160
|
+
return f"{function_name}({left}, CAST({right} AS DOUBLE[]))"
|
|
161
|
+
|
|
162
|
+
return render_vector_distance_generic(left, right, metric)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def render_vector_distance_generic(left: str, right: str, metric: str) -> str:
|
|
166
|
+
"""Render generic VECTOR_DISTANCE function syntax."""
|
|
167
|
+
return f"VECTOR_DISTANCE({left}, {right}, '{metric.upper()}')"
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _render_with_metric(generator: "Generator", expression: exp.Operator, dialect: str) -> str:
|
|
171
|
+
left_sql = generator.sql(expression, "this")
|
|
172
|
+
right_sql = generator.sql(expression, "expression")
|
|
173
|
+
metric = vector_distance_metric(expression)
|
|
174
|
+
|
|
175
|
+
if dialect == "postgres":
|
|
176
|
+
return render_vector_distance_postgres(left_sql, right_sql, metric)
|
|
177
|
+
if dialect == "mysql":
|
|
178
|
+
return render_vector_distance_mysql(left_sql, right_sql, metric)
|
|
179
|
+
if dialect == "oracle":
|
|
180
|
+
if isinstance(expression.expression, exp.Array):
|
|
181
|
+
values = [
|
|
182
|
+
str(item.this) if isinstance(item, exp.Literal) else generator.sql(item)
|
|
183
|
+
for item in expression.expression.expressions
|
|
184
|
+
]
|
|
185
|
+
right_sql = f"TO_VECTOR('[{', '.join(values)}]')"
|
|
186
|
+
return render_vector_distance_oracle(left_sql, right_sql, metric)
|
|
187
|
+
if dialect == "bigquery":
|
|
188
|
+
return render_vector_distance_bigquery(left_sql, right_sql, metric)
|
|
189
|
+
if dialect == "duckdb":
|
|
190
|
+
if isinstance(expression.expression, exp.Array) and expression.expression.expressions:
|
|
191
|
+
target_type = f"DOUBLE[{len(expression.expression.expressions)}]"
|
|
192
|
+
else:
|
|
193
|
+
target_type = "DOUBLE[]"
|
|
194
|
+
function_map = {
|
|
195
|
+
"euclidean": "array_distance",
|
|
196
|
+
"cosine": "array_cosine_distance",
|
|
197
|
+
"inner_product": "array_negative_inner_product",
|
|
198
|
+
}
|
|
199
|
+
function_name = function_map.get(metric)
|
|
200
|
+
if function_name:
|
|
201
|
+
return f"{function_name}({left_sql}, CAST({right_sql} AS {target_type}))"
|
|
202
|
+
return render_vector_distance_generic(left_sql, right_sql, metric)
|
|
203
|
+
|
|
204
|
+
return render_vector_distance_generic(left_sql, right_sql, metric)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _operator_sql_base(generator: "Generator", expression: exp.Operator) -> str:
|
|
208
|
+
if is_vector_distance_expression(expression):
|
|
209
|
+
return _render_with_metric(generator, expression, "generic")
|
|
210
|
+
return _require_operator_transform(_BASE_OPERATOR_TRANSFORM)(generator, expression)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _operator_sql_postgres(generator: "Generator", expression: exp.Operator) -> str:
|
|
214
|
+
if is_vector_distance_expression(expression):
|
|
215
|
+
return _render_with_metric(generator, expression, "postgres")
|
|
216
|
+
return _require_operator_transform(_POSTGRES_OPERATOR_TRANSFORM)(generator, expression)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _operator_sql_mysql(generator: "Generator", expression: exp.Operator) -> str:
|
|
220
|
+
if is_vector_distance_expression(expression):
|
|
221
|
+
return _render_with_metric(generator, expression, "mysql")
|
|
222
|
+
return _require_operator_transform(_MYSQL_OPERATOR_TRANSFORM)(generator, expression)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _operator_sql_oracle(generator: "Generator", expression: exp.Operator) -> str:
|
|
226
|
+
if is_vector_distance_expression(expression):
|
|
227
|
+
return _render_with_metric(generator, expression, "oracle")
|
|
228
|
+
return _require_operator_transform(_ORACLE_OPERATOR_TRANSFORM)(generator, expression)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _operator_sql_bigquery(generator: "Generator", expression: exp.Operator) -> str:
|
|
232
|
+
if is_vector_distance_expression(expression):
|
|
233
|
+
return _render_with_metric(generator, expression, "bigquery")
|
|
234
|
+
return _require_operator_transform(_BIGQUERY_OPERATOR_TRANSFORM)(generator, expression)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _operator_sql_duckdb(generator: "Generator", expression: exp.Operator) -> str:
|
|
238
|
+
if is_vector_distance_expression(expression):
|
|
239
|
+
return _render_with_metric(generator, expression, "duckdb")
|
|
240
|
+
return _require_operator_transform(_DUCKDB_OPERATOR_TRANSFORM)(generator, expression)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def _operator_sql_spanner(generator: "Generator", expression: exp.Operator) -> str:
|
|
244
|
+
if is_vector_distance_expression(expression):
|
|
245
|
+
return _render_with_metric(generator, expression, "bigquery")
|
|
246
|
+
return _require_operator_transform(_SPANNER_OPERATOR_TRANSFORM)(generator, expression)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def _operator_sql_spangres(generator: "Generator", expression: exp.Operator) -> str:
|
|
250
|
+
if is_vector_distance_expression(expression):
|
|
251
|
+
return _render_with_metric(generator, expression, "postgres")
|
|
252
|
+
return _require_operator_transform(_SPANGRES_OPERATOR_TRANSFORM)(generator, expression)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def _require_operator_transform(transform: _OperatorTransform | None) -> _OperatorTransform:
|
|
256
|
+
"""Return a registered fallback transform or fail loudly."""
|
|
257
|
+
if transform is None:
|
|
258
|
+
msg = "Vector-distance SQLGlot transforms have not been registered"
|
|
259
|
+
raise RuntimeError(msg)
|
|
260
|
+
return transform
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _register_operator_transform(
|
|
264
|
+
transforms: MutableMapping[type[exp.Expr], "_OperatorTransform"], wrapper: "_OperatorTransform"
|
|
265
|
+
) -> None:
|
|
266
|
+
"""Install an operator transform wrapper."""
|
|
267
|
+
transforms[exp.Operator] = wrapper
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _register_with_sqlglot() -> None:
|
|
271
|
+
"""Register vector-distance Operator rendering with SQLGlot generators."""
|
|
272
|
+
global \
|
|
273
|
+
_SQLGLOT_VECTOR_DISTANCE_REGISTERED, \
|
|
274
|
+
_BASE_OPERATOR_TRANSFORM, \
|
|
275
|
+
_POSTGRES_OPERATOR_TRANSFORM, \
|
|
276
|
+
_MYSQL_OPERATOR_TRANSFORM, \
|
|
277
|
+
_ORACLE_OPERATOR_TRANSFORM, \
|
|
278
|
+
_BIGQUERY_OPERATOR_TRANSFORM, \
|
|
279
|
+
_DUCKDB_OPERATOR_TRANSFORM, \
|
|
280
|
+
_SPANNER_OPERATOR_TRANSFORM, \
|
|
281
|
+
_SPANGRES_OPERATOR_TRANSFORM
|
|
282
|
+
|
|
283
|
+
if _SQLGLOT_VECTOR_DISTANCE_REGISTERED:
|
|
284
|
+
return
|
|
285
|
+
|
|
286
|
+
from sqlglot.dialects.bigquery import BigQuery
|
|
287
|
+
from sqlglot.dialects.duckdb import DuckDB
|
|
288
|
+
from sqlglot.dialects.mysql import MySQL
|
|
289
|
+
from sqlglot.dialects.oracle import Oracle
|
|
290
|
+
from sqlglot.dialects.postgres import Postgres
|
|
291
|
+
from sqlglot.generator import Generator
|
|
292
|
+
|
|
293
|
+
from sqlspec.dialects.spanner import Spangres, Spanner
|
|
294
|
+
|
|
295
|
+
_BASE_OPERATOR_TRANSFORM = cast("_OperatorTransform", Generator.TRANSFORMS[exp.Operator])
|
|
296
|
+
_POSTGRES_OPERATOR_TRANSFORM = cast("_OperatorTransform", Postgres.Generator.TRANSFORMS[exp.Operator])
|
|
297
|
+
_MYSQL_OPERATOR_TRANSFORM = cast("_OperatorTransform", MySQL.Generator.TRANSFORMS[exp.Operator])
|
|
298
|
+
_ORACLE_OPERATOR_TRANSFORM = cast("_OperatorTransform", Oracle.Generator.TRANSFORMS[exp.Operator])
|
|
299
|
+
_BIGQUERY_OPERATOR_TRANSFORM = cast("_OperatorTransform", BigQuery.Generator.TRANSFORMS[exp.Operator])
|
|
300
|
+
_DUCKDB_OPERATOR_TRANSFORM = cast("_OperatorTransform", DuckDB.Generator.TRANSFORMS[exp.Operator])
|
|
301
|
+
_SPANNER_OPERATOR_TRANSFORM = cast("_OperatorTransform", Spanner.Generator.TRANSFORMS[exp.Operator])
|
|
302
|
+
_SPANGRES_OPERATOR_TRANSFORM = cast("_OperatorTransform", Spangres.Generator.TRANSFORMS[exp.Operator])
|
|
303
|
+
|
|
304
|
+
_register_operator_transform(Generator.TRANSFORMS, _operator_sql_base)
|
|
305
|
+
_register_operator_transform(Postgres.Generator.TRANSFORMS, _operator_sql_postgres)
|
|
306
|
+
_register_operator_transform(MySQL.Generator.TRANSFORMS, _operator_sql_mysql)
|
|
307
|
+
_register_operator_transform(Oracle.Generator.TRANSFORMS, _operator_sql_oracle)
|
|
308
|
+
_register_operator_transform(BigQuery.Generator.TRANSFORMS, _operator_sql_bigquery)
|
|
309
|
+
_register_operator_transform(DuckDB.Generator.TRANSFORMS, _operator_sql_duckdb)
|
|
310
|
+
_register_operator_transform(Spanner.Generator.TRANSFORMS, _operator_sql_spanner)
|
|
311
|
+
_register_operator_transform(Spangres.Generator.TRANSFORMS, _operator_sql_spangres)
|
|
312
|
+
|
|
313
|
+
# sqlglot caches the dispatch table (built from TRANSFORMS) per Generator class
|
|
314
|
+
# in _DISPATCH_CACHE. We must invalidate stale entries so the next instantiation
|
|
315
|
+
# picks up our new Operator transforms.
|
|
316
|
+
from sqlglot.generator import _DISPATCH_CACHE # pyright: ignore[reportPrivateUsage]
|
|
317
|
+
|
|
318
|
+
for gen_cls in (
|
|
319
|
+
Generator,
|
|
320
|
+
Postgres.Generator,
|
|
321
|
+
MySQL.Generator,
|
|
322
|
+
Oracle.Generator,
|
|
323
|
+
BigQuery.Generator,
|
|
324
|
+
DuckDB.Generator,
|
|
325
|
+
Spanner.Generator,
|
|
326
|
+
Spangres.Generator,
|
|
327
|
+
):
|
|
328
|
+
_DISPATCH_CACHE.pop(gen_cls, None)
|
|
329
|
+
|
|
330
|
+
_SQLGLOT_VECTOR_DISTANCE_REGISTERED = True
|