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.
Files changed (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,352 @@
1
+ """Spanner configuration."""
2
+
3
+ from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast
4
+
5
+ from google.cloud.spanner_v1 import Client
6
+ from google.cloud.spanner_v1.pool import AbstractSessionPool, FixedSizePool
7
+ from typing_extensions import NotRequired
8
+
9
+ from sqlspec.adapters.spanner._typing import SpannerConnection
10
+ from sqlspec.adapters.spanner.core import apply_driver_features, default_statement_config
11
+ from sqlspec.adapters.spanner.driver import SpannerSessionContext, SpannerSyncDriver
12
+ from sqlspec.config import SyncDatabaseConfig
13
+ from sqlspec.exceptions import ImproperConfigurationError
14
+ from sqlspec.extensions.events import EventRuntimeHints
15
+ from sqlspec.utils.config_tools import normalize_connection_config, reject_pool_aliases
16
+ from sqlspec.utils.type_guards import supports_close
17
+
18
+ if TYPE_CHECKING:
19
+ from collections.abc import Callable
20
+
21
+ from google.auth.credentials import Credentials
22
+ from google.cloud.spanner_v1.database import Database
23
+
24
+ from sqlspec.config import ExtensionConfigs
25
+ from sqlspec.core import StatementConfig
26
+ from sqlspec.observability import ObservabilityConfig
27
+
28
+ __all__ = ("SpannerConnectionParams", "SpannerDriverFeatures", "SpannerPoolParams", "SpannerSyncConfig")
29
+
30
+
31
+ class SpannerConnectionParams(TypedDict):
32
+ """Spanner connection parameters."""
33
+
34
+ project: "NotRequired[str]"
35
+ instance_id: "NotRequired[str]"
36
+ database_id: "NotRequired[str]"
37
+ credentials: "NotRequired[Credentials]"
38
+ client_options: "NotRequired[dict[str, Any]]"
39
+ extra: "NotRequired[dict[str, Any]]"
40
+
41
+
42
+ class SpannerPoolParams(SpannerConnectionParams):
43
+ """Session pool configuration."""
44
+
45
+ pool_type: "NotRequired[type[AbstractSessionPool]]"
46
+ min_sessions: "NotRequired[int]"
47
+ max_sessions: "NotRequired[int]"
48
+ labels: "NotRequired[dict[str, str]]"
49
+ ping_interval: "NotRequired[int]"
50
+
51
+
52
+ class SpannerDriverFeatures(TypedDict):
53
+ """Driver feature flags for Spanner.
54
+
55
+ Attributes:
56
+ enable_uuid_conversion: Enable automatic UUID string conversion.
57
+ json_serializer: Custom JSON serializer for parameter conversion.
58
+ json_deserializer: Custom JSON deserializer for result conversion.
59
+ session_labels: Labels to apply to Spanner sessions.
60
+ enable_events: Enable database event channel support.
61
+ Defaults to True when extension_config["events"] is configured.
62
+ events_backend: Backend type for event handling.
63
+ Spanner only supports "table_queue" (no native pub/sub).
64
+ """
65
+
66
+ enable_uuid_conversion: "NotRequired[bool]"
67
+ json_serializer: "NotRequired[Callable[[Any], str]]"
68
+ json_deserializer: "NotRequired[Callable[[str], Any]]"
69
+ session_labels: "NotRequired[dict[str, str]]"
70
+ enable_events: "NotRequired[bool]"
71
+ events_backend: "NotRequired[str]"
72
+
73
+
74
+ class SpannerConnectionContext:
75
+ """Context manager for Spanner connections."""
76
+
77
+ __slots__ = ("_config", "_connection", "_session", "_transaction")
78
+
79
+ def __init__(self, config: "SpannerSyncConfig", transaction: bool = False) -> None:
80
+ self._config = config
81
+ self._transaction = transaction
82
+ self._connection: SpannerConnection | None = None
83
+ self._session: Any = None
84
+
85
+ def __enter__(self) -> SpannerConnection:
86
+ database = self._config.get_database()
87
+ if self._transaction:
88
+ self._session = cast("Any", database).session()
89
+ self._session.create()
90
+ try:
91
+ txn = self._session.transaction()
92
+ txn.__enter__()
93
+ self._connection = cast("SpannerConnection", txn)
94
+ except Exception:
95
+ self._session.delete()
96
+ raise
97
+ else:
98
+ return self._connection
99
+ else:
100
+ self._session = cast("Any", database).snapshot(multi_use=True)
101
+ self._connection = cast("SpannerConnection", self._session.__enter__())
102
+ return self._connection
103
+
104
+ def __exit__(
105
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
106
+ ) -> bool | None:
107
+ if self._transaction and self._connection:
108
+ txn = cast("Any", self._connection)
109
+ try:
110
+ if exc_type is None:
111
+ try:
112
+ txn_id = txn._transaction_id
113
+ except AttributeError:
114
+ txn_id = None
115
+ try:
116
+ committed = txn.committed
117
+ except AttributeError:
118
+ committed = None
119
+ if txn_id is not None and committed is None:
120
+ txn.commit()
121
+ else:
122
+ try:
123
+ rollback_txn_id = txn._transaction_id
124
+ except AttributeError:
125
+ rollback_txn_id = None
126
+ if rollback_txn_id is not None:
127
+ txn.rollback()
128
+ finally:
129
+ if self._session:
130
+ self._session.delete()
131
+ elif self._session:
132
+ self._session.__exit__(exc_type, exc_val, exc_tb)
133
+
134
+ self._connection = None
135
+ self._session = None
136
+ return None
137
+
138
+
139
+ class _SpannerSessionConnectionHandler:
140
+ __slots__ = ("_connection_ctx",)
141
+
142
+ def __init__(self, connection_ctx: "SpannerConnectionContext") -> None:
143
+ self._connection_ctx = connection_ctx
144
+
145
+ def acquire_connection(self) -> "SpannerConnection":
146
+ return self._connection_ctx.__enter__()
147
+
148
+ def release_connection(
149
+ self,
150
+ _conn: "SpannerConnection",
151
+ exc_type: "type[BaseException] | None",
152
+ exc_val: "BaseException | None",
153
+ exc_tb: Any,
154
+ ) -> None:
155
+ self._connection_ctx.__exit__(exc_type, exc_val, exc_tb)
156
+
157
+
158
+ class SpannerSyncConfig(SyncDatabaseConfig["SpannerConnection", "AbstractSessionPool", SpannerSyncDriver]):
159
+ """Spanner configuration and session management."""
160
+
161
+ driver_type: ClassVar[type["SpannerSyncDriver"]] = SpannerSyncDriver
162
+ connection_type: ClassVar[type["SpannerConnection"]] = cast("type[SpannerConnection]", SpannerConnection)
163
+ supports_transactional_ddl: ClassVar[bool] = False
164
+ supports_native_arrow_export: ClassVar[bool] = True
165
+ supports_native_arrow_import: ClassVar[bool] = True
166
+ supports_native_parquet_export: ClassVar[bool] = False
167
+ supports_native_parquet_import: ClassVar[bool] = False
168
+ requires_staging_for_load: ClassVar[bool] = False
169
+
170
+ def __init__(
171
+ self,
172
+ *,
173
+ connection_config: "SpannerPoolParams | dict[str, Any] | None" = None,
174
+ connection_instance: "AbstractSessionPool | None" = None,
175
+ migration_config: "dict[str, Any] | None" = None,
176
+ statement_config: "StatementConfig | None" = None,
177
+ driver_features: "SpannerDriverFeatures | dict[str, Any] | None" = None,
178
+ bind_key: "str | None" = None,
179
+ extension_config: "ExtensionConfigs | None" = None,
180
+ observability_config: "ObservabilityConfig | None" = None,
181
+ **kwargs: Any,
182
+ ) -> None:
183
+ reject_pool_aliases(kwargs)
184
+
185
+ self.connection_config = normalize_connection_config(connection_config)
186
+
187
+ self.connection_config.setdefault("min_sessions", 1)
188
+ self.connection_config.setdefault("max_sessions", 10)
189
+ self.connection_config.setdefault("pool_type", FixedSizePool)
190
+
191
+ driver_features = apply_driver_features(driver_features)
192
+
193
+ statement_config = statement_config or default_statement_config
194
+
195
+ super().__init__(
196
+ connection_config=self.connection_config,
197
+ connection_instance=connection_instance,
198
+ migration_config=migration_config,
199
+ statement_config=statement_config,
200
+ driver_features=driver_features,
201
+ bind_key=bind_key,
202
+ extension_config=extension_config,
203
+ observability_config=observability_config,
204
+ **kwargs,
205
+ )
206
+
207
+ self._client: Client | None = None
208
+ self._database: Database | None = None
209
+
210
+ def _get_client(self) -> Client:
211
+ if self._client is None:
212
+ self._client = Client(
213
+ project=self.connection_config.get("project"),
214
+ credentials=self.connection_config.get("credentials"),
215
+ client_options=self.connection_config.get("client_options"),
216
+ )
217
+ return self._client
218
+
219
+ def get_database(self) -> "Database":
220
+ instance_id = self.connection_config.get("instance_id")
221
+ database_id = self.connection_config.get("database_id")
222
+ if not instance_id or not database_id:
223
+ msg = "instance_id and database_id are required."
224
+ raise ImproperConfigurationError(msg)
225
+
226
+ if self.connection_instance is None:
227
+ self.connection_instance = self.provide_pool()
228
+
229
+ if self._database is None:
230
+ client = self._get_client()
231
+ self._database = client.instance(instance_id).database(database_id, pool=self.connection_instance) # type: ignore[no-untyped-call]
232
+ return self._database
233
+
234
+ def create_connection(self) -> SpannerConnection:
235
+ instance_id = self.connection_config.get("instance_id")
236
+ database_id = self.connection_config.get("database_id")
237
+ if not instance_id or not database_id:
238
+ msg = "instance_id and database_id are required."
239
+ raise ImproperConfigurationError(msg)
240
+
241
+ if self.connection_instance is None:
242
+ self.connection_instance = self.provide_pool()
243
+
244
+ client = self._get_client()
245
+ database = client.instance(instance_id).database(database_id, pool=self.connection_instance) # type: ignore[no-untyped-call]
246
+ return cast("SpannerConnection", database.snapshot())
247
+
248
+ def _create_pool(self) -> AbstractSessionPool:
249
+ instance_id = self.connection_config.get("instance_id")
250
+ database_id = self.connection_config.get("database_id")
251
+ if not instance_id or not database_id:
252
+ msg = "instance_id and database_id are required."
253
+ raise ImproperConfigurationError(msg)
254
+
255
+ pool_type = cast("type[AbstractSessionPool]", self.connection_config.get("pool_type", FixedSizePool))
256
+
257
+ pool_kwargs: dict[str, Any] = {}
258
+ if pool_type is FixedSizePool:
259
+ if "size" in self.connection_config:
260
+ pool_kwargs["size"] = self.connection_config["size"]
261
+ elif "max_sessions" in self.connection_config:
262
+ pool_kwargs["size"] = self.connection_config["max_sessions"]
263
+ if "labels" in self.connection_config:
264
+ pool_kwargs["labels"] = self.connection_config["labels"]
265
+ else:
266
+ valid_pool_keys = {"size", "labels", "ping_interval"}
267
+ pool_kwargs = {k: v for k, v in self.connection_config.items() if k in valid_pool_keys and v is not None}
268
+ if "size" not in pool_kwargs and "max_sessions" in self.connection_config:
269
+ pool_kwargs["size"] = self.connection_config["max_sessions"]
270
+
271
+ pool_factory = cast("Callable[..., AbstractSessionPool]", pool_type)
272
+ return pool_factory(**pool_kwargs)
273
+
274
+ def _close_pool(self) -> None:
275
+ if self.connection_instance and supports_close(self.connection_instance):
276
+ self.connection_instance.close()
277
+
278
+ def provide_connection(self, *args: Any, transaction: "bool" = False, **kwargs: Any) -> "SpannerConnectionContext":
279
+ """Yield a Snapshot (default) or Transaction context from the configured pool.
280
+
281
+ Args:
282
+ *args: Additional positional arguments (unused, for interface compatibility).
283
+ transaction: If True, yields a Transaction context that supports
284
+ execute_update() for DML statements. If False (default), yields
285
+ a read-only Snapshot context for SELECT queries.
286
+ **kwargs: Additional keyword arguments (unused, for interface compatibility).
287
+ """
288
+ return SpannerConnectionContext(self, transaction=transaction)
289
+
290
+ def provide_session(
291
+ self, *args: Any, statement_config: "StatementConfig | None" = None, transaction: "bool" = False, **kwargs: Any
292
+ ) -> "SpannerSessionContext":
293
+ """Provide a Spanner driver session context manager.
294
+
295
+ Args:
296
+ *args: Additional arguments.
297
+ statement_config: Optional statement configuration override.
298
+ transaction: Whether to use a transaction.
299
+ **kwargs: Additional keyword arguments.
300
+
301
+ Returns:
302
+ A Spanner driver session context manager.
303
+ """
304
+ connection_ctx = SpannerConnectionContext(self, transaction=transaction)
305
+ handler = _SpannerSessionConnectionHandler(connection_ctx)
306
+
307
+ return SpannerSessionContext(
308
+ acquire_connection=handler.acquire_connection,
309
+ release_connection=handler.release_connection,
310
+ statement_config=statement_config or self.statement_config or default_statement_config,
311
+ driver_features=self.driver_features,
312
+ prepare_driver=self._prepare_driver,
313
+ )
314
+
315
+ def provide_write_session(
316
+ self, *args: Any, statement_config: "StatementConfig | None" = None, **kwargs: Any
317
+ ) -> "SpannerSessionContext":
318
+ """Provide a Spanner driver write session context manager.
319
+
320
+ Args:
321
+ *args: Additional arguments.
322
+ statement_config: Optional statement configuration override.
323
+ **kwargs: Additional keyword arguments.
324
+
325
+ Returns:
326
+ A Spanner driver write session context manager.
327
+ """
328
+ return self.provide_session(*args, statement_config=statement_config, transaction=True, **kwargs)
329
+
330
+ def get_signature_namespace(self) -> "dict[str, Any]":
331
+ """Get the signature namespace for SpannerSyncConfig types.
332
+
333
+ Returns:
334
+ Dictionary mapping type names to types.
335
+ """
336
+ namespace = super().get_signature_namespace()
337
+ namespace.update({
338
+ "SpannerConnectionContext": SpannerConnectionContext,
339
+ "SpannerConnection": SpannerConnection,
340
+ "SpannerConnectionParams": SpannerConnectionParams,
341
+ "SpannerDriverFeatures": SpannerDriverFeatures,
342
+ "SpannerPoolParams": SpannerPoolParams,
343
+ "SpannerSessionContext": SpannerSessionContext,
344
+ "SpannerSyncConfig": SpannerSyncConfig,
345
+ "SpannerSyncDriver": SpannerSyncDriver,
346
+ })
347
+ return namespace
348
+
349
+ def get_event_runtime_hints(self) -> "EventRuntimeHints":
350
+ """Return queue defaults for Spanner JSON handling."""
351
+
352
+ return EventRuntimeHints(json_passthrough=True)
@@ -0,0 +1,188 @@
1
+ """Spanner adapter compiled helpers."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from google.api_core import exceptions as api_exceptions
6
+
7
+ from sqlspec.adapters.spanner.type_converter import coerce_params_for_spanner, infer_spanner_param_types
8
+ from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
9
+ from sqlspec.exceptions import (
10
+ DatabaseConnectionError,
11
+ NotFoundError,
12
+ OperationalError,
13
+ SQLParsingError,
14
+ SQLSpecError,
15
+ UniqueViolationError,
16
+ )
17
+ from sqlspec.utils.arrow_helpers import convert_dict_to_arrow
18
+ from sqlspec.utils.serializers import from_json, to_json
19
+
20
+ if TYPE_CHECKING:
21
+ from collections.abc import Callable, Mapping, Sequence
22
+
23
+ from sqlspec.typing import ArrowRecordBatch, ArrowRecordBatchReader, ArrowReturnFormat, ArrowTable
24
+
25
+ __all__ = (
26
+ "apply_driver_features",
27
+ "build_profile",
28
+ "build_statement_config",
29
+ "coerce_params",
30
+ "collect_rows",
31
+ "create_arrow_data",
32
+ "create_mapped_exception",
33
+ "default_statement_config",
34
+ "driver_profile",
35
+ "infer_param_types",
36
+ "supports_batch_update",
37
+ "supports_write",
38
+ )
39
+
40
+
41
+ def build_profile() -> "DriverParameterProfile":
42
+ """Create the Spanner driver parameter profile."""
43
+
44
+ return DriverParameterProfile(
45
+ name="Spanner",
46
+ default_style=ParameterStyle.NAMED_AT,
47
+ supported_styles={ParameterStyle.NAMED_AT},
48
+ default_execution_style=ParameterStyle.NAMED_AT,
49
+ supported_execution_styles={ParameterStyle.NAMED_AT},
50
+ has_native_list_expansion=True,
51
+ json_serializer_strategy="none",
52
+ default_dialect="spanner",
53
+ preserve_parameter_format=True,
54
+ needs_static_script_compilation=False,
55
+ allow_mixed_parameter_styles=False,
56
+ preserve_original_params_for_many=True,
57
+ custom_type_coercions=None,
58
+ extras={},
59
+ )
60
+
61
+
62
+ driver_profile = build_profile()
63
+
64
+
65
+ def build_statement_config() -> StatementConfig:
66
+ """Construct the Spanner statement configuration."""
67
+ profile = driver_profile
68
+ return build_statement_config_from_profile(profile, statement_overrides={"dialect": "spanner"})
69
+
70
+
71
+ default_statement_config = build_statement_config()
72
+
73
+
74
+ def apply_driver_features(driver_features: "Mapping[str, Any] | None") -> "dict[str, Any]":
75
+ """Apply Spanner driver feature defaults."""
76
+ processed_features: dict[str, Any] = dict(driver_features) if driver_features else {}
77
+ processed_features.setdefault("enable_uuid_conversion", True)
78
+ processed_features.setdefault("json_serializer", to_json)
79
+ processed_features.setdefault("json_deserializer", from_json)
80
+ return processed_features
81
+
82
+
83
+ def supports_write(cursor: Any) -> bool:
84
+ """Return True when the cursor supports DML execution."""
85
+ try:
86
+ _ = cursor.execute_update
87
+ except AttributeError:
88
+ return False
89
+ return True
90
+
91
+
92
+ def supports_batch_update(cursor: Any) -> bool:
93
+ """Return True when the cursor supports batch updates."""
94
+ try:
95
+ _ = cursor.batch_update
96
+ except AttributeError:
97
+ return False
98
+ return True
99
+
100
+
101
+ def infer_param_types(params: "dict[str, Any] | list[Any] | tuple[Any, ...] | None") -> "dict[str, Any]":
102
+ """Infer Spanner param_types from Python values."""
103
+ if not isinstance(params, dict):
104
+ return {}
105
+ return infer_spanner_param_types(params)
106
+
107
+
108
+ def coerce_params(
109
+ params: "dict[str, Any] | list[Any] | tuple[Any, ...] | None",
110
+ *,
111
+ json_serializer: "Callable[[Any], str] | None" = None,
112
+ ) -> "dict[str, Any] | None":
113
+ """Coerce Python types to Spanner-compatible formats."""
114
+ if not isinstance(params, dict):
115
+ return None
116
+ return coerce_params_for_spanner(params, json_serializer=json_serializer)
117
+
118
+
119
+ def collect_rows(
120
+ rows: "Sequence[Any]", fields: "Sequence[Any]", converter: Any
121
+ ) -> "tuple[list[dict[str, Any]], list[str]]":
122
+ """Collect Spanner rows into dictionaries.
123
+
124
+ Args:
125
+ rows: Rows from result set.
126
+ fields: Result set fields metadata.
127
+ converter: Type converter for row values.
128
+
129
+ Returns:
130
+ Tuple of (rows, column_names).
131
+ """
132
+ column_names = [field.name for field in fields]
133
+ data: list[dict[str, Any]] = []
134
+ for row in rows:
135
+ item: dict[str, Any] = {}
136
+ for index, column in enumerate(column_names):
137
+ item[column] = converter.convert_if_detected(row[index])
138
+ data.append(item)
139
+ return data, column_names
140
+
141
+
142
+ def create_arrow_data(
143
+ data: "list[dict[str, Any]]", return_format: "ArrowReturnFormat"
144
+ ) -> "ArrowTable | ArrowRecordBatch | ArrowRecordBatchReader | list[ArrowRecordBatch]":
145
+ """Create Arrow data from Spanner row dictionaries.
146
+
147
+ Args:
148
+ data: Row dictionaries from Spanner results.
149
+ return_format: Arrow return format.
150
+
151
+ Returns:
152
+ Arrow data in the requested format.
153
+ """
154
+ return convert_dict_to_arrow(data, return_format=return_format)
155
+
156
+
157
+ def _create_spanner_error(error: Any, error_class: type[SQLSpecError], description: str) -> SQLSpecError:
158
+ """Create a Spanner error instance without raising it."""
159
+ msg = f"Spanner {description}: {error}"
160
+ exc = error_class(msg)
161
+ exc.__cause__ = error
162
+ return exc
163
+
164
+
165
+ def create_mapped_exception(error: Any) -> SQLSpecError:
166
+ """Map Spanner exceptions to SQLSpec exceptions.
167
+
168
+ This is a factory function that returns an exception instance rather than
169
+ raising. This pattern is more robust for use in __exit__ handlers and
170
+ avoids issues with exception control flow in different Python versions.
171
+
172
+ Args:
173
+ error: The Spanner exception to map
174
+
175
+ Returns:
176
+ A SQLSpec exception that wraps the original error
177
+ """
178
+ if isinstance(error, api_exceptions.AlreadyExists):
179
+ return _create_spanner_error(error, UniqueViolationError, "resource already exists")
180
+ if isinstance(error, api_exceptions.NotFound):
181
+ return _create_spanner_error(error, NotFoundError, "resource not found")
182
+ if isinstance(error, api_exceptions.InvalidArgument):
183
+ return _create_spanner_error(error, SQLParsingError, "invalid query or argument")
184
+ if isinstance(error, api_exceptions.PermissionDenied):
185
+ return _create_spanner_error(error, DatabaseConnectionError, "permission denied")
186
+ if isinstance(error, (api_exceptions.ServiceUnavailable, api_exceptions.TooManyRequests)):
187
+ return _create_spanner_error(error, OperationalError, "service unavailable or rate limited")
188
+ return _create_spanner_error(error, SQLSpecError, "error")
@@ -0,0 +1,120 @@
1
+ """Spanner metadata queries using INFORMATION_SCHEMA."""
2
+
3
+ from typing import TYPE_CHECKING, ClassVar
4
+
5
+ from mypy_extensions import mypyc_attr
6
+
7
+ from sqlspec.driver import SyncDataDictionaryBase
8
+ from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
9
+
10
+ __all__ = ("SpannerDataDictionary",)
11
+
12
+ if TYPE_CHECKING:
13
+ from sqlspec.adapters.spanner.driver import SpannerSyncDriver
14
+
15
+
16
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
17
+ class SpannerDataDictionary(SyncDataDictionaryBase):
18
+ """Fetch table, column, and index metadata from Spanner."""
19
+
20
+ dialect: ClassVar[str] = "spanner"
21
+
22
+ def __init__(self) -> None:
23
+ super().__init__()
24
+
25
+ def get_version(self, driver: "SpannerSyncDriver") -> "VersionInfo | None":
26
+ """Get Spanner version information.
27
+
28
+ Args:
29
+ driver: Spanner driver instance.
30
+
31
+ Returns:
32
+ None since Spanner does not expose version information.
33
+
34
+ """
35
+ _ = driver
36
+ return None
37
+
38
+ def get_feature_flag(self, driver: "SpannerSyncDriver", feature: str) -> bool:
39
+ """Check if Spanner supports a specific feature.
40
+
41
+ Args:
42
+ driver: Spanner driver instance.
43
+ feature: Feature name to check.
44
+
45
+ Returns:
46
+ True if feature is supported, False otherwise.
47
+
48
+ """
49
+ _ = driver
50
+ return self.resolve_feature_flag(feature, None)
51
+
52
+ def get_optimal_type(self, driver: "SpannerSyncDriver", type_category: str) -> str:
53
+ """Get optimal Spanner type for a category.
54
+
55
+ Args:
56
+ driver: Spanner driver instance.
57
+ type_category: Type category.
58
+
59
+ Returns:
60
+ Spanner-specific type name.
61
+
62
+ """
63
+ _ = driver
64
+ return self.get_dialect_config().get_optimal_type(type_category)
65
+
66
+ def get_tables(self, driver: "SpannerSyncDriver", schema: "str | None" = None) -> "list[TableMetadata]":
67
+ """Get tables using INFORMATION_SCHEMA."""
68
+ schema_name = self.resolve_schema(schema)
69
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
70
+ return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata)
71
+
72
+ def get_columns(
73
+ self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None
74
+ ) -> "list[ColumnMetadata]":
75
+ """Get column information for a table or schema."""
76
+ schema_name = self.resolve_schema(schema)
77
+ if table is None:
78
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
79
+ return driver.select(
80
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
81
+ )
82
+
83
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
84
+ return driver.select(
85
+ self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata
86
+ )
87
+
88
+ def get_indexes(
89
+ self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None
90
+ ) -> "list[IndexMetadata]":
91
+ """Get index metadata for a table or schema."""
92
+ schema_name = self.resolve_schema(schema)
93
+ if table is None:
94
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
95
+ return driver.select(
96
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
97
+ )
98
+
99
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
100
+ return driver.select(
101
+ self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata
102
+ )
103
+
104
+ def get_foreign_keys(
105
+ self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None
106
+ ) -> "list[ForeignKeyMetadata]":
107
+ """Get foreign key metadata."""
108
+ schema_name = self.resolve_schema(schema)
109
+ if table is None:
110
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
111
+ return driver.select(
112
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
113
+ )
114
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
115
+ return driver.select(
116
+ self.get_query("foreign_keys_by_table"),
117
+ table_name=table,
118
+ schema_name=schema_name,
119
+ schema_type=ForeignKeyMetadata,
120
+ )
@@ -0,0 +1,6 @@
1
+ """Spanner dialect submodule."""
2
+
3
+ from sqlspec.adapters.spanner.dialect._spangres import Spangres
4
+ from sqlspec.adapters.spanner.dialect._spanner import Spanner
5
+
6
+ __all__ = ("Spangres", "Spanner")