sqlspec 0.69.0__py3-none-any.whl → 0.70.0__py3-none-any.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.
- sqlspec/__main__.py +2 -0
- sqlspec/_typing.py +10 -0
- sqlspec/adapters/adbc/__init__.py +2 -1
- sqlspec/adapters/adbc/_typing.py +48 -10
- sqlspec/adapters/adbc/adk/store.py +39 -30
- sqlspec/adapters/adbc/config.py +269 -80
- sqlspec/adapters/adbc/core.py +278 -58
- sqlspec/adapters/adbc/data_dictionary.py +106 -64
- sqlspec/adapters/adbc/driver.py +330 -80
- sqlspec/adapters/adbc/litestar/__init__.py +2 -2
- sqlspec/adapters/adbc/litestar/store.py +134 -96
- sqlspec/adapters/adbc/pool.py +237 -0
- sqlspec/adapters/adbc/type_converter.py +13 -1
- sqlspec/adapters/aiomysql/_typing.py +1 -2
- sqlspec/adapters/aiomysql/adk/store.py +47 -41
- sqlspec/adapters/aiomysql/config.py +54 -27
- sqlspec/adapters/aiomysql/core.py +485 -32
- sqlspec/adapters/aiomysql/driver.py +68 -85
- sqlspec/adapters/aiomysql/litestar/store.py +5 -8
- sqlspec/adapters/aiosqlite/adk/store.py +87 -26
- sqlspec/adapters/aiosqlite/config.py +63 -51
- sqlspec/adapters/aiosqlite/core.py +76 -46
- sqlspec/adapters/aiosqlite/data_dictionary.py +142 -22
- sqlspec/adapters/aiosqlite/driver.py +82 -250
- sqlspec/adapters/aiosqlite/litestar/store.py +7 -6
- sqlspec/adapters/aiosqlite/pool.py +1 -2
- sqlspec/adapters/aiosqlite/type_converter.py +0 -3
- sqlspec/adapters/arrow_odbc/_typing.py +3 -7
- sqlspec/adapters/arrow_odbc/adk/store.py +33 -57
- sqlspec/adapters/arrow_odbc/config.py +41 -12
- sqlspec/adapters/arrow_odbc/core.py +61 -4
- sqlspec/adapters/arrow_odbc/data_dictionary.py +14 -23
- sqlspec/adapters/arrow_odbc/driver.py +167 -57
- sqlspec/adapters/arrow_odbc/events/store.py +13 -20
- sqlspec/adapters/arrow_odbc/litestar/store.py +12 -33
- sqlspec/adapters/arrow_odbc/type_converter.py +7 -7
- sqlspec/adapters/asyncmy/_typing.py +2 -73
- sqlspec/adapters/asyncmy/adk/store.py +51 -44
- sqlspec/adapters/asyncmy/config.py +138 -40
- sqlspec/adapters/asyncmy/core.py +480 -37
- sqlspec/adapters/asyncmy/driver.py +104 -84
- sqlspec/adapters/asyncmy/litestar/store.py +5 -8
- sqlspec/adapters/asyncpg/adk/store.py +18 -35
- sqlspec/adapters/asyncpg/config.py +82 -94
- sqlspec/adapters/asyncpg/core.py +141 -89
- sqlspec/adapters/asyncpg/data_dictionary.py +52 -77
- sqlspec/adapters/asyncpg/driver.py +234 -99
- sqlspec/adapters/asyncpg/events/_hub.py +4 -12
- sqlspec/adapters/asyncpg/events/backend.py +35 -25
- sqlspec/adapters/asyncpg/events/store.py +2 -24
- sqlspec/adapters/asyncpg/litestar/store.py +11 -24
- sqlspec/adapters/bigquery/_typing.py +15 -4
- sqlspec/adapters/bigquery/adk/store.py +6 -20
- sqlspec/adapters/bigquery/config.py +51 -55
- sqlspec/adapters/bigquery/core.py +71 -13
- sqlspec/adapters/bigquery/data_dictionary.py +143 -0
- sqlspec/adapters/bigquery/driver.py +202 -60
- sqlspec/adapters/bigquery/events/store.py +3 -41
- sqlspec/adapters/bigquery/litestar/store.py +2 -40
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +76 -56
- sqlspec/adapters/cockroach_asyncpg/config.py +61 -30
- sqlspec/adapters/cockroach_asyncpg/core.py +2 -2
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +82 -91
- sqlspec/adapters/cockroach_asyncpg/driver.py +103 -13
- sqlspec/adapters/cockroach_psycopg/_typing.py +4 -4
- sqlspec/adapters/cockroach_psycopg/adk/store.py +137 -31
- sqlspec/adapters/cockroach_psycopg/config.py +77 -20
- sqlspec/adapters/cockroach_psycopg/core.py +2 -1
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +102 -108
- sqlspec/adapters/cockroach_psycopg/driver.py +204 -44
- sqlspec/adapters/db2/_typing.py +26 -25
- sqlspec/adapters/db2/adk/store.py +84 -17
- sqlspec/adapters/db2/config.py +28 -47
- sqlspec/adapters/db2/core.py +7 -0
- sqlspec/adapters/db2/data_dictionary.py +20 -5
- sqlspec/adapters/db2/driver.py +56 -16
- sqlspec/adapters/db2/events/__init__.py +1 -2
- sqlspec/adapters/db2/litestar/__init__.py +1 -2
- sqlspec/adapters/db2/litestar/store.py +7 -2
- sqlspec/adapters/db2/migrations.py +59 -78
- sqlspec/adapters/db2/pool.py +104 -48
- sqlspec/adapters/duckdb/_typing.py +27 -0
- sqlspec/adapters/duckdb/adk/__init__.py +2 -2
- sqlspec/adapters/duckdb/adk/store.py +60 -23
- sqlspec/adapters/duckdb/config.py +57 -26
- sqlspec/adapters/duckdb/core.py +338 -29
- sqlspec/adapters/duckdb/data_dictionary.py +338 -12
- sqlspec/adapters/duckdb/driver.py +318 -83
- sqlspec/adapters/duckdb/litestar/__init__.py +2 -2
- sqlspec/adapters/duckdb/litestar/store.py +2 -2
- sqlspec/adapters/duckdb/pool.py +108 -18
- sqlspec/adapters/mssql_python/_typing.py +1 -2
- sqlspec/adapters/mssql_python/adk/store.py +30 -23
- sqlspec/adapters/mssql_python/config.py +59 -2
- sqlspec/adapters/mssql_python/core.py +67 -6
- sqlspec/adapters/mssql_python/data_dictionary.py +132 -20
- sqlspec/adapters/mssql_python/driver.py +226 -112
- sqlspec/adapters/mssql_python/litestar/store.py +8 -3
- sqlspec/adapters/mssql_python/migrations.py +13 -16
- sqlspec/adapters/mssql_python/pool.py +4 -1
- sqlspec/adapters/mssql_python/type_converter.py +6 -1
- sqlspec/adapters/mysqlconnector/_typing.py +33 -20
- sqlspec/adapters/mysqlconnector/adk/store.py +79 -49
- sqlspec/adapters/mysqlconnector/config.py +93 -39
- sqlspec/adapters/mysqlconnector/core.py +546 -60
- sqlspec/adapters/mysqlconnector/driver.py +155 -160
- sqlspec/adapters/mysqlconnector/litestar/store.py +8 -17
- sqlspec/adapters/oracledb/__init__.py +6 -4
- sqlspec/adapters/oracledb/_json_handlers.py +16 -80
- sqlspec/adapters/oracledb/_param_types.py +18 -0
- sqlspec/adapters/oracledb/_storage.py +11 -10
- sqlspec/adapters/oracledb/_uuid_handlers.py +8 -3
- sqlspec/adapters/oracledb/_vector_handlers.py +11 -12
- sqlspec/adapters/oracledb/adk/store.py +239 -136
- sqlspec/adapters/oracledb/config.py +306 -208
- sqlspec/adapters/oracledb/core.py +319 -124
- sqlspec/adapters/oracledb/data_dictionary.py +128 -143
- sqlspec/adapters/oracledb/driver.py +554 -226
- sqlspec/adapters/oracledb/events/_hub.py +2 -4
- sqlspec/adapters/oracledb/events/backend.py +11 -5
- sqlspec/adapters/oracledb/events/store.py +7 -3
- sqlspec/adapters/oracledb/litestar/store.py +195 -193
- sqlspec/adapters/oracledb/migrations.py +61 -23
- sqlspec/adapters/oracledb/type_converter.py +12 -10
- sqlspec/adapters/psqlpy/_typing.py +23 -48
- sqlspec/adapters/psqlpy/adk/store.py +88 -83
- sqlspec/adapters/psqlpy/config.py +80 -55
- sqlspec/adapters/psqlpy/core.py +100 -68
- sqlspec/adapters/psqlpy/data_dictionary.py +53 -79
- sqlspec/adapters/psqlpy/driver.py +181 -80
- sqlspec/adapters/psqlpy/events/_hub.py +3 -9
- sqlspec/adapters/psqlpy/events/backend.py +36 -25
- sqlspec/adapters/psqlpy/events/store.py +2 -24
- sqlspec/adapters/psqlpy/litestar/store.py +14 -27
- sqlspec/adapters/psqlpy/type_converter.py +9 -30
- sqlspec/adapters/psycopg/_typing.py +12 -6
- sqlspec/adapters/psycopg/adk/store.py +17 -35
- sqlspec/adapters/psycopg/config.py +239 -163
- sqlspec/adapters/psycopg/core.py +100 -38
- sqlspec/adapters/psycopg/data_dictionary.py +89 -116
- sqlspec/adapters/psycopg/driver.py +218 -125
- sqlspec/adapters/psycopg/events/_hub.py +5 -18
- sqlspec/adapters/psycopg/events/backend.py +36 -28
- sqlspec/adapters/psycopg/events/store.py +3 -25
- sqlspec/adapters/psycopg/litestar/store.py +162 -136
- sqlspec/adapters/psycopg/type_converter.py +6 -3
- sqlspec/adapters/pymssql/_typing.py +21 -17
- sqlspec/adapters/pymssql/adk/store.py +4 -0
- sqlspec/adapters/pymssql/config.py +32 -12
- sqlspec/adapters/pymssql/core.py +58 -6
- sqlspec/adapters/pymssql/data_dictionary.py +132 -20
- sqlspec/adapters/pymssql/driver.py +56 -4
- sqlspec/adapters/pymssql/litestar/store.py +1 -1
- sqlspec/adapters/pymssql/migrations.py +13 -16
- sqlspec/adapters/pymssql/pool.py +6 -2
- sqlspec/adapters/pymysql/_typing.py +1 -2
- sqlspec/adapters/pymysql/adk/store.py +39 -24
- sqlspec/adapters/pymysql/config.py +64 -26
- sqlspec/adapters/pymysql/core.py +518 -54
- sqlspec/adapters/pymysql/driver.py +72 -68
- sqlspec/adapters/pymysql/litestar/store.py +4 -7
- sqlspec/adapters/pymysql/pool.py +20 -7
- sqlspec/adapters/spanner/_typing.py +52 -142
- sqlspec/adapters/spanner/adk/artifact_store.py +8 -13
- sqlspec/adapters/spanner/config.py +134 -40
- sqlspec/adapters/spanner/core.py +190 -29
- sqlspec/adapters/spanner/data_dictionary.py +71 -54
- sqlspec/adapters/spanner/driver.py +187 -52
- sqlspec/adapters/spanner/events/store.py +46 -11
- sqlspec/adapters/spanner/litestar/store.py +82 -53
- sqlspec/adapters/spanner/type_converter.py +55 -35
- sqlspec/adapters/sqlanywhere/__init__.py +40 -0
- sqlspec/adapters/sqlanywhere/_typing.py +118 -0
- sqlspec/adapters/sqlanywhere/adk/__init__.py +5 -0
- sqlspec/adapters/sqlanywhere/adk/store.py +880 -0
- sqlspec/adapters/sqlanywhere/config.py +235 -0
- sqlspec/adapters/sqlanywhere/core.py +404 -0
- sqlspec/adapters/sqlanywhere/data_dictionary.py +282 -0
- sqlspec/adapters/sqlanywhere/driver.py +435 -0
- sqlspec/adapters/sqlanywhere/events/__init__.py +5 -0
- sqlspec/adapters/sqlanywhere/events/store.py +28 -0
- sqlspec/adapters/sqlanywhere/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlanywhere/litestar/store.py +220 -0
- sqlspec/adapters/sqlanywhere/migrations.py +178 -0
- sqlspec/adapters/sqlanywhere/pool.py +236 -0
- sqlspec/adapters/sqlite/_typing.py +12 -3
- sqlspec/adapters/sqlite/adk/store.py +89 -17
- sqlspec/adapters/sqlite/config.py +47 -45
- sqlspec/adapters/sqlite/core.py +67 -40
- sqlspec/adapters/sqlite/data_dictionary.py +129 -19
- sqlspec/adapters/sqlite/driver.py +93 -235
- sqlspec/adapters/sqlite/litestar/__init__.py +2 -2
- sqlspec/adapters/sqlite/litestar/store.py +2 -2
- sqlspec/adapters/sqlite/pool.py +60 -12
- sqlspec/adapters/sqlite/type_converter.py +0 -3
- sqlspec/adapters/sybase/__init__.py +37 -0
- sqlspec/adapters/sybase/_typing.py +130 -0
- sqlspec/adapters/sybase/adk/__init__.py +5 -0
- sqlspec/adapters/sybase/adk/store.py +961 -0
- sqlspec/adapters/sybase/config.py +215 -0
- sqlspec/adapters/sybase/core.py +411 -0
- sqlspec/adapters/sybase/data_dictionary.py +281 -0
- sqlspec/adapters/sybase/driver.py +455 -0
- sqlspec/adapters/sybase/events/__init__.py +5 -0
- sqlspec/adapters/sybase/events/store.py +80 -0
- sqlspec/adapters/sybase/litestar/__init__.py +5 -0
- sqlspec/adapters/sybase/litestar/store.py +268 -0
- sqlspec/adapters/sybase/migrations.py +178 -0
- sqlspec/adapters/sybase/pool.py +262 -0
- sqlspec/base.py +2 -0
- sqlspec/builder/__init__.py +9 -0
- sqlspec/builder/_column.py +1 -5
- sqlspec/builder/_ddl.py +2675 -71
- sqlspec/builder/_factory.py +76 -2
- sqlspec/builder/_merge.py +1 -1
- sqlspec/builder/_parsing_utils.py +40 -5
- sqlspec/cli.py +456 -83
- sqlspec/config.py +47 -4
- sqlspec/core/__init__.py +10 -0
- sqlspec/core/cache.py +291 -3
- sqlspec/core/compiler.py +2 -1
- sqlspec/core/parameters/_declared.py +11 -0
- sqlspec/core/result/_base.py +28 -2
- sqlspec/core/sqlcommenter.py +8 -0
- sqlspec/core/statement.py +3 -2
- sqlspec/data_dictionary/__init__.py +4 -0
- sqlspec/data_dictionary/_registry.py +2 -0
- sqlspec/data_dictionary/_types.py +294 -56
- sqlspec/data_dictionary/dialects/__init__.py +4 -0
- sqlspec/data_dictionary/dialects/bigquery/config.py +33 -6
- sqlspec/data_dictionary/dialects/bigquery/sql/ddl.sql +40 -1
- sqlspec/data_dictionary/dialects/cockroachdb/__init__.py +9 -1
- sqlspec/data_dictionary/dialects/cockroachdb/config.py +22 -0
- sqlspec/data_dictionary/dialects/cockroachdb/sql/columns.sql +142 -48
- sqlspec/data_dictionary/dialects/cockroachdb/sql/constraints.sql +42 -18
- sqlspec/data_dictionary/dialects/cockroachdb/sql/foreign_keys.sql +6 -2
- sqlspec/data_dictionary/dialects/db2/sql/columns.sql +54 -22
- sqlspec/data_dictionary/dialects/db2/sql/schemas.sql +0 -4
- sqlspec/data_dictionary/dialects/db2/sql/tables.sql +0 -12
- sqlspec/data_dictionary/dialects/duckdb/sql/columns.sql +33 -18
- sqlspec/data_dictionary/dialects/duckdb/sql/ddl.sql +221 -0
- sqlspec/data_dictionary/dialects/duckdb/sql/foreign_keys.sql +10 -4
- sqlspec/data_dictionary/dialects/duckdb/sql/tables.sql +1 -0
- sqlspec/data_dictionary/dialects/duckdb/sql/types.sql +12 -0
- sqlspec/data_dictionary/dialects/mariadb/sql/columns.sql +6 -1
- sqlspec/data_dictionary/dialects/mariadb/sql/foreign_keys.sql +37 -23
- sqlspec/data_dictionary/dialects/mssql/config.py +33 -126
- sqlspec/data_dictionary/dialects/mssql/sql/columns.sql +51 -39
- sqlspec/data_dictionary/dialects/mssql/sql/constraints.sql +20 -2
- sqlspec/data_dictionary/dialects/mssql/sql/ddl.sql +40 -30
- sqlspec/data_dictionary/dialects/mysql/config.py +16 -1
- sqlspec/data_dictionary/dialects/mysql/dictionary.py +133 -66
- sqlspec/data_dictionary/dialects/mysql/sql/columns.sql +6 -1
- sqlspec/data_dictionary/dialects/mysql/sql/foreign_keys.sql +35 -21
- sqlspec/data_dictionary/dialects/mysql/sql/privileges.sql +2 -0
- sqlspec/data_dictionary/dialects/oracle/config.py +1 -1
- sqlspec/data_dictionary/dialects/oracle/sql/columns.sql +75 -18
- sqlspec/data_dictionary/dialects/oracle/sql/indexes.sql +16 -7
- sqlspec/data_dictionary/dialects/oracle/sql/version.sql +4 -6
- sqlspec/data_dictionary/dialects/postgres/__init__.py +11 -1
- sqlspec/data_dictionary/dialects/postgres/config.py +33 -0
- sqlspec/data_dictionary/dialects/postgres/sql/columns.sql +92 -31
- sqlspec/data_dictionary/dialects/postgres/sql/constraints.sql +22 -12
- sqlspec/data_dictionary/dialects/postgres/sql/ddl.sql +15 -4
- sqlspec/data_dictionary/dialects/postgres/sql/foreign_keys.sql +30 -2
- sqlspec/data_dictionary/dialects/postgres/sql/indexes.sql +14 -2
- sqlspec/data_dictionary/dialects/postgres/sql/sequences.sql +16 -2
- sqlspec/data_dictionary/dialects/postgres/sql/system.sql +1 -1
- sqlspec/data_dictionary/dialects/postgres/sql/types.sql +21 -0
- sqlspec/data_dictionary/dialects/spanner/config.py +1 -0
- sqlspec/data_dictionary/dialects/spanner/sql/columns.sql +51 -16
- sqlspec/data_dictionary/dialects/sqlanywhere/__init__.py +31 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/config.py +191 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/columns.sql +97 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/constraints.sql +43 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/foreign_keys.sql +45 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/indexes.sql +39 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/objects.sql +18 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/schemas.sql +15 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/tables.sql +86 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/version.sql +3 -0
- sqlspec/data_dictionary/dialects/sqlanywhere/sql/views.sql +15 -0
- sqlspec/data_dictionary/dialects/sqlite/__init__.py +10 -1
- sqlspec/data_dictionary/dialects/sqlite/config.py +338 -1
- sqlspec/data_dictionary/dialects/sqlite/sql/columns.sql +24 -6
- sqlspec/data_dictionary/dialects/sqlite/sql/constraints.sql +47 -6
- sqlspec/data_dictionary/dialects/sqlite/sql/ddl.sql +29 -2
- sqlspec/data_dictionary/dialects/sqlite/sql/foreign_keys.sql +10 -2
- sqlspec/data_dictionary/dialects/sqlite/sql/indexes.sql +11 -6
- sqlspec/data_dictionary/dialects/sqlite/sql/tables.sql +15 -9
- sqlspec/data_dictionary/dialects/sybase/__init__.py +31 -0
- sqlspec/data_dictionary/dialects/sybase/config.py +187 -0
- sqlspec/data_dictionary/dialects/sybase/sql/columns.sql +123 -0
- sqlspec/data_dictionary/dialects/sybase/sql/constraints.sql +95 -0
- sqlspec/data_dictionary/dialects/sybase/sql/foreign_keys.sql +77 -0
- sqlspec/data_dictionary/dialects/sybase/sql/indexes.sql +51 -0
- sqlspec/data_dictionary/dialects/sybase/sql/objects.sql +21 -0
- sqlspec/data_dictionary/dialects/sybase/sql/schemas.sql +16 -0
- sqlspec/data_dictionary/dialects/sybase/sql/tables.sql +46 -0
- sqlspec/data_dictionary/dialects/sybase/sql/version.sql +3 -0
- sqlspec/data_dictionary/dialects/sybase/sql/views.sql +15 -0
- sqlspec/dialects/__init__.py +4 -1
- sqlspec/dialects/sybase/__init__.py +115 -0
- sqlspec/dialects/sybase/_generators.py +379 -0
- sqlspec/dialects/sybase/_parsers.py +225 -0
- sqlspec/dialects/sybase/_transforms.py +68 -0
- sqlspec/driver/__init__.py +1 -1
- sqlspec/driver/_async.py +695 -37
- sqlspec/driver/_common.py +1602 -14
- sqlspec/driver/_storage_helpers.py +1289 -62
- sqlspec/driver/_sync.py +693 -37
- sqlspec/exceptions.py +2 -0
- sqlspec/extensions/adk/_table_utils.py +16 -6
- sqlspec/extensions/adk/_types.py +13 -0
- sqlspec/extensions/adk/artifact/_types.py +9 -0
- sqlspec/extensions/adk/artifact/service.py +19 -19
- sqlspec/extensions/adk/maintenance.py +3 -0
- sqlspec/extensions/adk/memory/_types.py +13 -0
- sqlspec/extensions/adk/memory/store.py +4 -2
- sqlspec/extensions/adk/migrations/0002_create_mssql_python_memory.py +4 -8
- sqlspec/extensions/adk/store.py +8 -6
- sqlspec/extensions/fastapi/extension.py +3 -1
- sqlspec/extensions/flask/_state.py +1 -1
- sqlspec/extensions/flask/extension.py +1 -1
- sqlspec/extensions/litestar/_utils.py +2 -0
- sqlspec/extensions/litestar/handlers.py +12 -9
- sqlspec/extensions/litestar/plugin.py +2 -0
- sqlspec/extensions/sanic/_state.py +3 -1
- sqlspec/extensions/sanic/_utils.py +2 -0
- sqlspec/extensions/sanic/extension.py +3 -1
- sqlspec/extensions/starlette/_state.py +3 -1
- sqlspec/extensions/starlette/_utils.py +2 -0
- sqlspec/extensions/starlette/extension.py +3 -1
- sqlspec/extensions/starlette/middleware.py +2 -0
- sqlspec/migrations/__init__.py +3 -1
- sqlspec/migrations/base.py +31 -1
- sqlspec/migrations/commands.py +1551 -514
- sqlspec/migrations/runner.py +118 -3
- sqlspec/migrations/squash.py +2066 -115
- sqlspec/migrations/templates.py +60 -5
- sqlspec/migrations/tracker.py +96 -14
- sqlspec/migrations/utils.py +4 -2
- sqlspec/migrations/validation.py +34 -35
- sqlspec/protocols.py +18 -0
- sqlspec/storage/__init__.py +3 -0
- sqlspec/storage/_arrow_payload.py +69 -8
- sqlspec/storage/_arrow_stream.py +91 -5
- sqlspec/storage/backends/fsspec.py +5 -1
- sqlspec/storage/backends/local.py +7 -2
- sqlspec/storage/backends/obstore.py +35 -11
- sqlspec/storage/pipeline.py +229 -3
- sqlspec/typing.py +2 -0
- sqlspec/utils/arrow_helpers.py +935 -24
- sqlspec/utils/dispatch.py +5 -3
- sqlspec/utils/fixtures.py +1242 -253
- sqlspec/utils/schema.py +2 -11
- {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/METADATA +75 -53
- {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/RECORD +361 -307
- {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/entry_points.txt +2 -4
- sqlspec/adapters/db2/events/config.py +0 -9
- sqlspec/adapters/db2/litestar/config.py +0 -12
- sqlspec/adapters/mysql_common.py +0 -561
- sqlspec/driver/_query_cache.py +0 -250
- {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/WHEEL +0 -0
- {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/licenses/LICENSE +0 -0
sqlspec/__main__.py
CHANGED
sqlspec/_typing.py
CHANGED
|
@@ -38,6 +38,7 @@ if TYPE_CHECKING:
|
|
|
38
38
|
from pandas import DataFrame as PandasDataFrame
|
|
39
39
|
from polars import DataFrame as PolarsDataFrame
|
|
40
40
|
from prometheus_client import Counter, Gauge, Histogram
|
|
41
|
+
from pyarrow import ArrowException
|
|
41
42
|
from pyarrow import RecordBatch as ArrowRecordBatch
|
|
42
43
|
from pyarrow import RecordBatchReader as ArrowRecordBatchReader
|
|
43
44
|
from pyarrow import Schema as ArrowSchema
|
|
@@ -67,6 +68,7 @@ __all__ = (
|
|
|
67
68
|
"UNSET",
|
|
68
69
|
"UNSET_STUB",
|
|
69
70
|
"UUID_UTILS_INSTALLED",
|
|
71
|
+
"ArrowException",
|
|
70
72
|
"ArrowRecordBatch",
|
|
71
73
|
"ArrowRecordBatchReader",
|
|
72
74
|
"ArrowRecordBatchReaderProtocol",
|
|
@@ -472,6 +474,13 @@ _ARROW_SCHEMA_SHIM = ArrowSchemaProtocol
|
|
|
472
474
|
_ARROW_RECORD_BATCH_READER_SHIM = ArrowRecordBatchReaderProtocol
|
|
473
475
|
|
|
474
476
|
|
|
477
|
+
class ArrowExceptionStubError(Exception):
|
|
478
|
+
"""Placeholder for ``pyarrow.ArrowException`` that no runtime error is an instance of."""
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
_ARROW_EXCEPTION_SHIM = ArrowExceptionStubError
|
|
482
|
+
|
|
483
|
+
|
|
475
484
|
@runtime_checkable
|
|
476
485
|
class PandasDataFrameProtocol(Protocol):
|
|
477
486
|
"""Typed shim for pandas.DataFrame."""
|
|
@@ -711,6 +720,7 @@ _CATTRS_UNSTRUCTURE_SHIM = cattrs_unstructure_stub
|
|
|
711
720
|
_CATTRS_UNSTRUCTURE_SHIM.__name__ = "cattrs_unstructure"
|
|
712
721
|
_CATTRS_UNSTRUCTURE_SHIM.__qualname__ = "cattrs_unstructure"
|
|
713
722
|
_LAZY_EXPORTS: "dict[str, tuple[str, str | None, Any]]" = {
|
|
723
|
+
"ArrowException": ("pyarrow", "ArrowException", _ARROW_EXCEPTION_SHIM),
|
|
714
724
|
"ArrowRecordBatch": ("pyarrow", "RecordBatch", _ARROW_RECORD_BATCH_SHIM),
|
|
715
725
|
"ArrowRecordBatchReader": ("pyarrow", "RecordBatchReader", _ARROW_RECORD_BATCH_READER_SHIM),
|
|
716
726
|
"ArrowSchema": ("pyarrow", "Schema", _ARROW_SCHEMA_SHIM),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""ADBC adapter for SQLSpec."""
|
|
2
2
|
|
|
3
3
|
from sqlspec.adapters.adbc._typing import AdbcConnection
|
|
4
|
-
from sqlspec.adapters.adbc.config import AdbcConfig, AdbcConnectionParams, AdbcDriverFeatures
|
|
4
|
+
from sqlspec.adapters.adbc.config import AdbcConfig, AdbcConnectionParams, AdbcDriverFeatures, AdbcPoolConfig
|
|
5
5
|
from sqlspec.adapters.adbc.driver import AdbcCursor, AdbcDriver, AdbcExceptionHandler
|
|
6
6
|
|
|
7
7
|
__all__ = (
|
|
@@ -12,4 +12,5 @@ __all__ = (
|
|
|
12
12
|
"AdbcDriver",
|
|
13
13
|
"AdbcDriverFeatures",
|
|
14
14
|
"AdbcExceptionHandler",
|
|
15
|
+
"AdbcPoolConfig",
|
|
15
16
|
)
|
sqlspec/adapters/adbc/_typing.py
CHANGED
|
@@ -7,6 +7,7 @@ compilation to avoid ABI boundary issues.
|
|
|
7
7
|
import contextlib
|
|
8
8
|
from typing import TYPE_CHECKING, Any, TypeAlias
|
|
9
9
|
|
|
10
|
+
from adbc_driver_manager import AdbcStatusCode
|
|
10
11
|
from adbc_driver_manager import Error as _AdbcNativeError
|
|
11
12
|
from adbc_driver_manager import NotSupportedError as AdbcNotSupportedError
|
|
12
13
|
from adbc_driver_manager import OperationalError as AdbcOperationalError
|
|
@@ -38,6 +39,7 @@ __all__ = (
|
|
|
38
39
|
"AdbcOperationalError",
|
|
39
40
|
"AdbcRawCursor",
|
|
40
41
|
"AdbcSessionContext",
|
|
42
|
+
"AdbcStatusCode",
|
|
41
43
|
)
|
|
42
44
|
|
|
43
45
|
|
|
@@ -75,6 +77,7 @@ class AdbcSessionContext:
|
|
|
75
77
|
"_acquire_connection",
|
|
76
78
|
"_connection",
|
|
77
79
|
"_driver",
|
|
80
|
+
"_driver_class",
|
|
78
81
|
"_driver_features",
|
|
79
82
|
"_prepare_driver",
|
|
80
83
|
"_release_connection",
|
|
@@ -88,34 +91,69 @@ class AdbcSessionContext:
|
|
|
88
91
|
statement_config: "StatementConfig",
|
|
89
92
|
driver_features: "dict[str, Any]",
|
|
90
93
|
prepare_driver: "Callable[[AdbcDriver], AdbcDriver]",
|
|
94
|
+
driver_class: "type[AdbcDriver] | None" = None,
|
|
91
95
|
) -> None:
|
|
92
96
|
self._acquire_connection = acquire_connection
|
|
93
97
|
self._release_connection = release_connection
|
|
94
98
|
self._statement_config = statement_config
|
|
95
99
|
self._driver_features = driver_features
|
|
96
100
|
self._prepare_driver = prepare_driver
|
|
101
|
+
self._driver_class = driver_class
|
|
97
102
|
self._connection: Any = None
|
|
98
103
|
self._driver: AdbcDriver | None = None
|
|
99
104
|
|
|
100
105
|
def __enter__(self) -> "AdbcDriver":
|
|
101
|
-
|
|
106
|
+
driver_class = self._driver_class
|
|
107
|
+
if driver_class is None:
|
|
108
|
+
from sqlspec.adapters.adbc.driver import AdbcDriver
|
|
109
|
+
|
|
110
|
+
driver_class = AdbcDriver
|
|
102
111
|
|
|
103
112
|
self._connection = self._acquire_connection()
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
113
|
+
try:
|
|
114
|
+
resolved_dialect = resolve_dialect_name(self._statement_config.dialect) or None
|
|
115
|
+
self._driver = driver_class(
|
|
116
|
+
connection=self._connection,
|
|
117
|
+
statement_config=self._statement_config,
|
|
118
|
+
driver_features=self._driver_features,
|
|
119
|
+
dialect=resolved_dialect,
|
|
120
|
+
)
|
|
121
|
+
return self._prepare_driver(self._driver)
|
|
122
|
+
except BaseException as exc:
|
|
123
|
+
connection = self._connection
|
|
124
|
+
driver = self._driver
|
|
125
|
+
self._connection = None
|
|
126
|
+
self._driver = None
|
|
127
|
+
if driver is not None:
|
|
128
|
+
with contextlib.suppress(BaseException):
|
|
129
|
+
driver.close_streams()
|
|
130
|
+
with contextlib.suppress(BaseException):
|
|
131
|
+
self._release_connection(
|
|
132
|
+
connection, exc_type=type(exc), exc_val=exc, exc_tb=exc.__traceback__, driver=driver
|
|
133
|
+
)
|
|
134
|
+
raise
|
|
112
135
|
|
|
113
136
|
def __exit__(
|
|
114
137
|
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
|
|
115
138
|
) -> "bool | None":
|
|
116
139
|
if self._connection is not None:
|
|
117
|
-
self.
|
|
140
|
+
connection = self._connection
|
|
141
|
+
driver = self._driver
|
|
118
142
|
self._connection = None
|
|
143
|
+
self._driver = None
|
|
144
|
+
first_error: BaseException | None = None
|
|
145
|
+
if driver is not None:
|
|
146
|
+
try:
|
|
147
|
+
driver.close_streams()
|
|
148
|
+
except BaseException as exc:
|
|
149
|
+
first_error = exc
|
|
150
|
+
try:
|
|
151
|
+
self._release_connection(connection, exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb, driver=driver)
|
|
152
|
+
except BaseException as exc:
|
|
153
|
+
if first_error is None:
|
|
154
|
+
first_error = exc
|
|
155
|
+
if exc_type is None and first_error is not None:
|
|
156
|
+
raise first_error
|
|
119
157
|
return None
|
|
120
158
|
|
|
121
159
|
|
|
@@ -8,11 +8,14 @@ from functools import lru_cache
|
|
|
8
8
|
from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast
|
|
9
9
|
|
|
10
10
|
from sqlspec.adapters.adbc.core import (
|
|
11
|
+
_DB2_INDEX_EXISTS_SQL,
|
|
12
|
+
_DB2_TABLE_EXISTS_SQL,
|
|
11
13
|
driver_kind_from_driver_name,
|
|
12
14
|
is_postgres_dialect,
|
|
13
15
|
is_shared_object_driver,
|
|
14
16
|
resolve_dialect_from_config,
|
|
15
17
|
)
|
|
18
|
+
from sqlspec.adapters.adbc.core import split_db2_table_name as _split_db2_table_name
|
|
16
19
|
from sqlspec.config import ADKConfig
|
|
17
20
|
from sqlspec.core.parameters._validator import PARAMETER_REGEX
|
|
18
21
|
from sqlspec.exceptions import ImproperConfigurationError
|
|
@@ -20,7 +23,6 @@ from sqlspec.extensions.adk import BaseSyncADKStore, StoredEvent, StoredSession,
|
|
|
20
23
|
from sqlspec.extensions.adk.memory.store import BaseSyncADKMemoryStore
|
|
21
24
|
from sqlspec.utils.logging import get_logger
|
|
22
25
|
from sqlspec.utils.serializers import from_json, to_json
|
|
23
|
-
from sqlspec.utils.text import normalize_identifier, split_qualified_identifier
|
|
24
26
|
|
|
25
27
|
if TYPE_CHECKING:
|
|
26
28
|
from collections.abc import Sequence
|
|
@@ -49,7 +51,7 @@ class AdbcADKConfig(ADKConfig):
|
|
|
49
51
|
"""Vector index type for PostgreSQL. Defaults to 'hnsw'."""
|
|
50
52
|
|
|
51
53
|
scann_num_leaves: NotRequired[int]
|
|
52
|
-
"""Number of leaves for ScaNN index on PostgreSQL. Defaults to
|
|
54
|
+
"""Number of leaves for ScaNN index on PostgreSQL. Defaults to 100."""
|
|
53
55
|
|
|
54
56
|
scann_quantizer: NotRequired[Literal["SQ8", "FP32"]]
|
|
55
57
|
"""Quantizer for ScaNN index on PostgreSQL. Defaults to 'SQ8'."""
|
|
@@ -224,6 +226,7 @@ class AdbcADKStore(BaseSyncADKStore["AdbcConfig"]):
|
|
|
224
226
|
"""Set a metadata value."""
|
|
225
227
|
self._set_metadata(key, value)
|
|
226
228
|
|
|
229
|
+
@property
|
|
227
230
|
def dialect(self) -> str:
|
|
228
231
|
"""Return the detected database dialect."""
|
|
229
232
|
return self._dialect
|
|
@@ -2194,7 +2197,23 @@ class AdbcADKMemoryStore(BaseSyncADKMemoryStore["AdbcConfig"]):
|
|
|
2194
2197
|
with self._config.provide_connection() as conn:
|
|
2195
2198
|
cursor = conn.cursor()
|
|
2196
2199
|
try:
|
|
2197
|
-
|
|
2200
|
+
entries_to_insert = entries
|
|
2201
|
+
if not use_returning:
|
|
2202
|
+
event_ids = [entry["event_id"] for entry in entries if "event_id" in entry]
|
|
2203
|
+
if event_ids:
|
|
2204
|
+
placeholders = ", ".join("?" for _ in event_ids)
|
|
2205
|
+
select_sql = f"SELECT event_id FROM {self._memory_table} WHERE event_id IN ({placeholders})"
|
|
2206
|
+
self._execute(cursor, select_sql, tuple(event_ids))
|
|
2207
|
+
existing_rows = cursor.fetchall()
|
|
2208
|
+
existing_event_ids = {row[0] for row in existing_rows}
|
|
2209
|
+
entries_to_insert = []
|
|
2210
|
+
for entry in entries:
|
|
2211
|
+
event_id = entry["event_id"]
|
|
2212
|
+
if event_id not in existing_event_ids:
|
|
2213
|
+
entries_to_insert.append(entry)
|
|
2214
|
+
existing_event_ids.add(event_id)
|
|
2215
|
+
|
|
2216
|
+
for entry in entries_to_insert:
|
|
2198
2217
|
content_json = self._serialize_json_field(entry["content_json"])
|
|
2199
2218
|
metadata_json = self._serialize_json_field(entry.get("metadata_json"))
|
|
2200
2219
|
raw_emb = entry.get("embedding")
|
|
@@ -2272,19 +2291,25 @@ class AdbcADKMemoryStore(BaseSyncADKMemoryStore["AdbcConfig"]):
|
|
|
2272
2291
|
else:
|
|
2273
2292
|
try:
|
|
2274
2293
|
self._execute(cursor, sql, params)
|
|
2275
|
-
inserted_count += 1
|
|
2276
2294
|
except Exception as exc:
|
|
2277
|
-
|
|
2278
|
-
if (
|
|
2279
|
-
"
|
|
2280
|
-
or "
|
|
2281
|
-
or "duplicate" in
|
|
2282
|
-
or "ora-00001" in
|
|
2283
|
-
or "sql0803n" in
|
|
2284
|
-
or "23505" in exc_str
|
|
2295
|
+
error_message = str(exc).lower()
|
|
2296
|
+
if not (
|
|
2297
|
+
getattr(exc, "sqlstate", None) == "23505"
|
|
2298
|
+
or "unique" in error_message
|
|
2299
|
+
or "duplicate" in error_message
|
|
2300
|
+
or "ora-00001" in error_message
|
|
2301
|
+
or "sql0803n" in error_message
|
|
2285
2302
|
):
|
|
2286
|
-
|
|
2287
|
-
|
|
2303
|
+
raise
|
|
2304
|
+
self._execute(
|
|
2305
|
+
cursor,
|
|
2306
|
+
f"SELECT event_id FROM {self._memory_table} WHERE event_id = ?",
|
|
2307
|
+
(entry["event_id"],),
|
|
2308
|
+
)
|
|
2309
|
+
if cursor.fetchone() is None:
|
|
2310
|
+
raise
|
|
2311
|
+
continue
|
|
2312
|
+
inserted_count += 1
|
|
2288
2313
|
conn.commit()
|
|
2289
2314
|
except Exception:
|
|
2290
2315
|
with contextlib.suppress(Exception):
|
|
@@ -2622,15 +2647,6 @@ def decode_adbc_pgvector(raw_embedding: Any) -> "list[float] | None":
|
|
|
2622
2647
|
return [float(v) for v in raw_embedding]
|
|
2623
2648
|
|
|
2624
2649
|
|
|
2625
|
-
_DB2_TABLE_EXISTS_SQL: Final = (
|
|
2626
|
-
"SELECT 1 FROM SYSCAT.TABLES WHERE TABSCHEMA = COALESCE(CAST(? AS VARCHAR(128)), CURRENT SCHEMA) AND TABNAME = ?"
|
|
2627
|
-
)
|
|
2628
|
-
_DB2_INDEX_EXISTS_SQL: Final = (
|
|
2629
|
-
"SELECT 1 FROM SYSCAT.INDEXES WHERE INDSCHEMA = COALESCE(CAST(? AS VARCHAR(128)), CURRENT SCHEMA) AND INDNAME = ?"
|
|
2630
|
-
)
|
|
2631
|
-
_MIN_QUALIFIED_PARTS: Final = 2
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
2650
|
@lru_cache(maxsize=256)
|
|
2635
2651
|
def _postgresql_store_sql(sql: str) -> str:
|
|
2636
2652
|
"""Cache positional SQL conversion without changing quoted or commented text."""
|
|
@@ -2669,13 +2685,6 @@ def _metadata_key_column(dialect: str) -> str:
|
|
|
2669
2685
|
return "key"
|
|
2670
2686
|
|
|
2671
2687
|
|
|
2672
|
-
def _split_db2_table_name(table_name: str) -> "tuple[str | None, str]":
|
|
2673
|
-
parts = [part.strip() for part in split_qualified_identifier(table_name, quote_chars='"') if part.strip()]
|
|
2674
|
-
if len(parts) >= _MIN_QUALIFIED_PARTS:
|
|
2675
|
-
return normalize_identifier(parts[-2], "db2"), normalize_identifier(parts[-1], "db2")
|
|
2676
|
-
return None, normalize_identifier(parts[0] if parts else table_name, "db2")
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
2688
|
def _db2_table_exists(cursor: Any, table_name: str) -> bool:
|
|
2680
2689
|
schema_name, catalog_table = _split_db2_table_name(table_name)
|
|
2681
2690
|
cursor.execute(_DB2_TABLE_EXISTS_SQL, (schema_name, catalog_table))
|