sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
"""OracleDB adapter compiled helpers."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from collections.abc import Sized
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from sqlspec.adapters.oracledb.type_converter import OracleOutputConverter
|
|
8
|
+
from sqlspec.core import (
|
|
9
|
+
DriverParameterProfile,
|
|
10
|
+
ParameterStyle,
|
|
11
|
+
StackResult,
|
|
12
|
+
StatementConfig,
|
|
13
|
+
build_statement_config_from_profile,
|
|
14
|
+
create_sql_result,
|
|
15
|
+
)
|
|
16
|
+
from sqlspec.exceptions import (
|
|
17
|
+
CheckViolationError,
|
|
18
|
+
DatabaseConnectionError,
|
|
19
|
+
DataError,
|
|
20
|
+
ForeignKeyViolationError,
|
|
21
|
+
IntegrityError,
|
|
22
|
+
NotNullViolationError,
|
|
23
|
+
OperationalError,
|
|
24
|
+
SQLParsingError,
|
|
25
|
+
SQLSpecError,
|
|
26
|
+
TransactionError,
|
|
27
|
+
UniqueViolationError,
|
|
28
|
+
)
|
|
29
|
+
from sqlspec.typing import NUMPY_INSTALLED
|
|
30
|
+
from sqlspec.utils.serializers import to_json
|
|
31
|
+
from sqlspec.utils.type_guards import has_rowcount, is_readable
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from collections.abc import Callable, Mapping
|
|
35
|
+
|
|
36
|
+
from sqlspec.core import SQL
|
|
37
|
+
|
|
38
|
+
__all__ = (
|
|
39
|
+
"apply_driver_features",
|
|
40
|
+
"build_insert_statement",
|
|
41
|
+
"build_pipeline_stack_result",
|
|
42
|
+
"build_profile",
|
|
43
|
+
"build_statement_config",
|
|
44
|
+
"build_truncate_statement",
|
|
45
|
+
"coerce_large_string_parameters_async",
|
|
46
|
+
"coerce_large_string_parameters_sync",
|
|
47
|
+
"collect_async_rows",
|
|
48
|
+
"collect_sync_rows",
|
|
49
|
+
"create_mapped_exception",
|
|
50
|
+
"default_statement_config",
|
|
51
|
+
"driver_profile",
|
|
52
|
+
"normalize_column_names",
|
|
53
|
+
"normalize_execute_many_parameters_async",
|
|
54
|
+
"normalize_execute_many_parameters_sync",
|
|
55
|
+
"requires_session_callback",
|
|
56
|
+
"resolve_rowcount",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
IMPLICIT_UPPER_COLUMN_PATTERN: "re.Pattern[str]" = re.compile(r"^(?!\d)(?:[A-Z0-9_]+)$")
|
|
61
|
+
_VERSION_COMPONENTS: int = 3
|
|
62
|
+
TYPE_CONVERTER = OracleOutputConverter()
|
|
63
|
+
|
|
64
|
+
ORA_CHECK_CONSTRAINT = 2290
|
|
65
|
+
ORA_INTEGRITY_RANGE_START = 2200
|
|
66
|
+
ORA_INTEGRITY_RANGE_END = 2300
|
|
67
|
+
ORA_PARSING_RANGE_START = 900
|
|
68
|
+
ORA_PARSING_RANGE_END = 1000
|
|
69
|
+
ORA_TABLESPACE_FULL = 1652
|
|
70
|
+
|
|
71
|
+
_ERROR_CODE_MAPPING: "dict[int, tuple[type[SQLSpecError], str]]" = {
|
|
72
|
+
1: (UniqueViolationError, "unique constraint violation"),
|
|
73
|
+
2291: (ForeignKeyViolationError, "foreign key constraint violation"),
|
|
74
|
+
2292: (ForeignKeyViolationError, "foreign key constraint violation"),
|
|
75
|
+
ORA_CHECK_CONSTRAINT: (CheckViolationError, "check constraint violation"),
|
|
76
|
+
1400: (NotNullViolationError, "not-null constraint violation"),
|
|
77
|
+
1407: (NotNullViolationError, "not-null constraint violation"),
|
|
78
|
+
1017: (DatabaseConnectionError, "connection error"),
|
|
79
|
+
12154: (DatabaseConnectionError, "connection error"),
|
|
80
|
+
12541: (DatabaseConnectionError, "connection error"),
|
|
81
|
+
12545: (DatabaseConnectionError, "connection error"),
|
|
82
|
+
12514: (DatabaseConnectionError, "connection error"),
|
|
83
|
+
12505: (DatabaseConnectionError, "connection error"),
|
|
84
|
+
60: (TransactionError, "transaction error"),
|
|
85
|
+
8176: (TransactionError, "transaction error"),
|
|
86
|
+
1722: (DataError, "data error"),
|
|
87
|
+
1858: (DataError, "data error"),
|
|
88
|
+
1840: (DataError, "data error"),
|
|
89
|
+
ORA_TABLESPACE_FULL: (OperationalError, "operational error"),
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _parse_version_tuple(version: str) -> "tuple[int, int, int]":
|
|
94
|
+
parts = [int(part) for part in version.split(".") if part.isdigit()]
|
|
95
|
+
while len(parts) < _VERSION_COMPONENTS:
|
|
96
|
+
parts.append(0)
|
|
97
|
+
return parts[0], parts[1], parts[2]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _resolve_oracledb_version() -> "tuple[int, int, int]":
|
|
101
|
+
try:
|
|
102
|
+
import oracledb
|
|
103
|
+
except ImportError:
|
|
104
|
+
return (0, 0, 0)
|
|
105
|
+
try:
|
|
106
|
+
version = oracledb.__version__
|
|
107
|
+
except AttributeError:
|
|
108
|
+
version = "0.0.0"
|
|
109
|
+
return _parse_version_tuple(version)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
ORACLEDB_VERSION: "tuple[int, int, int]" = _resolve_oracledb_version()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def normalize_column_names(column_names: "list[str]", driver_features: "dict[str, Any]") -> "list[str]":
|
|
116
|
+
should_lowercase = driver_features.get("enable_lowercase_column_names", False)
|
|
117
|
+
if not should_lowercase:
|
|
118
|
+
return column_names
|
|
119
|
+
normalized: list[str] = []
|
|
120
|
+
for name in column_names:
|
|
121
|
+
if name and IMPLICIT_UPPER_COLUMN_PATTERN.fullmatch(name):
|
|
122
|
+
normalized.append(name.lower())
|
|
123
|
+
else:
|
|
124
|
+
normalized.append(name)
|
|
125
|
+
return normalized
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def normalize_execute_many_parameters_sync(parameters: Any) -> Any:
|
|
129
|
+
"""Normalize parameters for Oracle executemany calls.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
parameters: Prepared parameters payload.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Normalized parameters payload.
|
|
136
|
+
|
|
137
|
+
Raises:
|
|
138
|
+
ValueError: When parameters are missing for executemany.
|
|
139
|
+
"""
|
|
140
|
+
if not parameters:
|
|
141
|
+
msg = "execute_many requires parameters"
|
|
142
|
+
raise ValueError(msg)
|
|
143
|
+
if isinstance(parameters, tuple):
|
|
144
|
+
return list(parameters)
|
|
145
|
+
return parameters
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def normalize_execute_many_parameters_async(parameters: Any) -> Any:
|
|
149
|
+
"""Normalize parameters for Oracle async executemany calls.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
parameters: Prepared parameters payload.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Normalized parameters payload.
|
|
156
|
+
|
|
157
|
+
Raises:
|
|
158
|
+
ValueError: When parameters are missing for executemany.
|
|
159
|
+
"""
|
|
160
|
+
if not parameters:
|
|
161
|
+
msg = "execute_many requires parameters"
|
|
162
|
+
raise ValueError(msg)
|
|
163
|
+
return parameters
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def coerce_large_string_parameters_sync(connection: Any, parameters: Any, *, lob_type: Any, threshold: int) -> Any:
|
|
167
|
+
"""Coerce large string parameters into CLOBs.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
connection: Oracle database connection.
|
|
171
|
+
parameters: Prepared parameters payload.
|
|
172
|
+
lob_type: Oracle CLOB type.
|
|
173
|
+
threshold: String length threshold for CLOB conversion.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Parameters payload with large strings converted to CLOBs.
|
|
177
|
+
"""
|
|
178
|
+
if not parameters or not isinstance(parameters, dict):
|
|
179
|
+
return parameters
|
|
180
|
+
for param_name, param_value in parameters.items():
|
|
181
|
+
if isinstance(param_value, str) and len(param_value) > threshold:
|
|
182
|
+
clob = connection.createlob(lob_type)
|
|
183
|
+
clob.write(param_value)
|
|
184
|
+
parameters[param_name] = clob
|
|
185
|
+
return parameters
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
async def coerce_large_string_parameters_async(
|
|
189
|
+
connection: Any, parameters: Any, *, lob_type: Any, threshold: int
|
|
190
|
+
) -> Any:
|
|
191
|
+
"""Coerce large string parameters into CLOBs for async Oracle drivers.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
connection: Oracle database connection.
|
|
195
|
+
parameters: Prepared parameters payload.
|
|
196
|
+
lob_type: Oracle CLOB type.
|
|
197
|
+
threshold: String length threshold for CLOB conversion.
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
Parameters payload with large strings converted to CLOBs.
|
|
201
|
+
"""
|
|
202
|
+
if not parameters or not isinstance(parameters, dict):
|
|
203
|
+
return parameters
|
|
204
|
+
for param_name, param_value in parameters.items():
|
|
205
|
+
if isinstance(param_value, str) and len(param_value) > threshold:
|
|
206
|
+
clob = await connection.createlob(lob_type)
|
|
207
|
+
await clob.write(param_value)
|
|
208
|
+
parameters[param_name] = clob
|
|
209
|
+
return parameters
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def build_insert_statement(table: str, columns: "list[str]") -> str:
|
|
213
|
+
column_list = ", ".join(columns)
|
|
214
|
+
placeholders = ", ".join(f":{idx + 1}" for idx in range(len(columns)))
|
|
215
|
+
return f"INSERT INTO {table} ({column_list}) VALUES ({placeholders})"
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def build_truncate_statement(table: str) -> str:
|
|
219
|
+
return f"TRUNCATE TABLE {table}"
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def build_pipeline_stack_result(
|
|
223
|
+
statement: "SQL",
|
|
224
|
+
method: str,
|
|
225
|
+
returns_rows: bool,
|
|
226
|
+
parameters: Any,
|
|
227
|
+
pipeline_result: Any,
|
|
228
|
+
driver_features: "dict[str, Any]",
|
|
229
|
+
) -> "StackResult":
|
|
230
|
+
"""Build StackResult from Oracle pipeline output.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
statement: Statement executed in the pipeline.
|
|
234
|
+
method: Pipeline execution method name.
|
|
235
|
+
returns_rows: Whether the operation returns rows.
|
|
236
|
+
parameters: Prepared parameters used for execution.
|
|
237
|
+
pipeline_result: Raw pipeline execution result.
|
|
238
|
+
driver_features: Driver feature configuration for normalization.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
StackResult for the pipeline operation.
|
|
242
|
+
"""
|
|
243
|
+
try:
|
|
244
|
+
rows = pipeline_result.rows
|
|
245
|
+
except AttributeError:
|
|
246
|
+
rows = None
|
|
247
|
+
try:
|
|
248
|
+
columns = pipeline_result.columns
|
|
249
|
+
except AttributeError:
|
|
250
|
+
columns = None
|
|
251
|
+
|
|
252
|
+
data: list[dict[str, Any]] | None = None
|
|
253
|
+
if returns_rows:
|
|
254
|
+
if not rows:
|
|
255
|
+
data = []
|
|
256
|
+
else:
|
|
257
|
+
if columns:
|
|
258
|
+
names = []
|
|
259
|
+
for index, column in enumerate(columns):
|
|
260
|
+
try:
|
|
261
|
+
name = column.name
|
|
262
|
+
except AttributeError:
|
|
263
|
+
name = f"column_{index}"
|
|
264
|
+
names.append(name)
|
|
265
|
+
else:
|
|
266
|
+
first = rows[0]
|
|
267
|
+
names = [f"column_{index}" for index in range(len(first) if isinstance(first, Sized) else 0)]
|
|
268
|
+
names = normalize_column_names(names, driver_features)
|
|
269
|
+
normalized_rows: list[dict[str, Any]] = []
|
|
270
|
+
for row in rows:
|
|
271
|
+
if isinstance(row, dict):
|
|
272
|
+
normalized_rows.append(row)
|
|
273
|
+
else:
|
|
274
|
+
normalized_rows.append(dict(zip(names, row, strict=False)))
|
|
275
|
+
data = normalized_rows
|
|
276
|
+
|
|
277
|
+
metadata: dict[str, Any] = {"pipeline_operation": method}
|
|
278
|
+
try:
|
|
279
|
+
warning = pipeline_result.warning
|
|
280
|
+
except AttributeError:
|
|
281
|
+
warning = None
|
|
282
|
+
if warning is not None:
|
|
283
|
+
metadata["warning"] = warning
|
|
284
|
+
|
|
285
|
+
try:
|
|
286
|
+
return_value = pipeline_result.return_value
|
|
287
|
+
except AttributeError:
|
|
288
|
+
return_value = None
|
|
289
|
+
if return_value is not None:
|
|
290
|
+
metadata["return_value"] = return_value
|
|
291
|
+
|
|
292
|
+
try:
|
|
293
|
+
rowcount = pipeline_result.rowcount
|
|
294
|
+
except AttributeError:
|
|
295
|
+
rowcount = None
|
|
296
|
+
|
|
297
|
+
if isinstance(rowcount, int) and rowcount >= 0:
|
|
298
|
+
rows_affected = rowcount
|
|
299
|
+
elif method == "execute_many":
|
|
300
|
+
try:
|
|
301
|
+
rows_affected = len(parameters or ())
|
|
302
|
+
except TypeError:
|
|
303
|
+
rows_affected = 0
|
|
304
|
+
elif method == "execute" and not returns_rows:
|
|
305
|
+
rows_affected = 1
|
|
306
|
+
elif returns_rows:
|
|
307
|
+
rows_affected = len(data or [])
|
|
308
|
+
else:
|
|
309
|
+
rows_affected = 0
|
|
310
|
+
|
|
311
|
+
sql_result = create_sql_result(statement, data=data, rows_affected=rows_affected, metadata=metadata)
|
|
312
|
+
return StackResult.from_sql_result(sql_result)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def resolve_rowcount(cursor: Any) -> int:
|
|
316
|
+
"""Resolve rowcount from an Oracle cursor.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
cursor: Oracle cursor with optional rowcount metadata.
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
Rowcount value or 0 when unavailable.
|
|
323
|
+
"""
|
|
324
|
+
if not has_rowcount(cursor):
|
|
325
|
+
return 0
|
|
326
|
+
rowcount = cursor.rowcount
|
|
327
|
+
if isinstance(rowcount, int):
|
|
328
|
+
return rowcount
|
|
329
|
+
return 0
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def apply_driver_features(driver_features: "Mapping[str, Any] | None") -> "dict[str, Any]":
|
|
333
|
+
"""Apply OracleDB driver feature defaults."""
|
|
334
|
+
features: dict[str, Any] = dict(driver_features) if driver_features else {}
|
|
335
|
+
features.setdefault("enable_numpy_vectors", NUMPY_INSTALLED)
|
|
336
|
+
features.setdefault("enable_lowercase_column_names", True)
|
|
337
|
+
features.setdefault("enable_uuid_binary", True)
|
|
338
|
+
return features
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def requires_session_callback(driver_features: "dict[str, Any]") -> bool:
|
|
342
|
+
"""Return True when the session callback should be installed."""
|
|
343
|
+
enable_numpy_vectors = bool(driver_features.get("enable_numpy_vectors", False))
|
|
344
|
+
enable_uuid_binary = bool(driver_features.get("enable_uuid_binary", False))
|
|
345
|
+
return enable_numpy_vectors or enable_uuid_binary
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def _coerce_sync_row_values(row: "tuple[Any, ...]") -> "list[Any]":
|
|
349
|
+
"""Coerce LOB handles to concrete values for synchronous execution.
|
|
350
|
+
|
|
351
|
+
Processes each value in the row, reading LOB objects and applying
|
|
352
|
+
type detection for JSON values stored in CLOBs.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
row: Tuple of column values from database fetch.
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
List of coerced values with LOBs read to strings/bytes.
|
|
359
|
+
|
|
360
|
+
"""
|
|
361
|
+
coerced_values: list[Any] = []
|
|
362
|
+
for value in row:
|
|
363
|
+
if is_readable(value):
|
|
364
|
+
try:
|
|
365
|
+
processed_value = value.read()
|
|
366
|
+
except Exception:
|
|
367
|
+
coerced_values.append(value)
|
|
368
|
+
continue
|
|
369
|
+
if isinstance(processed_value, str):
|
|
370
|
+
processed_value = TYPE_CONVERTER.convert_if_detected(processed_value)
|
|
371
|
+
coerced_values.append(processed_value)
|
|
372
|
+
continue
|
|
373
|
+
coerced_values.append(value)
|
|
374
|
+
return coerced_values
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
async def _coerce_async_row_values(row: "tuple[Any, ...]") -> "list[Any]":
|
|
378
|
+
"""Coerce LOB handles to concrete values for asynchronous execution.
|
|
379
|
+
|
|
380
|
+
Processes each value in the row, reading LOB objects asynchronously
|
|
381
|
+
and applying type detection for JSON values stored in CLOBs.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
row: Tuple of column values from database fetch.
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
List of coerced values with LOBs read to strings/bytes.
|
|
388
|
+
|
|
389
|
+
"""
|
|
390
|
+
coerced_values: list[Any] = []
|
|
391
|
+
for value in row:
|
|
392
|
+
if is_readable(value):
|
|
393
|
+
try:
|
|
394
|
+
processed_value = await TYPE_CONVERTER.process_lob(value)
|
|
395
|
+
except Exception:
|
|
396
|
+
coerced_values.append(value)
|
|
397
|
+
continue
|
|
398
|
+
if isinstance(processed_value, str):
|
|
399
|
+
processed_value = TYPE_CONVERTER.convert_if_detected(processed_value)
|
|
400
|
+
coerced_values.append(processed_value)
|
|
401
|
+
else:
|
|
402
|
+
coerced_values.append(value)
|
|
403
|
+
return coerced_values
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def collect_sync_rows(
|
|
407
|
+
fetched_data: "list[Any] | None", description: "list[Any] | None", driver_features: "dict[str, Any]"
|
|
408
|
+
) -> "tuple[list[dict[str, Any]], list[str]]":
|
|
409
|
+
"""Collect OracleDB sync rows into dictionaries with normalized column names.
|
|
410
|
+
|
|
411
|
+
Args:
|
|
412
|
+
fetched_data: Rows returned from cursor.fetchall().
|
|
413
|
+
description: Cursor description metadata.
|
|
414
|
+
driver_features: Driver feature configuration.
|
|
415
|
+
|
|
416
|
+
Returns:
|
|
417
|
+
Tuple of (rows, column_names).
|
|
418
|
+
"""
|
|
419
|
+
if not description:
|
|
420
|
+
return [], []
|
|
421
|
+
column_names = [col[0] for col in description]
|
|
422
|
+
column_names = normalize_column_names(column_names, driver_features)
|
|
423
|
+
if not fetched_data:
|
|
424
|
+
return [], column_names
|
|
425
|
+
data = [dict(zip(column_names, _coerce_sync_row_values(row), strict=False)) for row in fetched_data]
|
|
426
|
+
return data, column_names
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
async def collect_async_rows(
|
|
430
|
+
fetched_data: "list[Any] | None", description: "list[Any] | None", driver_features: "dict[str, Any]"
|
|
431
|
+
) -> "tuple[list[dict[str, Any]], list[str]]":
|
|
432
|
+
"""Collect OracleDB async rows into dictionaries with normalized column names.
|
|
433
|
+
|
|
434
|
+
Args:
|
|
435
|
+
fetched_data: Rows returned from cursor.fetchall().
|
|
436
|
+
description: Cursor description metadata.
|
|
437
|
+
driver_features: Driver feature configuration.
|
|
438
|
+
|
|
439
|
+
Returns:
|
|
440
|
+
Tuple of (rows, column_names).
|
|
441
|
+
"""
|
|
442
|
+
if not description:
|
|
443
|
+
return [], []
|
|
444
|
+
column_names = [col[0] for col in description]
|
|
445
|
+
column_names = normalize_column_names(column_names, driver_features)
|
|
446
|
+
if not fetched_data:
|
|
447
|
+
return [], column_names
|
|
448
|
+
data: list[dict[str, Any]] = []
|
|
449
|
+
for row in fetched_data:
|
|
450
|
+
coerced_row = await _coerce_async_row_values(row)
|
|
451
|
+
data.append(dict(zip(column_names, coerced_row, strict=False)))
|
|
452
|
+
return data, column_names
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def _create_oracle_error(
|
|
456
|
+
error: Any, code: "int | None", error_class: type[SQLSpecError], description: str
|
|
457
|
+
) -> SQLSpecError:
|
|
458
|
+
"""Create a SQLSpec exception from an Oracle error.
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
error: The original Oracle exception
|
|
462
|
+
code: Oracle error code
|
|
463
|
+
error_class: The SQLSpec exception class to instantiate
|
|
464
|
+
description: Human-readable description of the error type
|
|
465
|
+
|
|
466
|
+
Returns:
|
|
467
|
+
A new SQLSpec exception instance with the original as its cause
|
|
468
|
+
"""
|
|
469
|
+
msg = f"Oracle {description} [ORA-{code:05d}]: {error}" if code else f"Oracle {description}: {error}"
|
|
470
|
+
exc = error_class(msg)
|
|
471
|
+
exc.__cause__ = error
|
|
472
|
+
return exc
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
def create_mapped_exception(error: Any) -> SQLSpecError:
|
|
476
|
+
"""Map Oracle exceptions to SQLSpec exceptions.
|
|
477
|
+
|
|
478
|
+
This is a factory function that returns an exception instance rather than
|
|
479
|
+
raising. This pattern is more robust for use in __exit__ handlers and
|
|
480
|
+
avoids issues with exception control flow in different Python versions.
|
|
481
|
+
|
|
482
|
+
Args:
|
|
483
|
+
error: The Oracle exception to map
|
|
484
|
+
|
|
485
|
+
Returns:
|
|
486
|
+
A SQLSpec exception that wraps the original error
|
|
487
|
+
"""
|
|
488
|
+
error_obj = error.args[0] if getattr(error, "args", None) else None
|
|
489
|
+
if not error_obj:
|
|
490
|
+
return _create_oracle_error(error, None, SQLSpecError, "database error")
|
|
491
|
+
|
|
492
|
+
try:
|
|
493
|
+
error_code = error_obj.code
|
|
494
|
+
except AttributeError:
|
|
495
|
+
error_code = None
|
|
496
|
+
if not error_code:
|
|
497
|
+
return _create_oracle_error(error, None, SQLSpecError, "database error")
|
|
498
|
+
|
|
499
|
+
mapping = _ERROR_CODE_MAPPING.get(error_code)
|
|
500
|
+
if mapping:
|
|
501
|
+
error_class, error_desc = mapping
|
|
502
|
+
return _create_oracle_error(error, error_code, error_class, error_desc)
|
|
503
|
+
|
|
504
|
+
if ORA_INTEGRITY_RANGE_START <= error_code < ORA_INTEGRITY_RANGE_END:
|
|
505
|
+
return _create_oracle_error(error, error_code, IntegrityError, "integrity constraint violation")
|
|
506
|
+
|
|
507
|
+
if ORA_PARSING_RANGE_START <= error_code < ORA_PARSING_RANGE_END:
|
|
508
|
+
return _create_oracle_error(error, error_code, SQLParsingError, "SQL syntax error")
|
|
509
|
+
|
|
510
|
+
return _create_oracle_error(error, error_code, SQLSpecError, "database error")
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
def build_profile() -> "DriverParameterProfile":
|
|
514
|
+
"""Create the OracleDB driver parameter profile."""
|
|
515
|
+
return DriverParameterProfile(
|
|
516
|
+
name="OracleDB",
|
|
517
|
+
default_style=ParameterStyle.POSITIONAL_COLON,
|
|
518
|
+
supported_styles={ParameterStyle.NAMED_COLON, ParameterStyle.POSITIONAL_COLON, ParameterStyle.QMARK},
|
|
519
|
+
default_execution_style=ParameterStyle.NAMED_COLON,
|
|
520
|
+
supported_execution_styles={ParameterStyle.NAMED_COLON, ParameterStyle.POSITIONAL_COLON},
|
|
521
|
+
has_native_list_expansion=False,
|
|
522
|
+
preserve_parameter_format=True,
|
|
523
|
+
needs_static_script_compilation=False,
|
|
524
|
+
allow_mixed_parameter_styles=False,
|
|
525
|
+
preserve_original_params_for_many=False,
|
|
526
|
+
json_serializer_strategy="helper",
|
|
527
|
+
default_dialect="oracle",
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
driver_profile = build_profile()
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def build_statement_config(*, json_serializer: "Callable[[Any], str] | None" = None) -> StatementConfig:
|
|
535
|
+
"""Construct the OracleDB statement configuration with optional JSON serializer."""
|
|
536
|
+
serializer = json_serializer or to_json
|
|
537
|
+
profile = driver_profile
|
|
538
|
+
return build_statement_config_from_profile(
|
|
539
|
+
profile, statement_overrides={"dialect": "oracle"}, json_serializer=serializer
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
default_statement_config = build_statement_config()
|