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,128 @@
1
+ """BigQuery-specific data dictionary for metadata queries."""
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__ = ("BigQueryDataDictionary",)
11
+
12
+ if TYPE_CHECKING:
13
+ from sqlspec.adapters.bigquery.driver import BigQueryDriver
14
+
15
+
16
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
17
+ class BigQueryDataDictionary(SyncDataDictionaryBase):
18
+ """BigQuery-specific sync data dictionary."""
19
+
20
+ dialect: ClassVar[str] = "bigquery"
21
+
22
+ def __init__(self) -> None:
23
+ super().__init__()
24
+
25
+ def get_version(self, driver: "BigQueryDriver") -> "VersionInfo | None":
26
+ """Return BigQuery version information.
27
+
28
+ Args:
29
+ driver: BigQuery driver instance.
30
+
31
+ Returns:
32
+ None because BigQuery does not expose version info.
33
+
34
+ """
35
+ _ = driver
36
+ return None
37
+
38
+ def get_feature_flag(self, driver: "BigQueryDriver", feature: str) -> bool:
39
+ """Check if BigQuery supports a specific feature.
40
+
41
+ Args:
42
+ driver: BigQuery 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: "BigQueryDriver", type_category: str) -> str:
53
+ """Get optimal BigQuery type for a category.
54
+
55
+ Args:
56
+ driver: BigQuery driver instance.
57
+ type_category: Type category.
58
+
59
+ Returns:
60
+ BigQuery-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: "BigQueryDriver", schema: "str | None" = None) -> "list[TableMetadata]":
67
+ """Get tables sorted by topological dependency order using BigQuery catalog."""
68
+ self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="tables")
69
+ if schema:
70
+ tables_table = f"`{schema}.INFORMATION_SCHEMA.TABLES`"
71
+ kcu_table = f"`{schema}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE`"
72
+ rc_table = f"`{schema}.INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS`"
73
+ else:
74
+ tables_table = "INFORMATION_SCHEMA.TABLES"
75
+ kcu_table = "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
76
+ rc_table = "INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS"
77
+
78
+ query_text = self.get_query_text("tables_by_schema").format(
79
+ tables_table=tables_table, kcu_table=kcu_table, rc_table=rc_table
80
+ )
81
+ return driver.select(query_text, schema_type=TableMetadata)
82
+
83
+ def get_columns(
84
+ self, driver: "BigQueryDriver", table: "str | None" = None, schema: "str | None" = None
85
+ ) -> "list[ColumnMetadata]":
86
+ """Get column information for a table or schema."""
87
+ schema_prefix = f"`{schema}`." if schema else ""
88
+ if table is None:
89
+ self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="columns")
90
+ query_text = self.get_query_text("columns_by_schema").format(schema_prefix=schema_prefix)
91
+ return driver.select(query_text, schema_name=schema, schema_type=ColumnMetadata)
92
+
93
+ self._log_table_describe(driver, schema_name=schema, table_name=table, operation="columns")
94
+ query_text = self.get_query_text("columns_by_table").format(schema_prefix=schema_prefix)
95
+ return driver.select(query_text, table_name=table, schema_name=schema, schema_type=ColumnMetadata)
96
+
97
+ def get_indexes(
98
+ self, driver: "BigQueryDriver", table: "str | None" = None, schema: "str | None" = None
99
+ ) -> "list[IndexMetadata]":
100
+ """Get index metadata for a table or schema."""
101
+ if table is None:
102
+ self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="indexes")
103
+ return driver.select(self.get_query("indexes_by_schema"), schema_type=IndexMetadata)
104
+
105
+ self._log_table_describe(driver, schema_name=schema, table_name=table, operation="indexes")
106
+ return driver.select(self.get_query("indexes_by_table"), schema_type=IndexMetadata)
107
+
108
+ def get_foreign_keys(
109
+ self, driver: "BigQueryDriver", table: "str | None" = None, schema: "str | None" = None
110
+ ) -> "list[ForeignKeyMetadata]":
111
+ """Get foreign key metadata."""
112
+ if table is None:
113
+ self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="foreign_keys")
114
+ else:
115
+ self._log_table_describe(driver, schema_name=schema, table_name=table, operation="foreign_keys")
116
+ if schema:
117
+ kcu_table = f"`{schema}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE`"
118
+ rc_table = f"`{schema}.INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS`"
119
+ else:
120
+ kcu_table = "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
121
+ rc_table = "INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS"
122
+
123
+ if table is None:
124
+ query_text = self.get_query_text("foreign_keys_by_schema").format(kcu_table=kcu_table, rc_table=rc_table)
125
+ return driver.select(query_text, schema_name=schema, schema_type=ForeignKeyMetadata)
126
+
127
+ query_text = self.get_query_text("foreign_keys_by_table").format(kcu_table=kcu_table, rc_table=rc_table)
128
+ return driver.select(query_text, table_name=table, schema_name=schema, schema_type=ForeignKeyMetadata)
@@ -0,0 +1,548 @@
1
+ # ruff: noqa: F401
2
+ """BigQuery driver implementation.
3
+
4
+ Provides Google Cloud BigQuery connectivity with parameter style conversion,
5
+ type coercion, error handling, and query job management.
6
+ """
7
+
8
+ import io
9
+ from typing import TYPE_CHECKING, Any, cast
10
+
11
+ from google.cloud.exceptions import GoogleCloudError
12
+
13
+ from sqlspec.adapters.bigquery._typing import BigQueryConnection, BigQuerySessionContext
14
+ from sqlspec.adapters.bigquery.core import (
15
+ build_dml_rowcount,
16
+ build_inlined_script,
17
+ build_load_job_config,
18
+ build_load_job_telemetry,
19
+ build_retry,
20
+ collect_rows,
21
+ create_mapped_exception,
22
+ default_statement_config,
23
+ detect_emulator,
24
+ driver_profile,
25
+ is_simple_insert,
26
+ normalize_script_rowcount,
27
+ run_query_job,
28
+ storage_api_available,
29
+ try_bulk_insert,
30
+ )
31
+ from sqlspec.adapters.bigquery.data_dictionary import BigQueryDataDictionary
32
+ from sqlspec.adapters.bigquery.type_converter import BigQueryOutputConverter
33
+ from sqlspec.core import (
34
+ StatementConfig,
35
+ build_arrow_result_from_table,
36
+ build_literal_inlining_transform,
37
+ get_cache_config,
38
+ register_driver_profile,
39
+ )
40
+ from sqlspec.driver import ExecutionResult, SyncDriverAdapterBase
41
+ from sqlspec.exceptions import MissingDependencyError, SQLSpecError, StorageCapabilityError
42
+ from sqlspec.utils.logging import get_logger
43
+ from sqlspec.utils.module_loader import ensure_pyarrow
44
+ from sqlspec.utils.serializers import to_json
45
+
46
+ if TYPE_CHECKING:
47
+ from collections.abc import Callable
48
+
49
+ from google.cloud.bigquery import QueryJob, QueryJobConfig
50
+ from typing_extensions import Self
51
+
52
+ from sqlspec.builder import QueryBuilder
53
+ from sqlspec.core import SQL, ArrowResult, SQLResult, Statement, StatementFilter
54
+ from sqlspec.storage import (
55
+ StorageBridgeJob,
56
+ StorageDestination,
57
+ StorageFormat,
58
+ StorageTelemetry,
59
+ SyncStoragePipeline,
60
+ )
61
+ from sqlspec.typing import ArrowReturnFormat, StatementParameters
62
+
63
+ logger = get_logger(__name__)
64
+
65
+ __all__ = ("BigQueryCursor", "BigQueryDriver", "BigQueryExceptionHandler", "BigQuerySessionContext")
66
+
67
+
68
+ class BigQueryCursor:
69
+ """BigQuery cursor with resource management."""
70
+
71
+ __slots__ = ("connection", "job")
72
+
73
+ def __init__(self, connection: "BigQueryConnection") -> None:
74
+ self.connection = connection
75
+ self.job: QueryJob | None = None
76
+
77
+ def __enter__(self) -> "BigQueryConnection":
78
+ return self.connection
79
+
80
+ def __exit__(self, *_: Any) -> None:
81
+ """Clean up cursor resources including active QueryJobs."""
82
+ if self.job is not None:
83
+ try:
84
+ # Cancel the job if it's still running to free up resources
85
+ if self.job.state in {"PENDING", "RUNNING"}:
86
+ self.job.cancel()
87
+ # Clear the job reference
88
+ self.job = None
89
+ except Exception:
90
+ logger.exception("Failed to cancel BigQuery job during cursor cleanup")
91
+
92
+
93
+ class BigQueryExceptionHandler:
94
+ """Context manager for handling BigQuery API exceptions.
95
+
96
+ Maps HTTP status codes and error reasons to specific SQLSpec exceptions
97
+ for better error handling in application code.
98
+
99
+ Uses deferred exception pattern for mypyc compatibility: exceptions
100
+ are stored in pending_exception rather than raised from __exit__
101
+ to avoid ABI boundary violations with compiled code.
102
+ """
103
+
104
+ __slots__ = ("pending_exception",)
105
+
106
+ def __init__(self) -> None:
107
+ self.pending_exception: Exception | None = None
108
+
109
+ def __enter__(self) -> "BigQueryExceptionHandler":
110
+ return self
111
+
112
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
113
+ _ = exc_tb
114
+ if exc_type is None:
115
+ return False
116
+ if issubclass(exc_type, GoogleCloudError):
117
+ self.pending_exception = create_mapped_exception(exc_val)
118
+ return True
119
+ return False
120
+
121
+
122
+ class BigQueryDriver(SyncDriverAdapterBase):
123
+ """BigQuery driver implementation.
124
+
125
+ Provides Google Cloud BigQuery connectivity with parameter style conversion,
126
+ type coercion, error handling, and query job management.
127
+ """
128
+
129
+ __slots__ = (
130
+ "_data_dictionary",
131
+ "_default_query_job_config",
132
+ "_job_retry",
133
+ "_job_retry_deadline",
134
+ "_json_serializer",
135
+ "_literal_inliner",
136
+ "_type_converter",
137
+ "_using_emulator",
138
+ )
139
+ dialect = "bigquery"
140
+
141
+ def __init__(
142
+ self,
143
+ connection: BigQueryConnection,
144
+ statement_config: "StatementConfig | None" = None,
145
+ driver_features: "dict[str, Any] | None" = None,
146
+ ) -> None:
147
+ features = driver_features or {}
148
+
149
+ enable_uuid_conversion = features.get("enable_uuid_conversion", True)
150
+ self._type_converter = BigQueryOutputConverter(enable_uuid_conversion=enable_uuid_conversion)
151
+
152
+ if statement_config is None:
153
+ statement_config = default_statement_config.replace(cache_config=get_cache_config())
154
+
155
+ parameter_json_serializer = statement_config.parameter_config.json_serializer
156
+ if parameter_json_serializer is None:
157
+ parameter_json_serializer = features.get("json_serializer", to_json)
158
+
159
+ self._json_serializer: Callable[[Any], str] = parameter_json_serializer
160
+ self._literal_inliner = build_literal_inlining_transform(json_serializer=self._json_serializer)
161
+
162
+ super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
163
+ self._default_query_job_config: QueryJobConfig | None = (driver_features or {}).get("default_query_job_config")
164
+ self._data_dictionary: BigQueryDataDictionary | None = None
165
+ self._using_emulator = detect_emulator(connection)
166
+ self._job_retry_deadline = float(features.get("job_retry_deadline", 60.0))
167
+ self._job_retry = build_retry(self._job_retry_deadline, self._using_emulator)
168
+
169
+ # ─────────────────────────────────────────────────────────────────────────────
170
+ # CORE DISPATCH METHODS
171
+ # ─────────────────────────────────────────────────────────────────────────────
172
+
173
+ def dispatch_execute(self, cursor: Any, statement: "SQL") -> ExecutionResult:
174
+ """Execute single SQL statement with BigQuery data handling.
175
+
176
+ Args:
177
+ cursor: BigQuery cursor object
178
+ statement: SQL statement to execute
179
+
180
+ Returns:
181
+ ExecutionResult with query results and metadata
182
+ """
183
+ sql, parameters = self._get_compiled_sql(statement, self.statement_config)
184
+ cursor.job = run_query_job(
185
+ cursor,
186
+ sql,
187
+ parameters,
188
+ default_job_config=self._default_query_job_config,
189
+ job_config=None,
190
+ json_serializer=self._json_serializer,
191
+ )
192
+ job_result = cursor.job.result(job_retry=self._job_retry)
193
+ statement_type = str(cursor.job.statement_type or "").upper()
194
+ is_select_like = (
195
+ statement.returns_rows() or statement_type == "SELECT" or self._should_force_select(statement, cursor)
196
+ )
197
+
198
+ if is_select_like:
199
+ rows_list, column_names = collect_rows(job_result, cursor.job.schema)
200
+
201
+ return self.create_execution_result(
202
+ cursor,
203
+ selected_data=rows_list,
204
+ column_names=column_names,
205
+ data_row_count=len(rows_list),
206
+ is_select_result=True,
207
+ )
208
+
209
+ affected_rows = build_dml_rowcount(cursor.job, 0)
210
+ return self.create_execution_result(cursor, rowcount_override=affected_rows)
211
+
212
+ def dispatch_execute_many(self, cursor: Any, statement: "SQL") -> ExecutionResult:
213
+ """BigQuery execute_many with Parquet bulk load optimization.
214
+
215
+ Uses Parquet bulk load for INSERT operations (fast path) and falls back
216
+ to literal inlining for UPDATE/DELETE operations.
217
+
218
+ Args:
219
+ cursor: BigQuery cursor object
220
+ statement: SQL statement to execute with multiple parameter sets
221
+
222
+ Returns:
223
+ ExecutionResult with batch execution details
224
+ """
225
+ compiled_statement, prepared_parameters = self._get_compiled_statement(statement, self.statement_config)
226
+ sql = compiled_statement.compiled_sql
227
+ parsed_expression = compiled_statement.expression
228
+
229
+ if not prepared_parameters:
230
+ return self.create_execution_result(cursor, rowcount_override=0, is_many_result=True)
231
+
232
+ if isinstance(prepared_parameters, tuple):
233
+ prepared_parameters = list(prepared_parameters)
234
+
235
+ if not isinstance(prepared_parameters, list):
236
+ return self.create_execution_result(cursor, rowcount_override=0, is_many_result=True)
237
+
238
+ allow_parse = statement.statement_config.enable_parsing
239
+ if is_simple_insert(sql, parsed_expression, allow_parse=allow_parse):
240
+ rowcount = try_bulk_insert(
241
+ self.connection, sql, prepared_parameters, parsed_expression, allow_parse=allow_parse
242
+ )
243
+ if rowcount is not None:
244
+ return self.create_execution_result(cursor, rowcount_override=rowcount, is_many_result=True)
245
+
246
+ script_sql = build_inlined_script(
247
+ sql, prepared_parameters, parsed_expression, allow_parse=allow_parse, literal_inliner=self._literal_inliner
248
+ )
249
+ cursor.job = run_query_job(
250
+ cursor,
251
+ script_sql,
252
+ None,
253
+ default_job_config=self._default_query_job_config,
254
+ job_config=None,
255
+ json_serializer=self._json_serializer,
256
+ )
257
+ cursor.job.result(job_retry=self._job_retry)
258
+ affected_rows = build_dml_rowcount(cursor.job, len(prepared_parameters))
259
+ return self.create_execution_result(cursor, rowcount_override=affected_rows, is_many_result=True)
260
+
261
+ def dispatch_execute_script(self, cursor: Any, statement: "SQL") -> ExecutionResult:
262
+ """Execute SQL script with statement splitting and parameter handling.
263
+
264
+ Parameters are embedded as static values for script execution compatibility.
265
+
266
+ Args:
267
+ cursor: BigQuery cursor object
268
+ statement: SQL statement to execute
269
+
270
+ Returns:
271
+ ExecutionResult with script execution details
272
+ """
273
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
274
+ statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
275
+
276
+ successful_count = 0
277
+ last_job = None
278
+ last_rowcount = 0
279
+
280
+ for stmt in statements:
281
+ job = run_query_job(
282
+ cursor,
283
+ stmt,
284
+ prepared_parameters or {},
285
+ default_job_config=self._default_query_job_config,
286
+ job_config=None,
287
+ json_serializer=self._json_serializer,
288
+ )
289
+ job.result(job_retry=self._job_retry)
290
+ last_job = job
291
+ last_rowcount = normalize_script_rowcount(last_rowcount, job)
292
+ successful_count += 1
293
+
294
+ cursor.job = last_job
295
+
296
+ return self.create_execution_result(
297
+ cursor,
298
+ statement_count=len(statements),
299
+ successful_statements=successful_count,
300
+ rowcount_override=last_rowcount,
301
+ is_script_result=True,
302
+ )
303
+
304
+ # ─────────────────────────────────────────────────────────────────────────────
305
+ # TRANSACTION MANAGEMENT
306
+ # ─────────────────────────────────────────────────────────────────────────────
307
+
308
+ def begin(self) -> None:
309
+ """Begin transaction - BigQuery doesn't support transactions."""
310
+
311
+ def commit(self) -> None:
312
+ """Commit transaction - BigQuery doesn't support transactions."""
313
+
314
+ def rollback(self) -> None:
315
+ """Rollback transaction - BigQuery doesn't support transactions."""
316
+
317
+ def with_cursor(self, connection: "BigQueryConnection") -> "BigQueryCursor":
318
+ """Create context manager for cursor management.
319
+
320
+ Returns:
321
+ BigQueryCursor: Cursor object for query execution
322
+ """
323
+ return BigQueryCursor(connection)
324
+
325
+ def handle_database_exceptions(self) -> "BigQueryExceptionHandler":
326
+ """Handle database-specific exceptions and wrap them appropriately."""
327
+ return BigQueryExceptionHandler()
328
+
329
+ # ─────────────────────────────────────────────────────────────────────────────
330
+ # ARROW API METHODS
331
+ # ─────────────────────────────────────────────────────────────────────────────
332
+
333
+ def select_to_arrow(
334
+ self,
335
+ statement: "Statement | QueryBuilder",
336
+ /,
337
+ *parameters: "StatementParameters | StatementFilter",
338
+ statement_config: "StatementConfig | None" = None,
339
+ return_format: "ArrowReturnFormat" = "table",
340
+ native_only: bool = False,
341
+ batch_size: int | None = None,
342
+ arrow_schema: Any = None,
343
+ **kwargs: Any,
344
+ ) -> "ArrowResult":
345
+ """Execute query and return results as Apache Arrow (BigQuery native with Storage API).
346
+
347
+ BigQuery provides native Arrow via Storage API (query_job.to_arrow()).
348
+ Requires google-cloud-bigquery-storage package and API enabled.
349
+ Falls back to dict conversion if Storage API not available.
350
+
351
+ Args:
352
+ statement: SQL statement, string, or QueryBuilder
353
+ *parameters: Query parameters or filters
354
+ statement_config: Optional statement configuration override
355
+ return_format: "table" for pyarrow.Table (default), "batch" for RecordBatch,
356
+ "batches" for list of RecordBatch, "reader" for RecordBatchReader
357
+ native_only: If True, raise error if Storage API unavailable (default: False)
358
+ batch_size: Batch size hint (for future streaming implementation)
359
+ arrow_schema: Optional pyarrow.Schema for type casting
360
+ **kwargs: Additional keyword arguments
361
+
362
+ Returns:
363
+ ArrowResult with native Arrow data (if Storage API available) or converted data
364
+
365
+ Raises:
366
+ MissingDependencyError: If pyarrow not installed, or if Storage API not available and native_only=True
367
+
368
+ Example:
369
+ >>> # Will use native Arrow if Storage API available, otherwise converts
370
+ >>> result = driver.select_to_arrow(
371
+ ... "SELECT * FROM dataset.users WHERE age > @age",
372
+ ... {"age": 18},
373
+ ... )
374
+ >>> df = result.to_pandas()
375
+
376
+ >>> # Force native Arrow (raises if Storage API unavailable)
377
+ >>> result = driver.select_to_arrow(
378
+ ... "SELECT * FROM dataset.users", native_only=True
379
+ ... )
380
+ """
381
+ ensure_pyarrow()
382
+
383
+ if not storage_api_available():
384
+ if native_only:
385
+ msg = (
386
+ "BigQuery native Arrow requires Storage API.\n"
387
+ "1. Install: pip install google-cloud-bigquery-storage\n"
388
+ "2. Enable API: https://console.cloud.google.com/apis/library/bigquerystorage.googleapis.com\n"
389
+ "3. Grant permissions: roles/bigquery.dataViewer"
390
+ )
391
+ raise MissingDependencyError(
392
+ package="google-cloud-bigquery-storage", install_package="google-cloud-bigquery-storage"
393
+ ) from RuntimeError(msg)
394
+
395
+ # Fallback to conversion path
396
+ result: ArrowResult = super().select_to_arrow(
397
+ statement,
398
+ *parameters,
399
+ statement_config=statement_config,
400
+ return_format=return_format,
401
+ native_only=native_only,
402
+ batch_size=batch_size,
403
+ arrow_schema=arrow_schema,
404
+ **kwargs,
405
+ )
406
+ return result
407
+
408
+ # Use native path with Storage API
409
+ # Prepare statement
410
+ config = statement_config or self.statement_config
411
+ prepared_statement = self.prepare_statement(statement, parameters, statement_config=config, kwargs=kwargs)
412
+
413
+ # Get compiled SQL and parameters
414
+ sql, driver_params = self._get_compiled_sql(prepared_statement, config)
415
+
416
+ with self.handle_database_exceptions():
417
+ query_job = run_query_job(
418
+ self.connection,
419
+ sql,
420
+ driver_params,
421
+ default_job_config=self._default_query_job_config,
422
+ job_config=None,
423
+ json_serializer=self._json_serializer,
424
+ )
425
+ query_job.result() # Wait for completion
426
+
427
+ # Native Arrow via Storage API
428
+ arrow_table = query_job.to_arrow()
429
+
430
+ return build_arrow_result_from_table(
431
+ prepared_statement,
432
+ arrow_table,
433
+ return_format=return_format,
434
+ batch_size=batch_size,
435
+ arrow_schema=arrow_schema,
436
+ )
437
+ msg = "Unreachable"
438
+ raise RuntimeError(msg) # pragma: no cover
439
+
440
+ # ─────────────────────────────────────────────────────────────────────────────
441
+ # STORAGE API METHODS
442
+ # ─────────────────────────────────────────────────────────────────────────────
443
+
444
+ def select_to_storage(
445
+ self,
446
+ statement: "Statement | QueryBuilder | SQL | str",
447
+ destination: "StorageDestination",
448
+ /,
449
+ *parameters: "StatementParameters | StatementFilter",
450
+ statement_config: "StatementConfig | None" = None,
451
+ partitioner: "dict[str, object] | None" = None,
452
+ format_hint: "StorageFormat | None" = None,
453
+ telemetry: "StorageTelemetry | None" = None,
454
+ **kwargs: Any,
455
+ ) -> "StorageBridgeJob":
456
+ """Execute a query and persist Arrow results to a storage backend."""
457
+
458
+ self._require_capability("arrow_export_enabled")
459
+ arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
460
+ sync_pipeline = self._storage_pipeline()
461
+ telemetry_payload = self._write_result_to_storage_sync(
462
+ arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
463
+ )
464
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
465
+ return self._create_storage_job(telemetry_payload, telemetry)
466
+
467
+ def load_from_arrow(
468
+ self,
469
+ table: str,
470
+ source: "ArrowResult | Any",
471
+ *,
472
+ partitioner: "dict[str, object] | None" = None,
473
+ overwrite: bool = False,
474
+ telemetry: "StorageTelemetry | None" = None,
475
+ ) -> "StorageBridgeJob":
476
+ """Load Arrow data by uploading a temporary Parquet payload to BigQuery."""
477
+
478
+ self._require_capability("parquet_import_enabled")
479
+ arrow_table = self._coerce_arrow_table(source)
480
+ ensure_pyarrow()
481
+
482
+ import pyarrow.parquet as pq
483
+
484
+ buffer = io.BytesIO()
485
+ pq.write_table(arrow_table, buffer)
486
+ buffer.seek(0)
487
+ job_config = build_load_job_config("parquet", overwrite)
488
+ job = self.connection.load_table_from_file(buffer, table, job_config=job_config)
489
+ job.result()
490
+ telemetry_payload = build_load_job_telemetry(job, table, format_label="parquet")
491
+ if telemetry:
492
+ telemetry_payload.setdefault("extra", {})
493
+ telemetry_payload["extra"]["arrow_rows"] = telemetry.get("rows_processed")
494
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
495
+ return self._create_storage_job(telemetry_payload)
496
+
497
+ def load_from_storage(
498
+ self,
499
+ table: str,
500
+ source: "StorageDestination",
501
+ *,
502
+ file_format: "StorageFormat",
503
+ partitioner: "dict[str, object] | None" = None,
504
+ overwrite: bool = False,
505
+ ) -> "StorageBridgeJob":
506
+ """Load staged artifacts from storage into BigQuery."""
507
+
508
+ if file_format != "parquet":
509
+ msg = "BigQuery storage bridge currently supports Parquet ingest only"
510
+ raise StorageCapabilityError(msg, capability="parquet_import_enabled")
511
+ job_config = build_load_job_config(file_format, overwrite)
512
+ job = self.connection.load_table_from_uri(source, table, job_config=job_config)
513
+ job.result()
514
+ telemetry_payload = build_load_job_telemetry(job, table, format_label=file_format)
515
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
516
+ return self._create_storage_job(telemetry_payload)
517
+
518
+ # ─────────────────────────────────────────────────────────────────────────────
519
+ # UTILITY METHODS
520
+ # ─────────────────────────────────────────────────────────────────────────────
521
+
522
+ @property
523
+ def data_dictionary(self) -> "BigQueryDataDictionary":
524
+ """Get the data dictionary for this driver.
525
+
526
+ Returns:
527
+ Data dictionary instance for metadata queries
528
+ """
529
+ if self._data_dictionary is None:
530
+ self._data_dictionary = BigQueryDataDictionary()
531
+ return self._data_dictionary
532
+
533
+ # ─────────────────────────────────────────────────────────────────────────────
534
+ # PRIVATE / INTERNAL METHODS
535
+ # ─────────────────────────────────────────────────────────────────────────────
536
+
537
+ def _connection_in_transaction(self) -> bool:
538
+ """Check if connection is in transaction.
539
+
540
+ BigQuery does not support transactions.
541
+
542
+ Returns:
543
+ False - BigQuery has no transaction support.
544
+ """
545
+ return False
546
+
547
+
548
+ register_driver_profile("bigquery", driver_profile)
@@ -0,0 +1,5 @@
1
+ """Events helpers for the BigQuery adapter."""
2
+
3
+ from sqlspec.adapters.bigquery.events.store import BigQueryEventQueueStore
4
+
5
+ __all__ = ("BigQueryEventQueueStore",)