sqlspec 0.47.0__cp314-cp314-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
  2. sqlspec/__init__.py +167 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_typing.py +714 -0
  6. sqlspec/adapters/__init__.py +0 -0
  7. sqlspec/adapters/adbc/__init__.py +13 -0
  8. sqlspec/adapters/adbc/_typing.py +106 -0
  9. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  10. sqlspec/adapters/adbc/adk/store.py +1280 -0
  11. sqlspec/adapters/adbc/config.py +378 -0
  12. sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
  13. sqlspec/adapters/adbc/core.py +922 -0
  14. sqlspec/adapters/adbc/data_dictionary.py +339 -0
  15. sqlspec/adapters/adbc/driver.py +534 -0
  16. sqlspec/adapters/adbc/events/__init__.py +5 -0
  17. sqlspec/adapters/adbc/events/store.py +285 -0
  18. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  19. sqlspec/adapters/adbc/litestar/store.py +534 -0
  20. sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
  21. sqlspec/adapters/adbc/type_converter.py +142 -0
  22. sqlspec/adapters/aiomysql/__init__.py +21 -0
  23. sqlspec/adapters/aiomysql/_typing.py +137 -0
  24. sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
  25. sqlspec/adapters/aiomysql/adk/store.py +678 -0
  26. sqlspec/adapters/aiomysql/config.py +305 -0
  27. sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
  28. sqlspec/adapters/aiomysql/core.py +536 -0
  29. sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
  30. sqlspec/adapters/aiomysql/driver.py +386 -0
  31. sqlspec/adapters/aiomysql/events/__init__.py +5 -0
  32. sqlspec/adapters/aiomysql/events/store.py +104 -0
  33. sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
  34. sqlspec/adapters/aiomysql/litestar/store.py +314 -0
  35. sqlspec/adapters/aiosqlite/__init__.py +26 -0
  36. sqlspec/adapters/aiosqlite/_typing.py +109 -0
  37. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  38. sqlspec/adapters/aiosqlite/adk/store.py +829 -0
  39. sqlspec/adapters/aiosqlite/config.py +315 -0
  40. sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
  41. sqlspec/adapters/aiosqlite/core.py +315 -0
  42. sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
  43. sqlspec/adapters/aiosqlite/driver.py +311 -0
  44. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  45. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  46. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  47. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  48. sqlspec/adapters/aiosqlite/pool.cp314-win_amd64.pyd +0 -0
  49. sqlspec/adapters/aiosqlite/pool.py +734 -0
  50. sqlspec/adapters/asyncmy/__init__.py +21 -0
  51. sqlspec/adapters/asyncmy/_typing.py +113 -0
  52. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncmy/adk/store.py +644 -0
  54. sqlspec/adapters/asyncmy/config.py +307 -0
  55. sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
  56. sqlspec/adapters/asyncmy/core.py +538 -0
  57. sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
  58. sqlspec/adapters/asyncmy/driver.py +391 -0
  59. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  60. sqlspec/adapters/asyncmy/events/store.py +104 -0
  61. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  62. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  63. sqlspec/adapters/asyncpg/__init__.py +26 -0
  64. sqlspec/adapters/asyncpg/_typing.py +103 -0
  65. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  66. sqlspec/adapters/asyncpg/adk/store.py +483 -0
  67. sqlspec/adapters/asyncpg/config.py +575 -0
  68. sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
  69. sqlspec/adapters/asyncpg/core.py +480 -0
  70. sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
  71. sqlspec/adapters/asyncpg/driver.py +487 -0
  72. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  73. sqlspec/adapters/asyncpg/events/_hub.py +181 -0
  74. sqlspec/adapters/asyncpg/events/backend.py +210 -0
  75. sqlspec/adapters/asyncpg/events/store.py +40 -0
  76. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  77. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  78. sqlspec/adapters/bigquery/__init__.py +15 -0
  79. sqlspec/adapters/bigquery/_typing.py +108 -0
  80. sqlspec/adapters/bigquery/config.py +362 -0
  81. sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
  82. sqlspec/adapters/bigquery/core.py +768 -0
  83. sqlspec/adapters/bigquery/data_dictionary.py +120 -0
  84. sqlspec/adapters/bigquery/driver.py +542 -0
  85. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  86. sqlspec/adapters/bigquery/events/store.py +139 -0
  87. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  88. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  89. sqlspec/adapters/bigquery/type_converter.cp314-win_amd64.pyd +0 -0
  90. sqlspec/adapters/bigquery/type_converter.py +107 -0
  91. sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
  92. sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
  93. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  94. sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
  95. sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
  96. sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
  97. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  98. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
  99. sqlspec/adapters/cockroach_asyncpg/driver.py +142 -0
  100. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  101. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  102. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  103. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  104. sqlspec/adapters/cockroach_psycopg/__init__.py +39 -0
  105. sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
  106. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  107. sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
  108. sqlspec/adapters/cockroach_psycopg/config.py +511 -0
  109. sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
  110. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  111. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
  112. sqlspec/adapters/cockroach_psycopg/driver.py +273 -0
  113. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  114. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  115. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  116. sqlspec/adapters/cockroach_psycopg/litestar/store.py +327 -0
  117. sqlspec/adapters/duckdb/__init__.py +29 -0
  118. sqlspec/adapters/duckdb/_typing.py +104 -0
  119. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  120. sqlspec/adapters/duckdb/adk/store.py +935 -0
  121. sqlspec/adapters/duckdb/config.py +386 -0
  122. sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
  123. sqlspec/adapters/duckdb/core.py +332 -0
  124. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  125. sqlspec/adapters/duckdb/driver.py +426 -0
  126. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  127. sqlspec/adapters/duckdb/events/store.py +57 -0
  128. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  129. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  130. sqlspec/adapters/duckdb/pool.cp314-win_amd64.pyd +0 -0
  131. sqlspec/adapters/duckdb/pool.py +350 -0
  132. sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
  133. sqlspec/adapters/duckdb/type_converter.py +118 -0
  134. sqlspec/adapters/mysqlconnector/__init__.py +39 -0
  135. sqlspec/adapters/mysqlconnector/_typing.py +186 -0
  136. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  137. sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
  138. sqlspec/adapters/mysqlconnector/config.py +421 -0
  139. sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
  140. sqlspec/adapters/mysqlconnector/core.py +472 -0
  141. sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
  142. sqlspec/adapters/mysqlconnector/driver.py +516 -0
  143. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  144. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  145. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  146. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  147. sqlspec/adapters/oracledb/__init__.py +39 -0
  148. sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
  149. sqlspec/adapters/oracledb/_json_handlers.py +196 -0
  150. sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
  151. sqlspec/adapters/oracledb/_param_types.py +46 -0
  152. sqlspec/adapters/oracledb/_typing.py +258 -0
  153. sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
  154. sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
  155. sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
  156. sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
  157. sqlspec/adapters/oracledb/adk/__init__.py +21 -0
  158. sqlspec/adapters/oracledb/adk/store.py +2453 -0
  159. sqlspec/adapters/oracledb/config.py +575 -0
  160. sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
  161. sqlspec/adapters/oracledb/core.py +820 -0
  162. sqlspec/adapters/oracledb/data_dictionary.py +404 -0
  163. sqlspec/adapters/oracledb/driver.py +1277 -0
  164. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  165. sqlspec/adapters/oracledb/events/_hub.py +345 -0
  166. sqlspec/adapters/oracledb/events/backend.py +300 -0
  167. sqlspec/adapters/oracledb/events/store.py +420 -0
  168. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  169. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  170. sqlspec/adapters/oracledb/migrations.py +539 -0
  171. sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
  172. sqlspec/adapters/oracledb/type_converter.py +211 -0
  173. sqlspec/adapters/psqlpy/__init__.py +18 -0
  174. sqlspec/adapters/psqlpy/_typing.py +121 -0
  175. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  176. sqlspec/adapters/psqlpy/adk/store.py +591 -0
  177. sqlspec/adapters/psqlpy/config.py +376 -0
  178. sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
  179. sqlspec/adapters/psqlpy/core.py +694 -0
  180. sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
  181. sqlspec/adapters/psqlpy/driver.py +411 -0
  182. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  183. sqlspec/adapters/psqlpy/events/_hub.py +204 -0
  184. sqlspec/adapters/psqlpy/events/backend.py +210 -0
  185. sqlspec/adapters/psqlpy/events/store.py +20 -0
  186. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  187. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  188. sqlspec/adapters/psqlpy/type_converter.cp314-win_amd64.pyd +0 -0
  189. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  190. sqlspec/adapters/psycopg/__init__.py +38 -0
  191. sqlspec/adapters/psycopg/_typing.py +218 -0
  192. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  193. sqlspec/adapters/psycopg/adk/store.py +1106 -0
  194. sqlspec/adapters/psycopg/config.py +695 -0
  195. sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
  196. sqlspec/adapters/psycopg/core.py +520 -0
  197. sqlspec/adapters/psycopg/data_dictionary.py +278 -0
  198. sqlspec/adapters/psycopg/driver.py +1033 -0
  199. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  200. sqlspec/adapters/psycopg/events/_hub.py +388 -0
  201. sqlspec/adapters/psycopg/events/backend.py +398 -0
  202. sqlspec/adapters/psycopg/events/store.py +42 -0
  203. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  204. sqlspec/adapters/psycopg/litestar/store.py +554 -0
  205. sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
  206. sqlspec/adapters/psycopg/type_converter.py +93 -0
  207. sqlspec/adapters/pymysql/__init__.py +21 -0
  208. sqlspec/adapters/pymysql/_typing.py +92 -0
  209. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  210. sqlspec/adapters/pymysql/adk/store.py +657 -0
  211. sqlspec/adapters/pymysql/config.py +176 -0
  212. sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
  213. sqlspec/adapters/pymysql/core.py +469 -0
  214. sqlspec/adapters/pymysql/data_dictionary.py +120 -0
  215. sqlspec/adapters/pymysql/driver.py +271 -0
  216. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  217. sqlspec/adapters/pymysql/events/store.py +50 -0
  218. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  219. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  220. sqlspec/adapters/pymysql/pool.cp314-win_amd64.pyd +0 -0
  221. sqlspec/adapters/pymysql/pool.py +184 -0
  222. sqlspec/adapters/spanner/__init__.py +33 -0
  223. sqlspec/adapters/spanner/_typing.py +102 -0
  224. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  225. sqlspec/adapters/spanner/adk/store.py +758 -0
  226. sqlspec/adapters/spanner/config.py +355 -0
  227. sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
  228. sqlspec/adapters/spanner/core.py +263 -0
  229. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  230. sqlspec/adapters/spanner/driver.py +407 -0
  231. sqlspec/adapters/spanner/events/__init__.py +5 -0
  232. sqlspec/adapters/spanner/events/store.py +187 -0
  233. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  234. sqlspec/adapters/spanner/litestar/store.py +291 -0
  235. sqlspec/adapters/spanner/type_converter.cp314-win_amd64.pyd +0 -0
  236. sqlspec/adapters/spanner/type_converter.py +342 -0
  237. sqlspec/adapters/sqlite/__init__.py +19 -0
  238. sqlspec/adapters/sqlite/_typing.py +123 -0
  239. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  240. sqlspec/adapters/sqlite/adk/store.py +992 -0
  241. sqlspec/adapters/sqlite/config.py +240 -0
  242. sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
  243. sqlspec/adapters/sqlite/core.py +357 -0
  244. sqlspec/adapters/sqlite/data_dictionary.py +198 -0
  245. sqlspec/adapters/sqlite/driver.py +527 -0
  246. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  247. sqlspec/adapters/sqlite/events/store.py +20 -0
  248. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  249. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  250. sqlspec/adapters/sqlite/pool.cp314-win_amd64.pyd +0 -0
  251. sqlspec/adapters/sqlite/pool.py +237 -0
  252. sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
  253. sqlspec/adapters/sqlite/type_converter.py +114 -0
  254. sqlspec/base.py +832 -0
  255. sqlspec/builder/__init__.py +181 -0
  256. sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
  257. sqlspec/builder/_base.py +1071 -0
  258. sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
  259. sqlspec/builder/_column.py +521 -0
  260. sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
  261. sqlspec/builder/_ddl.py +1691 -0
  262. sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
  263. sqlspec/builder/_delete.py +95 -0
  264. sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
  265. sqlspec/builder/_dml.py +386 -0
  266. sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
  267. sqlspec/builder/_explain.py +579 -0
  268. sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
  269. sqlspec/builder/_expression_wrappers.py +46 -0
  270. sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
  271. sqlspec/builder/_factory.py +1884 -0
  272. sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
  273. sqlspec/builder/_insert.py +405 -0
  274. sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
  275. sqlspec/builder/_join.py +489 -0
  276. sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
  277. sqlspec/builder/_merge.py +823 -0
  278. sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
  279. sqlspec/builder/_parsing_utils.py +295 -0
  280. sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
  281. sqlspec/builder/_select.py +1666 -0
  282. sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
  283. sqlspec/builder/_temporal.py +167 -0
  284. sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
  285. sqlspec/builder/_update.py +173 -0
  286. sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
  287. sqlspec/builder/_vector_distance.py +330 -0
  288. sqlspec/cli.py +1095 -0
  289. sqlspec/config.py +2383 -0
  290. sqlspec/core/__init__.py +372 -0
  291. sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
  292. sqlspec/core/_correlation.py +176 -0
  293. sqlspec/core/_pagination.py +42 -0
  294. sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
  295. sqlspec/core/_pool.py +76 -0
  296. sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
  297. sqlspec/core/cache.py +1085 -0
  298. sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
  299. sqlspec/core/compiler.py +1090 -0
  300. sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
  301. sqlspec/core/config_runtime.py +174 -0
  302. sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
  303. sqlspec/core/explain.py +275 -0
  304. sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
  305. sqlspec/core/filters.py +969 -0
  306. sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
  307. sqlspec/core/hashing.py +266 -0
  308. sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
  309. sqlspec/core/metrics.py +83 -0
  310. sqlspec/core/parameters/__init__.py +72 -0
  311. sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
  312. sqlspec/core/parameters/_alignment.py +283 -0
  313. sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
  314. sqlspec/core/parameters/_converter.py +554 -0
  315. sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
  316. sqlspec/core/parameters/_processor.py +1182 -0
  317. sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
  318. sqlspec/core/parameters/_registry.py +206 -0
  319. sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
  320. sqlspec/core/parameters/_transformers.py +324 -0
  321. sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
  322. sqlspec/core/parameters/_types.py +536 -0
  323. sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
  324. sqlspec/core/parameters/_validator.py +171 -0
  325. sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
  326. sqlspec/core/pipeline.py +333 -0
  327. sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
  328. sqlspec/core/query_modifiers.py +508 -0
  329. sqlspec/core/result/__init__.py +25 -0
  330. sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
  331. sqlspec/core/result/_base.py +1232 -0
  332. sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
  333. sqlspec/core/result/_io.py +28 -0
  334. sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
  335. sqlspec/core/splitter.py +1021 -0
  336. sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
  337. sqlspec/core/sqlcommenter.py +249 -0
  338. sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
  339. sqlspec/core/stack.py +163 -0
  340. sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
  341. sqlspec/core/statement.py +1865 -0
  342. sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
  343. sqlspec/core/type_converter.py +340 -0
  344. sqlspec/data_dictionary/__init__.py +22 -0
  345. sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
  346. sqlspec/data_dictionary/_loader.py +138 -0
  347. sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
  348. sqlspec/data_dictionary/_registry.py +74 -0
  349. sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
  350. sqlspec/data_dictionary/_types.py +121 -0
  351. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  352. sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
  353. sqlspec/data_dictionary/dialects/bigquery.py +81 -0
  354. sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
  355. sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
  356. sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
  357. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  358. sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
  359. sqlspec/data_dictionary/dialects/mysql.py +53 -0
  360. sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
  361. sqlspec/data_dictionary/dialects/oracle.py +197 -0
  362. sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
  363. sqlspec/data_dictionary/dialects/postgres.py +69 -0
  364. sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
  365. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  366. sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
  367. sqlspec/data_dictionary/dialects/sqlite.py +59 -0
  368. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  369. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  370. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  371. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  372. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  373. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  374. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  375. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  376. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  377. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  378. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  379. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  380. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  381. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  382. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  383. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  384. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  385. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  386. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  387. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  388. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  389. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  390. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  391. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  392. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  393. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  394. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  395. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  396. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  397. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  398. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  399. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  400. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  401. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  402. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  403. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  404. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  405. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  406. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  407. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  408. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  409. sqlspec/dialects/__init__.py +22 -0
  410. sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
  411. sqlspec/dialects/_compat.py +14 -0
  412. sqlspec/dialects/postgres/__init__.py +9 -0
  413. sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
  414. sqlspec/dialects/postgres/_generators.py +57 -0
  415. sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
  416. sqlspec/dialects/postgres/_operators.py +81 -0
  417. sqlspec/dialects/postgres/_paradedb.py +50 -0
  418. sqlspec/dialects/postgres/_pgvector.py +36 -0
  419. sqlspec/dialects/spanner/__init__.py +6 -0
  420. sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
  421. sqlspec/dialects/spanner/_generators.py +206 -0
  422. sqlspec/dialects/spanner/_spangres.py +77 -0
  423. sqlspec/dialects/spanner/_spanner.py +179 -0
  424. sqlspec/driver/__init__.py +49 -0
  425. sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
  426. sqlspec/driver/_async.py +1830 -0
  427. sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
  428. sqlspec/driver/_common.py +2292 -0
  429. sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
  430. sqlspec/driver/_exception_handler.py +108 -0
  431. sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
  432. sqlspec/driver/_query_cache.py +96 -0
  433. sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
  434. sqlspec/driver/_sql_helpers.py +139 -0
  435. sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
  436. sqlspec/driver/_storage_helpers.py +153 -0
  437. sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
  438. sqlspec/driver/_sync.py +1817 -0
  439. sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
  440. sqlspec/exceptions.py +480 -0
  441. sqlspec/extensions/__init__.py +0 -0
  442. sqlspec/extensions/adk/__init__.py +84 -0
  443. sqlspec/extensions/adk/_config_utils.py +199 -0
  444. sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
  445. sqlspec/extensions/adk/_types.py +41 -0
  446. sqlspec/extensions/adk/artifact/__init__.py +57 -0
  447. sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
  448. sqlspec/extensions/adk/artifact/_types.py +32 -0
  449. sqlspec/extensions/adk/artifact/service.py +508 -0
  450. sqlspec/extensions/adk/artifact/store.py +361 -0
  451. sqlspec/extensions/adk/converters.py +212 -0
  452. sqlspec/extensions/adk/memory/__init__.py +69 -0
  453. sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
  454. sqlspec/extensions/adk/memory/_types.py +30 -0
  455. sqlspec/extensions/adk/memory/converters.py +225 -0
  456. sqlspec/extensions/adk/memory/service.py +316 -0
  457. sqlspec/extensions/adk/memory/store.py +525 -0
  458. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
  459. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  460. sqlspec/extensions/adk/service.py +279 -0
  461. sqlspec/extensions/adk/store.py +590 -0
  462. sqlspec/extensions/events/__init__.py +51 -0
  463. sqlspec/extensions/events/_channel.py +703 -0
  464. sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
  465. sqlspec/extensions/events/_hints.py +45 -0
  466. sqlspec/extensions/events/_models.py +23 -0
  467. sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
  468. sqlspec/extensions/events/_payload.py +69 -0
  469. sqlspec/extensions/events/_protocols.py +134 -0
  470. sqlspec/extensions/events/_queue.py +462 -0
  471. sqlspec/extensions/events/_store.py +209 -0
  472. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  473. sqlspec/extensions/events/migrations/__init__.py +3 -0
  474. sqlspec/extensions/fastapi/__init__.py +22 -0
  475. sqlspec/extensions/fastapi/extension.py +391 -0
  476. sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
  477. sqlspec/extensions/fastapi/providers.py +712 -0
  478. sqlspec/extensions/flask/__init__.py +38 -0
  479. sqlspec/extensions/flask/_state.py +87 -0
  480. sqlspec/extensions/flask/_utils.py +71 -0
  481. sqlspec/extensions/flask/extension.py +539 -0
  482. sqlspec/extensions/litestar/__init__.py +31 -0
  483. sqlspec/extensions/litestar/_utils.py +52 -0
  484. sqlspec/extensions/litestar/channels.py +165 -0
  485. sqlspec/extensions/litestar/cli.py +102 -0
  486. sqlspec/extensions/litestar/config.py +90 -0
  487. sqlspec/extensions/litestar/handlers.py +316 -0
  488. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  489. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  490. sqlspec/extensions/litestar/plugin.py +1066 -0
  491. sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
  492. sqlspec/extensions/litestar/providers.py +784 -0
  493. sqlspec/extensions/litestar/store.py +298 -0
  494. sqlspec/extensions/otel/__init__.py +58 -0
  495. sqlspec/extensions/prometheus/__init__.py +113 -0
  496. sqlspec/extensions/sanic/__init__.py +19 -0
  497. sqlspec/extensions/sanic/_state.py +43 -0
  498. sqlspec/extensions/sanic/_utils.py +127 -0
  499. sqlspec/extensions/sanic/extension.py +647 -0
  500. sqlspec/extensions/starlette/__init__.py +22 -0
  501. sqlspec/extensions/starlette/_state.py +42 -0
  502. sqlspec/extensions/starlette/_utils.py +96 -0
  503. sqlspec/extensions/starlette/extension.py +374 -0
  504. sqlspec/extensions/starlette/middleware.py +281 -0
  505. sqlspec/loader.cp314-win_amd64.pyd +0 -0
  506. sqlspec/loader.py +727 -0
  507. sqlspec/migrations/__init__.py +39 -0
  508. sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
  509. sqlspec/migrations/base.py +862 -0
  510. sqlspec/migrations/commands.py +2151 -0
  511. sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
  512. sqlspec/migrations/context.py +157 -0
  513. sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
  514. sqlspec/migrations/fix.py +204 -0
  515. sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
  516. sqlspec/migrations/loaders.py +443 -0
  517. sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
  518. sqlspec/migrations/runner.py +1195 -0
  519. sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
  520. sqlspec/migrations/squash.py +490 -0
  521. sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
  522. sqlspec/migrations/templates.py +234 -0
  523. sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
  524. sqlspec/migrations/tracker.py +792 -0
  525. sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
  526. sqlspec/migrations/utils.py +256 -0
  527. sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
  528. sqlspec/migrations/validation.py +359 -0
  529. sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
  530. sqlspec/migrations/version.py +446 -0
  531. sqlspec/observability/__init__.py +57 -0
  532. sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
  533. sqlspec/observability/_common.py +77 -0
  534. sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
  535. sqlspec/observability/_config.py +364 -0
  536. sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
  537. sqlspec/observability/_diagnostics.py +74 -0
  538. sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
  539. sqlspec/observability/_dispatcher.py +200 -0
  540. sqlspec/observability/_formatters/__init__.py +13 -0
  541. sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
  542. sqlspec/observability/_formatters/_aws.py +102 -0
  543. sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
  544. sqlspec/observability/_formatters/_azure.py +96 -0
  545. sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
  546. sqlspec/observability/_formatters/_base.py +57 -0
  547. sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
  548. sqlspec/observability/_formatters/_gcp.py +131 -0
  549. sqlspec/observability/_formatting.py +58 -0
  550. sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
  551. sqlspec/observability/_observer.py +361 -0
  552. sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
  553. sqlspec/observability/_runtime.py +461 -0
  554. sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
  555. sqlspec/observability/_sampling.py +188 -0
  556. sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
  557. sqlspec/observability/_spans.py +161 -0
  558. sqlspec/protocols.py +955 -0
  559. sqlspec/py.typed +0 -0
  560. sqlspec/service.py +433 -0
  561. sqlspec/storage/__init__.py +48 -0
  562. sqlspec/storage/_arrow_payload.py +68 -0
  563. sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
  564. sqlspec/storage/_paths.py +58 -0
  565. sqlspec/storage/_utils.py +46 -0
  566. sqlspec/storage/backends/__init__.py +1 -0
  567. sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
  568. sqlspec/storage/backends/base.py +374 -0
  569. sqlspec/storage/backends/fsspec.py +574 -0
  570. sqlspec/storage/backends/local.py +468 -0
  571. sqlspec/storage/backends/obstore.py +956 -0
  572. sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
  573. sqlspec/storage/errors.py +102 -0
  574. sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
  575. sqlspec/storage/pipeline.py +628 -0
  576. sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
  577. sqlspec/storage/registry.py +329 -0
  578. sqlspec/typing.py +405 -0
  579. sqlspec/utils/__init__.py +7 -0
  580. sqlspec/utils/arrow_helpers.py +384 -0
  581. sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
  582. sqlspec/utils/config_tools.py +314 -0
  583. sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
  584. sqlspec/utils/correlation.py +134 -0
  585. sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
  586. sqlspec/utils/deprecation.py +157 -0
  587. sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
  588. sqlspec/utils/dispatch.py +101 -0
  589. sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
  590. sqlspec/utils/fixtures.py +260 -0
  591. sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
  592. sqlspec/utils/logging.py +251 -0
  593. sqlspec/utils/module_loader.py +306 -0
  594. sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
  595. sqlspec/utils/portal.py +377 -0
  596. sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
  597. sqlspec/utils/schema.py +1040 -0
  598. sqlspec/utils/serializers/__init__.py +30 -0
  599. sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
  600. sqlspec/utils/serializers/_json.py +415 -0
  601. sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
  602. sqlspec/utils/serializers/_numpy.py +65 -0
  603. sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
  604. sqlspec/utils/serializers/_schema.py +285 -0
  605. sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
  606. sqlspec/utils/singleton.py +41 -0
  607. sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
  608. sqlspec/utils/sync_tools.py +316 -0
  609. sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
  610. sqlspec/utils/text.py +109 -0
  611. sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
  612. sqlspec/utils/type_converters.py +216 -0
  613. sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
  614. sqlspec/utils/type_guards.py +1508 -0
  615. sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
  616. sqlspec/utils/uuids.py +241 -0
  617. sqlspec-0.47.0.dist-info/METADATA +202 -0
  618. sqlspec-0.47.0.dist-info/RECORD +621 -0
  619. sqlspec-0.47.0.dist-info/WHEEL +4 -0
  620. sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
  621. sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
