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,768 @@
1
+ """BigQuery adapter compiled helpers."""
2
+
3
+ import datetime
4
+ import importlib
5
+ import io
6
+ import os
7
+ from decimal import Decimal
8
+ from typing import TYPE_CHECKING, Any, cast
9
+
10
+ import sqlglot
11
+ from google.api_core.retry import Retry
12
+ from google.cloud.bigquery import LoadJobConfig, QueryJob, QueryJobConfig
13
+ from google.cloud.exceptions import GoogleCloudError
14
+ from sqlglot import exp
15
+
16
+ from sqlspec.core import (
17
+ DriverParameterProfile,
18
+ ParameterProfile,
19
+ ParameterStyle,
20
+ StatementConfig,
21
+ build_null_pruning_transform,
22
+ build_statement_config_from_profile,
23
+ )
24
+ from sqlspec.exceptions import (
25
+ DataError,
26
+ NotFoundError,
27
+ OperationalError,
28
+ PermissionDeniedError,
29
+ QueryTimeoutError,
30
+ SQLParsingError,
31
+ SQLSpecError,
32
+ StorageCapabilityError,
33
+ UniqueViolationError,
34
+ )
35
+ from sqlspec.utils.logging import get_logger
36
+ from sqlspec.utils.serializers import to_json
37
+ from sqlspec.utils.type_converters import build_uuid_coercions
38
+ from sqlspec.utils.type_guards import has_errors, has_value_attribute
39
+
40
+ if TYPE_CHECKING:
41
+ from collections.abc import Callable, Mapping
42
+
43
+ from sqlspec.adapters.bigquery._typing import BigQueryConnection, BigQueryParam
44
+ from sqlspec.storage import StorageFormat, StorageTelemetry
45
+
46
+ __all__ = (
47
+ "apply_driver_features",
48
+ "build_dml_rowcount",
49
+ "build_inlined_script",
50
+ "build_load_job_config",
51
+ "build_load_job_telemetry",
52
+ "build_profile",
53
+ "build_retry",
54
+ "build_statement_config",
55
+ "collect_rows",
56
+ "copy_job_config",
57
+ "create_mapped_exception",
58
+ "create_parameters",
59
+ "default_statement_config",
60
+ "detect_emulator",
61
+ "driver_profile",
62
+ "extract_insert_table",
63
+ "is_simple_insert",
64
+ "normalize_script_rowcount",
65
+ "resolve_column_names",
66
+ "run_query_job",
67
+ "storage_api_available",
68
+ "try_bulk_insert",
69
+ )
70
+
71
+ HTTP_CONFLICT = 409
72
+ HTTP_NOT_FOUND = 404
73
+ HTTP_BAD_REQUEST = 400
74
+ HTTP_FORBIDDEN = 403
75
+ HTTP_SERVER_ERROR = 500
76
+ COLUMN_CACHE_MAX_SIZE = 256
77
+
78
+
79
+ def _identity(value: Any) -> Any:
80
+ return value
81
+
82
+
83
+ def _tuple_to_list(value: Any) -> Any:
84
+ if isinstance(value, tuple):
85
+ return list(value)
86
+ return value
87
+
88
+
89
+ def _return_none(_: Any) -> None:
90
+ return None
91
+
92
+
93
+ def storage_api_available() -> bool:
94
+ """Return True when the BigQuery Storage API client can be imported."""
95
+ try:
96
+ importlib.import_module("google.cloud.bigquery_storage_v1")
97
+ except Exception:
98
+ return False
99
+ return True
100
+
101
+
102
+ _BIGQUERY_MODULE: Any | None = None
103
+ _BQ_TYPE_MAP: "dict[type, tuple[str, str | None]]" = {
104
+ bool: ("BOOL", None),
105
+ int: ("INT64", None),
106
+ float: ("FLOAT64", None),
107
+ Decimal: ("BIGNUMERIC", None),
108
+ str: ("STRING", None),
109
+ bytes: ("BYTES", None),
110
+ datetime.date: ("DATE", None),
111
+ datetime.time: ("TIME", None),
112
+ dict: ("JSON", None),
113
+ }
114
+
115
+
116
+ def try_bulk_insert(
117
+ connection: "BigQueryConnection",
118
+ sql: str,
119
+ parameters: "list[dict[str, Any]]",
120
+ expression: "exp.Expr | None" = None,
121
+ *,
122
+ allow_parse: bool = True,
123
+ ) -> "int | None":
124
+ """Attempt bulk insert via Parquet load.
125
+
126
+ Args:
127
+ connection: BigQuery connection instance.
128
+ sql: INSERT SQL statement.
129
+ parameters: Parameter dictionaries for the insert.
130
+ expression: Optional parsed expression to reuse.
131
+ allow_parse: Whether to parse SQL when expression is unavailable.
132
+
133
+ Returns:
134
+ Inserted row count if bulk insert succeeds, otherwise None.
135
+ """
136
+ table_name = extract_insert_table(sql, expression, allow_parse=allow_parse)
137
+ if not table_name:
138
+ return None
139
+
140
+ try:
141
+ import pyarrow as pa
142
+ import pyarrow.parquet as pq
143
+
144
+ arrow_table = pa.Table.from_pylist(parameters)
145
+
146
+ buffer = io.BytesIO()
147
+ pq.write_table(arrow_table, buffer)
148
+ buffer.seek(0)
149
+
150
+ job_config = build_load_job_config("parquet", overwrite=False)
151
+ job = connection.load_table_from_file(buffer, table_name, job_config=job_config)
152
+ job.result()
153
+ return len(parameters)
154
+ except ImportError:
155
+ logger.debug("pyarrow not available, falling back to literal inlining")
156
+ return None
157
+ except Exception as exc:
158
+ logger.debug("Bulk insert failed, falling back to literal inlining: %s", exc)
159
+ return None
160
+
161
+
162
+ def build_inlined_script(
163
+ sql: str,
164
+ parameters: "list[dict[str, Any]]",
165
+ expression: "exp.Expr | None" = None,
166
+ *,
167
+ allow_parse: bool = True,
168
+ literal_inliner: "Callable[[Any, Any, ParameterProfile], tuple[Any, Any]]",
169
+ ) -> str:
170
+ """Build a BigQuery script with literal inlining.
171
+
172
+ Args:
173
+ sql: SQL statement to inline.
174
+ parameters: Parameter dictionaries to inline.
175
+ expression: Optional parsed expression to reuse.
176
+ allow_parse: Whether to parse SQL when expression is unavailable.
177
+ literal_inliner: Callable used to inline literal values.
178
+
179
+ Returns:
180
+ Script SQL with inlined parameters.
181
+ """
182
+ parsed_expression = expression
183
+ if parsed_expression is None and allow_parse:
184
+ try:
185
+ parsed_expression = sqlglot.parse_one(sql, dialect="bigquery")
186
+ except sqlglot.ParseError:
187
+ parsed_expression = None
188
+
189
+ if parsed_expression is None:
190
+ return ";\n".join([sql] * len(parameters))
191
+
192
+ script_statements: list[str] = []
193
+ for param_set in parameters:
194
+ expression_copy: exp.Expr = parsed_expression.copy()
195
+ script_statements.append(_inline_bigquery_literals(expression_copy, param_set, literal_inliner))
196
+ return ";\n".join(script_statements)
197
+
198
+
199
+ def _create_array_parameter(name: str, value: Any, array_type: str) -> "BigQueryParam":
200
+ """Create BigQuery ARRAY parameter.
201
+
202
+ Args:
203
+ name: Parameter name.
204
+ value: Array value (converted to list, empty list if None).
205
+ array_type: BigQuery array element type.
206
+
207
+ Returns:
208
+ ArrayQueryParameter instance.
209
+ """
210
+ bigquery = _get_bigquery_module()
211
+ return cast("BigQueryParam", bigquery.ArrayQueryParameter(name, array_type, [] if value is None else list(value)))
212
+
213
+
214
+ def _create_json_parameter(name: str, value: Any, json_serializer: "Callable[[Any], str]") -> "BigQueryParam":
215
+ """Create BigQuery JSON parameter as STRING type.
216
+
217
+ Args:
218
+ name: Parameter name.
219
+ value: JSON-serializable value.
220
+ json_serializer: Function to serialize to JSON string.
221
+
222
+ Returns:
223
+ ScalarQueryParameter with STRING type.
224
+ """
225
+ bigquery = _get_bigquery_module()
226
+ return cast("BigQueryParam", bigquery.ScalarQueryParameter(name, "STRING", json_serializer(value)))
227
+
228
+
229
+ def _create_scalar_parameter(name: str, value: Any, param_type: str) -> "BigQueryParam":
230
+ """Create BigQuery scalar parameter.
231
+
232
+ Args:
233
+ name: Parameter name.
234
+ value: Scalar value.
235
+ param_type: BigQuery parameter type (INT64, FLOAT64, etc.).
236
+
237
+ Returns:
238
+ ScalarQueryParameter instance.
239
+ """
240
+ bigquery = _get_bigquery_module()
241
+ return cast("BigQueryParam", bigquery.ScalarQueryParameter(name, param_type, value))
242
+
243
+
244
+ def _get_bigquery_module() -> Any:
245
+ global _BIGQUERY_MODULE
246
+ if _BIGQUERY_MODULE is None:
247
+ from google.cloud import bigquery
248
+
249
+ _BIGQUERY_MODULE = bigquery
250
+ return _BIGQUERY_MODULE
251
+
252
+
253
+ logger = get_logger("sqlspec.adapters.bigquery.core")
254
+
255
+
256
+ def _get_bq_param_type(value: Any) -> "tuple[str | None, str | None]":
257
+ """Determine BigQuery parameter type from Python value.
258
+
259
+ Args:
260
+ value: Python value to determine BigQuery type for
261
+
262
+ Returns:
263
+ Tuple of (parameter_type, array_element_type)
264
+ """
265
+ if value is None:
266
+ return ("STRING", None)
267
+
268
+ value_type = type(value)
269
+
270
+ if value_type is datetime.datetime:
271
+ return ("TIMESTAMP" if value.tzinfo else "DATETIME", None)
272
+
273
+ if value_type in _BQ_TYPE_MAP:
274
+ return _BQ_TYPE_MAP[value_type]
275
+
276
+ if isinstance(value, (list, tuple)):
277
+ if not value:
278
+ msg = "Cannot determine BigQuery ARRAY type for empty sequence."
279
+ raise SQLSpecError(msg)
280
+ element_type, _ = _get_bq_param_type(value[0])
281
+ if element_type is None:
282
+ msg = f"Unsupported element type in ARRAY: {type(value[0])}"
283
+ raise SQLSpecError(msg)
284
+ return "ARRAY", element_type
285
+
286
+ return None, None
287
+
288
+
289
+ def create_parameters(parameters: Any, json_serializer: "Callable[[Any], str]") -> "list[BigQueryParam]":
290
+ """Create BigQuery QueryParameter objects from parameters.
291
+
292
+ Args:
293
+ parameters: Dict of named parameters or list of positional parameters
294
+ json_serializer: Function to serialize dict/list to JSON string
295
+
296
+ Returns:
297
+ List of BigQuery QueryParameter objects
298
+ """
299
+ if not parameters:
300
+ return []
301
+
302
+ bq_parameters: list[BigQueryParam] = []
303
+
304
+ if isinstance(parameters, dict):
305
+ for name, value in parameters.items():
306
+ param_name_for_bq = name.lstrip("@")
307
+ actual_value = value.value if has_value_attribute(value) else value
308
+ param_type, array_element_type = _get_bq_param_type(actual_value)
309
+
310
+ if param_type == "ARRAY" and array_element_type:
311
+ bq_parameters.append(_create_array_parameter(param_name_for_bq, actual_value, array_element_type))
312
+ elif param_type == "JSON":
313
+ bq_parameters.append(_create_json_parameter(param_name_for_bq, actual_value, json_serializer))
314
+ elif param_type:
315
+ bq_parameters.append(_create_scalar_parameter(param_name_for_bq, actual_value, param_type))
316
+ else:
317
+ msg = f"Unsupported BigQuery parameter type for value of param '{name}': {type(actual_value)}"
318
+ raise SQLSpecError(msg)
319
+
320
+ elif isinstance(parameters, (list, tuple)):
321
+ msg = "BigQuery driver requires named parameters (e.g., @name); positional parameters are not supported"
322
+ raise SQLSpecError(msg)
323
+
324
+ return bq_parameters
325
+
326
+
327
+ def _inline_bigquery_literals(
328
+ expression: "exp.Expr", parameters: Any, inliner: "Callable[[Any, Any, ParameterProfile], tuple[Any, Any]]"
329
+ ) -> str:
330
+ """Inline literal values into a parsed SQLGlot expression."""
331
+ if not parameters:
332
+ return str(expression.sql(dialect="bigquery"))
333
+
334
+ transformed_expression, _ = inliner(expression, parameters, ParameterProfile.empty())
335
+ return str(transformed_expression.sql(dialect="bigquery"))
336
+
337
+
338
+ def detect_emulator(connection: "BigQueryConnection") -> bool:
339
+ """Detect whether the BigQuery client targets an emulator endpoint."""
340
+ emulator_host = os.getenv("BIGQUERY_EMULATOR_HOST") or os.getenv("BIGQUERY_EMULATOR_HOST_HTTP")
341
+ if emulator_host:
342
+ return True
343
+
344
+ try:
345
+ inner_connection = cast("Any", connection)._connection
346
+ except AttributeError:
347
+ inner_connection = None
348
+ if inner_connection is None:
349
+ return False
350
+ try:
351
+ api_base_url = inner_connection.API_BASE_URL
352
+ except AttributeError:
353
+ api_base_url = ""
354
+ if not api_base_url:
355
+ return False
356
+ return "googleapis.com" not in api_base_url
357
+
358
+
359
+ def _should_retry_bigquery_job(exception: Exception) -> bool:
360
+ """Return True when a BigQuery job exception is safe to retry."""
361
+ if not isinstance(exception, GoogleCloudError):
362
+ return False
363
+
364
+ errors = exception.errors if has_errors(exception) and exception.errors is not None else []
365
+ retryable_reasons = {
366
+ "backendError",
367
+ "internalError",
368
+ "jobInternalError",
369
+ "rateLimitExceeded",
370
+ "jobRateLimitExceeded",
371
+ }
372
+
373
+ for err in errors:
374
+ if not isinstance(err, dict):
375
+ continue
376
+ reason = err.get("reason")
377
+ message = (err.get("message") or "").lower()
378
+ if reason in retryable_reasons:
379
+ return not ("nonexistent_column" in message or ("column" in message and "not present" in message))
380
+
381
+ return False
382
+
383
+
384
+ def build_retry(deadline: float, using_emulator: bool) -> "Retry | None":
385
+ """Build retry policy for job restarts based on error reason codes."""
386
+ if using_emulator:
387
+ return None
388
+ return Retry(predicate=_should_retry_bigquery_job, deadline=deadline)
389
+
390
+
391
+ def _should_copy_job_attribute(attr: str, source_config: QueryJobConfig) -> bool:
392
+ if attr.startswith("_"):
393
+ return False
394
+
395
+ try:
396
+ value = source_config.__getattribute__(attr)
397
+ return value is not None and not callable(value)
398
+ except (AttributeError, TypeError):
399
+ return False
400
+
401
+
402
+ def copy_job_config(source_config: QueryJobConfig, target_config: QueryJobConfig) -> None:
403
+ """Copy non-private attributes from source config to target config."""
404
+ for attr in dir(source_config):
405
+ if not _should_copy_job_attribute(attr, source_config):
406
+ continue
407
+
408
+ try:
409
+ value = source_config.__getattribute__(attr)
410
+ setattr(target_config, attr, value)
411
+ except (AttributeError, TypeError):
412
+ continue
413
+
414
+
415
+ def run_query_job(
416
+ connection: "BigQueryConnection",
417
+ sql: str,
418
+ parameters: Any,
419
+ *,
420
+ default_job_config: QueryJobConfig | None,
421
+ job_config: QueryJobConfig | None,
422
+ json_serializer: "Callable[[Any], str]",
423
+ ) -> QueryJob:
424
+ """Execute a BigQuery query job with merged configuration.
425
+
426
+ Args:
427
+ connection: BigQuery connection instance.
428
+ sql: SQL string to execute.
429
+ parameters: Prepared parameters payload.
430
+ default_job_config: Default job configuration to merge.
431
+ job_config: Optional job configuration override.
432
+ json_serializer: JSON serializer for parameter values.
433
+
434
+ Returns:
435
+ QueryJob object representing the executed job.
436
+ """
437
+ final_job_config = QueryJobConfig()
438
+ if default_job_config:
439
+ copy_job_config(default_job_config, final_job_config)
440
+ if job_config:
441
+ copy_job_config(job_config, final_job_config)
442
+ final_job_config.query_parameters = create_parameters(parameters, json_serializer)
443
+ return connection.query(sql, job_config=final_job_config)
444
+
445
+
446
+ def build_load_job_config(file_format: "StorageFormat", overwrite: bool) -> "LoadJobConfig":
447
+ job_config = LoadJobConfig()
448
+ job_config.source_format = _map_bigquery_source_format(file_format)
449
+ job_config.write_disposition = "WRITE_TRUNCATE" if overwrite else "WRITE_APPEND"
450
+ return job_config
451
+
452
+
453
+ def build_load_job_telemetry(job: QueryJob, table: str, *, format_label: str) -> "StorageTelemetry":
454
+ try:
455
+ properties = cast("Any", job)._properties
456
+ except AttributeError:
457
+ properties = {}
458
+ load_stats = properties.get("statistics", {}).get("load", {})
459
+ rows_processed = int(load_stats.get("outputRows") or 0)
460
+ bytes_processed = int(load_stats.get("outputBytes") or load_stats.get("inputFileBytes", 0) or 0)
461
+ duration = 0.0
462
+ if job.ended and job.started:
463
+ duration = (job.ended - job.started).total_seconds()
464
+ telemetry: StorageTelemetry = {
465
+ "destination": table,
466
+ "rows_processed": rows_processed,
467
+ "bytes_processed": bytes_processed,
468
+ "duration_s": duration,
469
+ "format": format_label,
470
+ }
471
+ return telemetry
472
+
473
+
474
+ def is_simple_insert(sql: str, expression: "exp.Expr | None" = None, *, allow_parse: bool = True) -> bool:
475
+ """Check if SQL is a simple INSERT VALUES statement.
476
+
477
+ Args:
478
+ sql: SQL string to inspect.
479
+ expression: Optional pre-parsed expression to reuse.
480
+ allow_parse: When False, skip parsing and return False if expression is missing.
481
+ """
482
+ if expression is None and not allow_parse:
483
+ return False
484
+ try:
485
+ parsed = expression or sqlglot.parse_one(sql, dialect="bigquery")
486
+ if not isinstance(parsed, exp.Insert):
487
+ return False
488
+ return parsed.expression is not None or parsed.find(exp.Values) is not None
489
+ except Exception:
490
+ return False
491
+
492
+
493
+ def extract_insert_table(sql: str, expression: "exp.Expr | None" = None, *, allow_parse: bool = True) -> str | None:
494
+ """Extract table name from INSERT statement using sqlglot.
495
+
496
+ Args:
497
+ sql: SQL string to inspect.
498
+ expression: Optional pre-parsed expression to reuse.
499
+ allow_parse: When False, skip parsing and return None if expression is missing.
500
+ """
501
+ if expression is None and not allow_parse:
502
+ return None
503
+ try:
504
+ parsed = expression or sqlglot.parse_one(sql, dialect="bigquery")
505
+ if isinstance(parsed, exp.Insert):
506
+ table = parsed.find(exp.Table)
507
+ if table:
508
+ parts = []
509
+ if table.catalog:
510
+ parts.append(table.catalog)
511
+ if table.db:
512
+ parts.append(table.db)
513
+ parts.append(table.name)
514
+ return ".".join(parts)
515
+ except Exception:
516
+ logger.debug("Failed to extract table name from INSERT statement")
517
+ return None
518
+
519
+
520
+ def _map_bigquery_source_format(file_format: "StorageFormat") -> str:
521
+ if file_format == "parquet":
522
+ return "PARQUET"
523
+ if file_format in {"json", "jsonl"}:
524
+ return "NEWLINE_DELIMITED_JSON"
525
+ msg = f"BigQuery does not support loading '{file_format}' artifacts via the storage bridge"
526
+ raise StorageCapabilityError(msg, capability="parquet_import_enabled")
527
+
528
+
529
+ def resolve_column_names(schema: Any | None, cache: "dict[int, tuple[Any, list[str]]]") -> list[str]:
530
+ """Resolve and cache BigQuery schema column names.
531
+
532
+ Args:
533
+ schema: BigQuery schema object.
534
+ cache: Driver-local cache keyed by ``id(schema)``.
535
+
536
+ Returns:
537
+ Resolved column names.
538
+ """
539
+ if not schema:
540
+ return []
541
+
542
+ cache_key = id(schema)
543
+ cached = cache.get(cache_key)
544
+ if cached is not None and cached[0] is schema:
545
+ return cached[1]
546
+
547
+ column_names = [field.name for field in schema]
548
+ if len(cache) >= COLUMN_CACHE_MAX_SIZE:
549
+ cache.pop(next(iter(cache)))
550
+ cache[cache_key] = (schema, column_names)
551
+ return column_names
552
+
553
+
554
+ def collect_rows(
555
+ job_result: Any,
556
+ schema: Any | None,
557
+ *,
558
+ column_names: "list[str] | None" = None,
559
+ column_name_cache: "dict[int, tuple[Any, list[str]]] | None" = None,
560
+ ) -> "tuple[list[Any], list[str]]":
561
+ """Collect BigQuery rows and schema into structured lists.
562
+
563
+ Returns raw BigQuery Row objects without copying to dicts.
564
+ Lazy dict materialization is handled by SQLResult when needed.
565
+
566
+ Args:
567
+ job_result: BigQuery job result iterator.
568
+ schema: BigQuery schema object (or None).
569
+ column_names: Optional precomputed column names.
570
+ column_name_cache: Optional cache used when column names are not precomputed.
571
+
572
+ Returns:
573
+ Tuple of (rows_list, column_names).
574
+ """
575
+ rows_list = job_result if isinstance(job_result, list) else list(iter(job_result))
576
+ if column_names is not None:
577
+ resolved_column_names = column_names
578
+ elif column_name_cache is not None:
579
+ resolved_column_names = resolve_column_names(schema, column_name_cache)
580
+ else:
581
+ resolved_column_names = [field.name for field in schema] if schema else []
582
+ return rows_list, resolved_column_names
583
+
584
+
585
+ def build_dml_rowcount(job: Any, fallback: int) -> int:
586
+ """Resolve affected rowcount for BigQuery DML jobs.
587
+
588
+ Args:
589
+ job: BigQuery job object with optional num_dml_affected_rows.
590
+ fallback: Fallback rowcount when job does not expose metadata.
591
+
592
+ Returns:
593
+ Resolved rowcount.
594
+ """
595
+ try:
596
+ rowcount = job.num_dml_affected_rows
597
+ except AttributeError:
598
+ return fallback
599
+ if rowcount is None:
600
+ return fallback
601
+ if isinstance(rowcount, int):
602
+ return rowcount
603
+ return fallback
604
+
605
+
606
+ def normalize_script_rowcount(previous: int, job: Any) -> int:
607
+ """Normalize BigQuery script rowcount from the latest job metadata.
608
+
609
+ Args:
610
+ previous: Previously recorded rowcount value.
611
+ job: BigQuery job with optional num_dml_affected_rows metadata.
612
+
613
+ Returns:
614
+ Updated rowcount value.
615
+ """
616
+ return build_dml_rowcount(job, previous)
617
+
618
+
619
+ def build_profile() -> "DriverParameterProfile":
620
+ """Create the BigQuery driver parameter profile."""
621
+
622
+ return DriverParameterProfile(
623
+ name="BigQuery",
624
+ default_style=ParameterStyle.NAMED_AT,
625
+ supported_styles={ParameterStyle.NAMED_AT, ParameterStyle.QMARK},
626
+ default_execution_style=ParameterStyle.NAMED_AT,
627
+ supported_execution_styles={ParameterStyle.NAMED_AT},
628
+ has_native_list_expansion=True,
629
+ preserve_parameter_format=True,
630
+ needs_static_script_compilation=False,
631
+ allow_mixed_parameter_styles=False,
632
+ preserve_original_params_for_many=False,
633
+ json_serializer_strategy="helper",
634
+ custom_type_coercions={
635
+ int: _identity,
636
+ float: _identity,
637
+ bytes: _identity,
638
+ datetime.datetime: _identity,
639
+ datetime.date: _identity,
640
+ datetime.time: _identity,
641
+ Decimal: _identity,
642
+ dict: _identity,
643
+ list: _identity,
644
+ type(None): _return_none,
645
+ **build_uuid_coercions(),
646
+ },
647
+ default_ast_transformer=build_null_pruning_transform(dialect="bigquery"),
648
+ extras={"json_tuple_strategy": "tuple", "type_coercion_overrides": {list: _identity, tuple: _tuple_to_list}},
649
+ default_dialect="bigquery",
650
+ )
651
+
652
+
653
+ driver_profile = build_profile()
654
+
655
+
656
+ def build_statement_config(*, json_serializer: "Callable[[Any], str] | None" = None) -> StatementConfig:
657
+ """Construct the BigQuery statement configuration with optional JSON serializer."""
658
+ serializer = json_serializer or to_json
659
+ profile = driver_profile
660
+ return build_statement_config_from_profile(
661
+ profile, statement_overrides={"dialect": "bigquery"}, json_serializer=serializer
662
+ )
663
+
664
+
665
+ default_statement_config = build_statement_config()
666
+
667
+
668
+ def _normalize_bigquery_driver_features(
669
+ driver_features: "Mapping[str, Any] | None",
670
+ ) -> "tuple[dict[str, Any], Callable[[Any], str] | None, Callable[[Any], None] | None, Any | None]":
671
+ """Normalize driver feature defaults and extract core options."""
672
+ features: dict[str, Any] = dict(driver_features) if driver_features else {}
673
+ user_connection_hook = features.pop("on_connection_create", None)
674
+ features.setdefault("enable_uuid_conversion", True)
675
+ serializer = features.setdefault("json_serializer", to_json)
676
+ connection_instance = features.get("connection_instance")
677
+ if connection_instance is not None:
678
+ features.pop("connection_instance", None)
679
+
680
+ return (
681
+ features,
682
+ cast("Callable[[Any], str] | None", serializer),
683
+ cast("Callable[[Any], None] | None", user_connection_hook),
684
+ connection_instance,
685
+ )
686
+
687
+
688
+ def apply_driver_features(
689
+ driver_features: "Mapping[str, Any] | None",
690
+ ) -> "tuple[dict[str, Any], Callable[[Any], str] | None, Callable[[Any], None] | None, Any | None]":
691
+ """Apply BigQuery driver feature defaults and extract core options."""
692
+ return _normalize_bigquery_driver_features(driver_features)
693
+
694
+
695
+ def _create_bigquery_error(
696
+ error: Any, code: "int | None", error_class: type[SQLSpecError], description: str
697
+ ) -> SQLSpecError:
698
+ """Create a SQLSpec exception from a BigQuery error.
699
+
700
+ Args:
701
+ error: The original BigQuery exception
702
+ code: HTTP status code
703
+ error_class: The SQLSpec exception class to instantiate
704
+ description: Human-readable description of the error type
705
+
706
+ Returns:
707
+ A new SQLSpec exception instance with the original as its cause
708
+ """
709
+ code_str = f"[HTTP {code}]" if code else ""
710
+ msg = f"BigQuery {description} {code_str}: {error}" if code_str else f"BigQuery {description}: {error}"
711
+ exc = error_class(msg)
712
+ exc.__cause__ = error
713
+ return exc
714
+
715
+
716
+ def create_mapped_exception(error: Any) -> SQLSpecError:
717
+ """Map BigQuery exceptions to SQLSpec exceptions.
718
+
719
+ This is a factory function that returns an exception instance rather than
720
+ raising. This pattern is more robust for use in __exit__ handlers and
721
+ avoids issues with exception control flow in different Python versions.
722
+
723
+ Mapping priority:
724
+ 1. HTTP status codes from BigQuery API
725
+ 2. Message pattern matching for specific errors
726
+ 3. Default SQLSpecError fallback
727
+
728
+ Args:
729
+ error: The BigQuery exception to map
730
+
731
+ Returns:
732
+ A SQLSpec exception that wraps the original error
733
+ """
734
+ try:
735
+ status_code = error.code
736
+ except AttributeError:
737
+ status_code = None
738
+ error_msg = str(error).lower()
739
+
740
+ # Resource conflict - unique/already exists
741
+ if status_code == HTTP_CONFLICT or "already exists" in error_msg:
742
+ return _create_bigquery_error(error, status_code, UniqueViolationError, "resource already exists")
743
+
744
+ # Resource not found
745
+ if status_code == HTTP_NOT_FOUND or "not found" in error_msg:
746
+ return _create_bigquery_error(error, status_code, NotFoundError, "resource not found")
747
+
748
+ # Query timeout/cancellation
749
+ if "timeout" in error_msg or "deadline exceeded" in error_msg or "cancelled" in error_msg:
750
+ return _create_bigquery_error(error, status_code, QueryTimeoutError, "query timeout or cancelled")
751
+
752
+ # Bad request - parse message for details
753
+ if status_code == HTTP_BAD_REQUEST:
754
+ if "syntax" in error_msg or "invalid query" in error_msg:
755
+ return _create_bigquery_error(error, status_code, SQLParsingError, "query syntax error")
756
+ if "type" in error_msg or "format" in error_msg:
757
+ return _create_bigquery_error(error, status_code, DataError, "data error")
758
+ return _create_bigquery_error(error, status_code, SQLSpecError, "error")
759
+
760
+ # Permission denied - use PermissionDeniedError instead of DatabaseConnectionError
761
+ if status_code == HTTP_FORBIDDEN or "access denied" in error_msg or "permission denied" in error_msg:
762
+ return _create_bigquery_error(error, status_code, PermissionDeniedError, "permission denied")
763
+
764
+ # Server errors
765
+ if status_code and status_code >= HTTP_SERVER_ERROR:
766
+ return _create_bigquery_error(error, status_code, OperationalError, "operational error")
767
+
768
+ return _create_bigquery_error(error, status_code, SQLSpecError, "error")