@@ -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,407 @@
1
+ """Spanner driver implementation."""
2
+
3
+ from collections.abc import Iterator
4
+ from typing import TYPE_CHECKING, Any, Protocol, cast
5
+
6
+ from google.api_core import exceptions as api_exceptions
7
+ from google.cloud.spanner_v1.transaction import Transaction
8
+
9
+ from sqlspec.adapters.spanner._typing import SpannerSessionContext, SpannerSyncCursor
10
+ from sqlspec.adapters.spanner.core import (
11
+ build_param_type_signature,
12
+ coerce_params,
13
+ collect_rows,
14
+ create_arrow_data,
15
+ create_mapped_exception,
16
+ default_statement_config,
17
+ driver_profile,
18
+ infer_param_types,
19
+ resolve_column_names,
20
+ supports_batch_update,
21
+ supports_write,
22
+ )
23
+ from sqlspec.adapters.spanner.data_dictionary import SpannerDataDictionary
24
+ from sqlspec.adapters.spanner.type_converter import SpannerOutputConverter
25
+ from sqlspec.core import StatementConfig, create_arrow_result, register_driver_profile
26
+ from sqlspec.driver import BaseSyncExceptionHandler, ExecutionResult, SyncDriverAdapterBase
27
+ from sqlspec.exceptions import SQLConversionError
28
+ from sqlspec.utils.serializers import from_json
29
+
30
+ if TYPE_CHECKING:
31
+ from collections.abc import Callable
32
+
33
+ from sqlglot.dialects.dialect import DialectType
34
+
35
+ from sqlspec.adapters.spanner._typing import SpannerConnection
36
+ from sqlspec.core import ArrowResult
37
+ from sqlspec.core.statement import SQL
38
+ from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
39
+ from sqlspec.typing import ArrowReturnFormat
40
+
41
+ __all__ = (
42
+ "SpannerDataDictionary",
43
+ "SpannerExceptionHandler",
44
+ "SpannerSessionContext",
45
+ "SpannerSyncCursor",
46
+ "SpannerSyncDriver",
47
+ )
48
+
49
+
50
+ class _SpannerResultSetProtocol(Protocol):
51
+ metadata: Any
52
+
53
+ def __iter__(self) -> Iterator[Any]: ...
54
+
55
+
56
+ class _SpannerReadProtocol(Protocol):
57
+ def execute_sql(
58
+ self, sql: str, params: "dict[str, Any] | None" = None, param_types: "dict[str, Any] | None" = None
59
+ ) -> _SpannerResultSetProtocol: ...
60
+
61
+
62
+ class _SpannerWriteProtocol(_SpannerReadProtocol, Protocol):
63
+ committed: "Any | None"
64
+
65
+ def execute_update(
66
+ self, sql: str, params: "dict[str, Any] | None" = None, param_types: "dict[str, Any] | None" = None
67
+ ) -> int: ...
68
+
69
+ def batch_update(
70
+ self, batch: "list[tuple[str, dict[str, Any] | None, dict[str, Any]]]"
71
+ ) -> "tuple[Any, list[int]]": ...
72
+
73
+ def commit(self) -> None: ...
74
+
75
+ def rollback(self) -> None: ...
76
+
77
+
78
+ class SpannerExceptionHandler(BaseSyncExceptionHandler):
79
+ """Map Spanner client exceptions to SQLSpec exceptions.
80
+
81
+ Uses deferred exception pattern for mypyc compatibility: exceptions
82
+ are stored in pending_exception rather than raised from __exit__
83
+ to avoid ABI boundary violations with compiled code.
84
+ """
85
+
86
+ __slots__ = ()
87
+
88
+ def _handle_exception(self, exc_type: "type[BaseException] | None", exc_val: "BaseException") -> bool:
89
+ if exc_type is None:
90
+ return False
91
+
92
+ if isinstance(exc_val, api_exceptions.GoogleAPICallError):
93
+ self.pending_exception = create_mapped_exception(exc_val)
94
+ return True
95
+ return False
96
+
97
+
98
+ class SpannerSyncDriver(SyncDriverAdapterBase):
99
+ """Synchronous Spanner driver operating on Snapshot or Transaction contexts."""
100
+
101
+ dialect: "DialectType" = "spanner"
102
+ __slots__ = ("_column_name_cache", "_data_dictionary", "_type_converter")
103
+
104
+ def __init__(
105
+ self,
106
+ connection: "SpannerConnection",
107
+ statement_config: "StatementConfig | None" = None,
108
+ driver_features: "dict[str, Any] | None" = None,
109
+ ) -> None:
110
+ features = dict(driver_features) if driver_features else {}
111
+ if statement_config is None:
112
+ statement_config = default_statement_config
113
+
114
+ super().__init__(connection=connection, statement_config=statement_config, driver_features=features)
115
+
116
+ json_deserializer = features.get("json_deserializer")
117
+ self._type_converter = SpannerOutputConverter(
118
+ enable_uuid_conversion=features.get("enable_uuid_conversion", True),
119
+ json_deserializer=cast("Callable[[str], Any]", json_deserializer or from_json),
120
+ )
121
+ self._column_name_cache: dict[int, tuple[Any, list[str]]] = {}
122
+ self._data_dictionary: SpannerDataDictionary | None = None
123
+
124
+ # ─────────────────────────────────────────────────────────────────────────────
125
+ # CORE DISPATCH METHODS - The Execution Engine
126
+ # ─────────────────────────────────────────────────────────────────────────────
127
+
128
+ def dispatch_execute(self, cursor: "SpannerConnection", statement: "SQL") -> ExecutionResult:
129
+ sql, params = self._get_compiled_sql(statement, self.statement_config)
130
+ params = cast("dict[str, Any] | None", params)
131
+ coerced_params = self._coerce_params(params)
132
+ param_types_map = self._infer_param_types(coerced_params)
133
+
134
+ if statement.returns_rows():
135
+ reader = cast("_SpannerReadProtocol", cursor)
136
+ result_set = reader.execute_sql(sql, params=coerced_params, param_types=param_types_map)
137
+ rows = list(result_set)
138
+ try:
139
+ metadata = result_set.metadata
140
+ row_type = metadata.row_type
141
+ fields = row_type.fields
142
+ except AttributeError:
143
+ fields = None
144
+ if not fields:
145
+ msg = "Result set metadata not available."
146
+ raise SQLConversionError(msg)
147
+ column_names = self._resolve_column_names(fields)
148
+ data, column_names = collect_rows(rows, fields, self._type_converter, column_names=column_names)
149
+ return self.create_execution_result(
150
+ cursor,
151
+ selected_data=data,
152
+ column_names=column_names,
153
+ data_row_count=len(data),
154
+ is_select_result=True,
155
+ row_format="tuple",
156
+ )
157
+
158
+ if supports_write(cursor):
159
+ writer = cast("_SpannerWriteProtocol", cursor)
160
+ row_count = writer.execute_update(sql, params=coerced_params, param_types=param_types_map)
161
+ return self.create_execution_result(cursor, rowcount_override=row_count)
162
+
163
+ msg = "Cannot execute DML in a read-only Snapshot context."
164
+ raise SQLConversionError(msg)
165
+
166
+ def dispatch_execute_many(self, cursor: "SpannerConnection", statement: "SQL") -> ExecutionResult:
167
+ if not supports_batch_update(cursor):
168
+ msg = "execute_many requires a Transaction context"
169
+ raise SQLConversionError(msg)
170
+
171
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
172
+
173
+ if not prepared_parameters or not isinstance(prepared_parameters, list):
174
+ msg = "execute_many requires at least one parameter set"
175
+ raise SQLConversionError(msg)
176
+
177
+ coerce_params = self._coerce_params
178
+ infer_param_types = self._infer_param_types
179
+ param_types_cache: dict[tuple[tuple[str, type[Any]], ...], dict[str, Any]] = {}
180
+ empty_param_types: dict[str, Any] = {}
181
+ batch_args: list[tuple[str, dict[str, Any] | None, dict[str, Any]]] = []
182
+ append_batch_arg = batch_args.append
183
+ for params in prepared_parameters:
184
+ coerced_params = coerce_params(cast("dict[str, Any] | None", params))
185
+ if not coerced_params:
186
+ append_batch_arg((sql, {}, empty_param_types))
187
+ continue
188
+ signature = build_param_type_signature(coerced_params)
189
+ param_types = param_types_cache.get(signature)
190
+ if param_types is None:
191
+ param_types = infer_param_types(coerced_params)
192
+ param_types_cache[signature] = param_types
193
+ append_batch_arg((sql, coerced_params, param_types))
194
+
195
+ writer = cast("_SpannerWriteProtocol", cursor)
196
+ _status, row_counts = writer.batch_update(batch_args)
197
+ total_rows = sum(row_counts) if row_counts else 0
198
+
199
+ return self.create_execution_result(cursor, rowcount_override=total_rows, is_many_result=True)
200
+
201
+ def dispatch_execute_script(self, cursor: "SpannerConnection", statement: "SQL") -> ExecutionResult:
202
+ sql, params = self._get_compiled_sql(statement, self.statement_config)
203
+ statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
204
+ is_transaction = supports_write(cursor)
205
+ reader = cast("_SpannerReadProtocol", cursor)
206
+
207
+ count = 0
208
+ script_params = cast("dict[str, Any] | None", params)
209
+ for stmt in statements:
210
+ is_select = stmt.upper().strip().startswith("SELECT")
211
+ coerced_params = self._coerce_params(script_params)
212
+ if not is_select and not is_transaction:
213
+ msg = "Cannot execute DML in a read-only Snapshot context."
214
+ raise SQLConversionError(msg)
215
+ if not is_select and is_transaction:
216
+ writer = cast("_SpannerWriteProtocol", cursor)
217
+ writer.execute_update(stmt, params=coerced_params, param_types=self._infer_param_types(coerced_params))
218
+ else:
219
+ _ = list(
220
+ reader.execute_sql(stmt, params=coerced_params, param_types=self._infer_param_types(coerced_params))
221
+ )
222
+ count += 1
223
+
224
+ return self.create_execution_result(
225
+ cursor, statement_count=count, successful_statements=count, is_script_result=True
226
+ )
227
+
228
+ # ─────────────────────────────────────────────────────────────────────────────
229
+ # TRANSACTION MANAGEMENT
230
+ # ─────────────────────────────────────────────────────────────────────────────
231
+
232
+ def begin(self) -> None:
233
+ return None
234
+
235
+ def commit(self) -> None:
236
+ if isinstance(self.connection, Transaction):
237
+ writer = cast("_SpannerWriteProtocol", self.connection)
238
+ if writer.committed is not None:
239
+ return
240
+ writer.commit()
241
+
242
+ def rollback(self) -> None:
243
+ if isinstance(self.connection, Transaction):
244
+ writer = cast("_SpannerWriteProtocol", self.connection)
245
+ writer.rollback()
246
+
247
+ def with_cursor(self, connection: "SpannerConnection") -> "SpannerSyncCursor":
248
+ return SpannerSyncCursor(connection)
249
+
250
+ def handle_database_exceptions(self) -> "SpannerExceptionHandler":
251
+ return SpannerExceptionHandler()
252
+
253
+ # ─────────────────────────────────────────────────────────────────────────────
254
+ # ARROW API METHODS
255
+ # ─────────────────────────────────────────────────────────────────────────────
256
+
257
+ def select_to_arrow(self, statement: "Any", /, *parameters: "Any", **kwargs: Any) -> "ArrowResult":
258
+ result = self.execute(statement, *parameters, **kwargs)
259
+
260
+ return_format = cast("ArrowReturnFormat", kwargs.get("return_format", "table"))
261
+ arrow_data = create_arrow_data(result.get_data(), return_format)
262
+ return create_arrow_result(result.statement, arrow_data, rows_affected=result.rows_affected)
263
+
264
+ # ─────────────────────────────────────────────────────────────────────────────
265
+ # STORAGE API METHODS
266
+ # ─────────────────────────────────────────────────────────────────────────────
267
+
268
+ def select_to_storage(
269
+ self,
270
+ statement: "SQL | str",
271
+ destination: "StorageDestination",
272
+ /,
273
+ *parameters: Any,
274
+ statement_config: "StatementConfig | None" = None,
275
+ partitioner: "dict[str, object] | None" = None,
276
+ format_hint: "StorageFormat | None" = None,
277
+ telemetry: "StorageTelemetry | None" = None,
278
+ **kwargs: Any,
279
+ ) -> "StorageBridgeJob":
280
+ """Execute query and stream Arrow results to storage."""
281
+ self._require_capability("arrow_export_enabled")
282
+ arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
283
+ sync_pipeline = self._storage_pipeline()
284
+ telemetry_payload = self._write_result_to_storage_sync(
285
+ arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
286
+ )
287
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
288
+ return self._create_storage_job(telemetry_payload, telemetry)
289
+
290
+ def load_from_arrow(
291
+ self,
292
+ table: str,
293
+ source: "ArrowResult | Any",
294
+ *,
295
+ partitioner: "dict[str, object] | None" = None,
296
+ overwrite: bool = False,
297
+ telemetry: "StorageTelemetry | None" = None,
298
+ ) -> "StorageBridgeJob":
299
+ """Load Arrow data into Spanner table via batch mutations."""
300
+ self._require_capability("arrow_import_enabled")
301
+ arrow_table = self._coerce_arrow_table(source)
302
+
303
+ if overwrite:
304
+ delete_sql = f"DELETE FROM {table} WHERE TRUE"
305
+ if isinstance(self.connection, Transaction):
306
+ writer = cast("_SpannerWriteProtocol", self.connection)
307
+ writer.execute_update(delete_sql)
308
+ else:
309
+ msg = "Delete requires a Transaction context."
310
+ raise SQLConversionError(msg)
311
+
312
+ columns, records = self._arrow_table_to_rows(arrow_table)
313
+ if records:
314
+ insert_sql = f"INSERT INTO {table} ({', '.join(columns)}) VALUES ({', '.join('@p' + str(i) for i in range(len(columns)))})"
315
+ batch_args: list[tuple[str, dict[str, Any] | None, dict[str, Any]]] = []
316
+ param_types_cache: dict[tuple[tuple[str, type[Any]], ...], dict[str, Any]] = {}
317
+ empty_param_types: dict[str, Any] = {}
318
+ for record in records:
319
+ params = {f"p{i}": val for i, val in enumerate(record)}
320
+ coerced = self._coerce_params(params)
321
+ if not coerced:
322
+ batch_args.append((insert_sql, {}, empty_param_types))
323
+ continue
324
+ signature = build_param_type_signature(coerced)
325
+ param_types = param_types_cache.get(signature)
326
+ if param_types is None:
327
+ param_types = self._infer_param_types(coerced)
328
+ param_types_cache[signature] = param_types
329
+ batch_args.append((insert_sql, coerced, param_types))
330
+
331
+ conn = self.connection
332
+ if not isinstance(conn, Transaction):
333
+ msg = "Arrow import requires a Transaction context."
334
+ raise SQLConversionError(msg)
335
+ writer = cast("_SpannerWriteProtocol", conn)
336
+ writer.batch_update(batch_args)
337
+
338
+ telemetry_payload = self._build_ingest_telemetry(arrow_table)
339
+ telemetry_payload["destination"] = table
340
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
341
+ return self._create_storage_job(telemetry_payload, telemetry)
342
+
343
+ def load_from_storage(
344
+ self,
345
+ table: str,
346
+ source: "StorageDestination",
347
+ *,
348
+ file_format: "StorageFormat",
349
+ partitioner: "dict[str, object] | None" = None,
350
+ overwrite: bool = False,
351
+ ) -> "StorageBridgeJob":
352
+ """Load artifacts from storage into Spanner table."""
353
+ arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
354
+ return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
355
+
356
+ # ─────────────────────────────────────────────────────────────────────────────
357
+ # UTILITY METHODS
358
+ # ─────────────────────────────────────────────────────────────────────────────
359
+
360
+ @property
361
+ def data_dictionary(self) -> "SpannerDataDictionary":
362
+ if self._data_dictionary is None:
363
+ self._data_dictionary = SpannerDataDictionary()
364
+ return self._data_dictionary
365
+
366
+ # ─────────────────────────────────────────────────────────────────────────────
367
+ # PRIVATE/INTERNAL METHODS
368
+ # ─────────────────────────────────────────────────────────────────────────────
369
+
370
+ def collect_rows(self, cursor: "SpannerConnection", fetched: "list[Any]") -> "tuple[list[Any], list[str], int]":
371
+ """Collect Spanner rows for the direct execution path.
372
+
373
+ Note: Spanner's collect_rows requires result set fields and a type converter.
374
+ The direct execution path may not always have this metadata available,
375
+ so this falls back to basic collection.
376
+ """
377
+ # For direct path, we need fields metadata from the result set.
378
+ # If not available, return raw data with no column names.
379
+ if not fetched:
380
+ return [], [], 0
381
+ # Attempt to extract column names from dict keys if rows are dicts
382
+ if isinstance(fetched[0], dict):
383
+ column_names = list(fetched[0].keys())
384
+ return fetched, column_names, len(fetched)
385
+ # For tuple rows without metadata, return as-is
386
+ return fetched, [], len(fetched)
387
+
388
+ def resolve_rowcount(self, cursor: "SpannerConnection") -> int:
389
+ """Resolve rowcount from Spanner cursor for the direct execution path."""
390
+ # Spanner uses execute_update return value, not cursor.rowcount
391
+ return 0
392
+
393
+ def _connection_in_transaction(self) -> bool:
394
+ """Check if connection is in transaction."""
395
+ return False
396
+
397
+ def _coerce_params(self, params: "dict[str, Any] | list[Any] | tuple[Any, ...] | None") -> "dict[str, Any] | None":
398
+ return coerce_params(params, json_serializer=self.driver_features.get("json_serializer"))
399
+
400
+ def _infer_param_types(self, params: "dict[str, Any] | list[Any] | tuple[Any, ...] | None") -> "dict[str, Any]":
401
+ return infer_param_types(params)
402
+
403
+ def _resolve_column_names(self, fields: Any) -> list[str]:
404
+ return resolve_column_names(fields, self._column_name_cache)
405
+
406
+
407
+ register_driver_profile("spanner", driver_profile)
@@ -0,0 +1,5 @@
1
+ """Events helpers for the Spanner adapter."""
2
+
3
+ from sqlspec.adapters.spanner.events.store import SpannerSyncEventQueueStore
4
+
5
+ __all__ = ("SpannerSyncEventQueueStore",)