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,167 @@
1
+ """Temporal query expressions.
2
+
3
+ Overrides sqlglot's built-in version_sql generators to produce dialect-specific
4
+ time-travel query syntax. Uses sqlglot's exp.Version and Table.version slot.
5
+
6
+ Supported syntax by dialect:
7
+ - BigQuery: table FOR SYSTEM_TIME AS OF timestamp (built-in)
8
+ - Oracle: table AS OF TIMESTAMP timestamp / AS OF SCN scn
9
+ - Snowflake: table AT (TIMESTAMP => timestamp) / BEFORE (...)
10
+ - DuckDB: table AT (TIMESTAMP => timestamp)
11
+ - CockroachDB (Postgres): table AS OF SYSTEM TIME timestamp
12
+ """
13
+
14
+ from sqlglot import exp
15
+ from sqlglot.dialects.bigquery import BigQuery
16
+ from sqlglot.dialects.duckdb import DuckDB
17
+ from sqlglot.dialects.oracle import Oracle
18
+ from sqlglot.dialects.postgres import Postgres
19
+ from sqlglot.dialects.snowflake import Snowflake
20
+ from sqlglot.generator import (
21
+ _DISPATCH_CACHE, # pyright: ignore[reportPrivateUsage]
22
+ Generator,
23
+ )
24
+ from sqlglot.generators.bigquery import BigQueryGenerator
25
+ from sqlglot.generators.duckdb import DuckDBGenerator
26
+ from sqlglot.generators.oracle import OracleGenerator
27
+ from sqlglot.generators.postgres import PostgresGenerator
28
+ from sqlglot.generators.snowflake import SnowflakeGenerator
29
+
30
+ __all__ = ("create_temporal_table", "register_version_generators")
31
+
32
+
33
+ def _oracle_version_sql(self: OracleGenerator, expression: exp.Version) -> str:
34
+ """Oracle: AS OF TIMESTAMP timestamp or AS OF SCN scn."""
35
+ expr = self.sql(expression, "expression")
36
+ this = expression.name or "TIMESTAMP"
37
+ return f"AS OF {this} {expr}"
38
+
39
+
40
+ def _bigquery_version_sql(self: BigQueryGenerator, expression: exp.Version) -> str:
41
+ """BigQuery: FOR SYSTEM_TIME AS OF timestamp."""
42
+ expr = self.sql(expression, "expression")
43
+ return f"FOR SYSTEM_TIME AS OF {expr}"
44
+
45
+
46
+ def _snowflake_version_sql(self: SnowflakeGenerator, expression: exp.Version) -> str:
47
+ """Snowflake: AT (TIMESTAMP => timestamp) or BEFORE (TIMESTAMP => ...).
48
+
49
+ AS OF is mapped to AT, and BEFORE is supported for point-before queries.
50
+ """
51
+ kind = expression.text("kind")
52
+ expr = self.sql(expression, "expression")
53
+ this = expression.name or "TIMESTAMP"
54
+ if kind and "BEFORE" in kind.upper():
55
+ return f"BEFORE ({this} => {expr})"
56
+ return f"AT ({this} => {expr})"
57
+
58
+
59
+ def _duckdb_version_sql(self: DuckDBGenerator, expression: exp.Version) -> str:
60
+ """DuckDB: AT (TIMESTAMP => timestamp)."""
61
+ expr = self.sql(expression, "expression")
62
+ return f"AT (TIMESTAMP => {expr})"
63
+
64
+
65
+ def _cockroachdb_version_sql(self: PostgresGenerator, expression: exp.Version) -> str:
66
+ """CockroachDB (via Postgres dialect): AS OF SYSTEM TIME timestamp."""
67
+ expr = self.sql(expression, "expression")
68
+ return f"AS OF SYSTEM TIME {expr}"
69
+
70
+
71
+ def _default_version_sql(self: Generator, expression: exp.Version) -> str:
72
+ """Default: AS OF SYSTEM TIME timestamp (CockroachDB style).
73
+
74
+ When no dialect is specified, we default to CockroachDB/Postgres style
75
+ which is commonly expected for time-travel queries.
76
+ """
77
+ expr = self.sql(expression, "expression")
78
+ return f"AS OF SYSTEM TIME {expr}"
79
+
80
+
81
+ def create_temporal_table(
82
+ table: "str | exp.Table | exp.Expr", as_of: "exp.Expr | str", kind: "str | None" = None
83
+ ) -> exp.Table:
84
+ """Create a table expression with temporal (time-travel) version clause.
85
+
86
+ Args:
87
+ table: Table name or expression.
88
+ as_of: Timestamp or SCN expression for the point-in-time.
89
+ kind: Optional version kind (e.g., "TIMESTAMP", "SCN", "SYSTEM TIME").
90
+ Defaults to dialect-appropriate value.
91
+
92
+ Returns:
93
+ Table expression with version clause that generates dialect-specific SQL.
94
+
95
+ Notes:
96
+ Inputs are normalized before building the ``exp.Version`` clause so both string table names and literal timestamps
97
+ work consistently.
98
+
99
+ Example:
100
+ >>> from sqlspec.builder import create_temporal_table
101
+ >>> from sqlglot import exp
102
+ >>> t = create_temporal_table(
103
+ ... "orders", exp.Literal.string("2024-01-01")
104
+ ... )
105
+ >>> t.sql(dialect="oracle")
106
+ "orders AS OF TIMESTAMP '2024-01-01'"
107
+ >>> t.sql(dialect="bigquery")
108
+ "orders FOR SYSTEM_TIME AS OF '2024-01-01'"
109
+ """
110
+ if isinstance(table, str):
111
+ table_expr = exp.to_table(table)
112
+ elif isinstance(table, exp.Table):
113
+ table_expr = table.copy()
114
+ else:
115
+ table_expr = exp.to_table(str(table))
116
+
117
+ as_of_expr = exp.Literal.string(as_of) if isinstance(as_of, str) else as_of
118
+
119
+ version = exp.Version(this=kind or "TIMESTAMP", kind="AS OF", expression=as_of_expr)
120
+
121
+ table_expr.set("version", version)
122
+ return table_expr
123
+
124
+
125
+ _VERSION_GENERATORS_REGISTERED = False
126
+
127
+
128
+ def register_version_generators() -> None:
129
+ """Register dialect-specific version_sql generators.
130
+
131
+ This function is idempotent - calling it multiple times has no effect
132
+ after the first call. It is called automatically when the builder
133
+ module is imported.
134
+
135
+ Registers custom SQL generators for temporal (time-travel) queries:
136
+ - Default (no dialect): AS OF SYSTEM TIME (CockroachDB style)
137
+ - BigQuery: FOR SYSTEM_TIME AS OF
138
+ - Oracle: AS OF TIMESTAMP / AS OF SCN
139
+ - Snowflake: AT (TIMESTAMP => ...) / BEFORE (...)
140
+ - DuckDB: AT (TIMESTAMP => ...)
141
+ - Postgres/CockroachDB: AS OF SYSTEM TIME
142
+ """
143
+ global _VERSION_GENERATORS_REGISTERED
144
+ if _VERSION_GENERATORS_REGISTERED:
145
+ return
146
+
147
+ Generator.TRANSFORMS[exp.Version] = _default_version_sql
148
+
149
+ BigQuery.Generator.TRANSFORMS[exp.Version] = _bigquery_version_sql
150
+ Oracle.Generator.TRANSFORMS[exp.Version] = _oracle_version_sql
151
+ Snowflake.Generator.TRANSFORMS[exp.Version] = _snowflake_version_sql
152
+ DuckDB.Generator.TRANSFORMS[exp.Version] = _duckdb_version_sql
153
+ Postgres.Generator.TRANSFORMS[exp.Version] = _cockroachdb_version_sql
154
+
155
+ # Invalidate sqlglot's per-class dispatch cache so new TRANSFORMS entries
156
+ # are picked up by the next Generator instantiation.
157
+ for gen_cls in (
158
+ Generator,
159
+ BigQuery.Generator,
160
+ Oracle.Generator,
161
+ Snowflake.Generator,
162
+ DuckDB.Generator,
163
+ Postgres.Generator,
164
+ ):
165
+ _DISPATCH_CACHE.pop(gen_cls, None)
166
+
167
+ _VERSION_GENERATORS_REGISTERED = True
@@ -0,0 +1,173 @@
1
+ """UPDATE statement builder.
2
+
3
+ Provides a fluent interface for building SQL UPDATE queries with
4
+ parameter binding and validation.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any, cast
8
+
9
+ from sqlglot import exp
10
+ from typing_extensions import Self
11
+
12
+ from sqlspec.builder._base import BuiltQuery, QueryBuilder
13
+ from sqlspec.builder._dml import UpdateFromClauseMixin, UpdateSetClauseMixin, UpdateTableClauseMixin
14
+ from sqlspec.builder._explain import ExplainMixin
15
+ from sqlspec.builder._join import build_join_clause
16
+ from sqlspec.builder._select import ReturningClauseMixin, WhereClauseMixin
17
+ from sqlspec.core import SQLResult
18
+ from sqlspec.exceptions import SQLBuilderError
19
+
20
+ if TYPE_CHECKING:
21
+ from sqlglot.dialects.dialect import DialectType
22
+
23
+ from sqlspec.builder._select import Select
24
+ from sqlspec.protocols import SQLBuilderProtocol
25
+
26
+ __all__ = ("Update",)
27
+
28
+
29
+ class Update(
30
+ QueryBuilder,
31
+ WhereClauseMixin,
32
+ ReturningClauseMixin,
33
+ UpdateSetClauseMixin,
34
+ UpdateFromClauseMixin,
35
+ UpdateTableClauseMixin,
36
+ ExplainMixin,
37
+ ):
38
+ """Builder for UPDATE statements.
39
+
40
+ Constructs SQL UPDATE statements with parameter binding and validation.
41
+
42
+ Example:
43
+ ```python
44
+ update_query = (
45
+ Update()
46
+ .table("users")
47
+ .set_(name="John Doe")
48
+ .set_(email="john@example.com")
49
+ .where("id = 1")
50
+ )
51
+
52
+ update_query = (
53
+ Update("users").set_(name="John Doe").where("id = 1")
54
+ )
55
+
56
+ update_query = (
57
+ Update()
58
+ .table("users")
59
+ .set_(status="active")
60
+ .where_eq("id", 123)
61
+ )
62
+
63
+ update_query = (
64
+ Update()
65
+ .table("users", "u")
66
+ .set_(name="Updated Name")
67
+ .from_("profiles", "p")
68
+ .where("u.id = p.user_id AND p.is_verified = true")
69
+ )
70
+ ```
71
+ """
72
+
73
+ __slots__ = ()
74
+ _expression: exp.Expr | None
75
+
76
+ def __init__(self, table: str | None = None, **kwargs: Any) -> None:
77
+ """Initialize UPDATE with optional table.
78
+
79
+ Args:
80
+ table: Target table name
81
+ **kwargs: Additional QueryBuilder arguments
82
+ """
83
+ (dialect, schema, enable_optimization, optimize_joins, optimize_predicates, simplify_expressions) = (
84
+ self._parse_query_builder_kwargs(kwargs)
85
+ )
86
+ super().__init__(
87
+ dialect=dialect,
88
+ schema=schema,
89
+ enable_optimization=enable_optimization,
90
+ optimize_joins=optimize_joins,
91
+ optimize_predicates=optimize_predicates,
92
+ simplify_expressions=simplify_expressions,
93
+ )
94
+ self._initialize_expression()
95
+
96
+ if table:
97
+ self.table(table)
98
+
99
+ @property
100
+ def _expected_result_type(self) -> "type[SQLResult]":
101
+ """Return the expected result type for this builder."""
102
+ return SQLResult
103
+
104
+ def _create_base_expression(self) -> exp.Update:
105
+ """Create a base UPDATE expression.
106
+
107
+ Returns:
108
+ A new sqlglot Update expression with empty clauses.
109
+ """
110
+ return exp.Update(this=None, expressions=[], joins=[])
111
+
112
+ def join(
113
+ self,
114
+ table: "str | exp.Expr | Select",
115
+ on: "str | exp.Expr",
116
+ alias: "str | None" = None,
117
+ join_type: str = "INNER",
118
+ ) -> "Self":
119
+ """Add JOIN clause to the UPDATE statement.
120
+
121
+ Args:
122
+ table: The table name, expression, or subquery to join.
123
+ on: The JOIN condition.
124
+ alias: Optional alias for the joined table.
125
+ join_type: Type of join (INNER, LEFT, RIGHT, FULL).
126
+
127
+ Returns:
128
+ The current builder instance for method chaining.
129
+
130
+ Raises:
131
+ SQLBuilderError: If the current expression is not an UPDATE statement.
132
+ """
133
+ if self._expression is None or not isinstance(self._expression, exp.Update):
134
+ msg = "Cannot add JOIN clause to non-UPDATE expression."
135
+ raise SQLBuilderError(msg)
136
+
137
+ join_expr = build_join_clause(cast("SQLBuilderProtocol", self), table, on, alias, join_type)
138
+
139
+ if not self._expression.args.get("joins"):
140
+ self._expression.set("joins", [])
141
+ self._expression.args["joins"].append(join_expr)
142
+
143
+ return self
144
+
145
+ def build(self, dialect: "DialectType" = None) -> "BuiltQuery":
146
+ """Build the UPDATE query with validation.
147
+
148
+ Args:
149
+ dialect: Optional dialect override for SQL generation.
150
+
151
+ Returns:
152
+ BuiltQuery: The built query with SQL and parameters.
153
+
154
+ Raises:
155
+ SQLBuilderError: If no table is set or expression is not an UPDATE.
156
+ """
157
+ if self._expression is None:
158
+ msg = "UPDATE expression not initialized."
159
+ raise SQLBuilderError(msg)
160
+
161
+ if not isinstance(self._expression, exp.Update):
162
+ msg = "No UPDATE expression to build or expression is of the wrong type."
163
+ raise SQLBuilderError(msg)
164
+
165
+ if self._expression.this is None:
166
+ msg = "No table specified for UPDATE statement."
167
+ raise SQLBuilderError(msg)
168
+
169
+ if not self._expression.args.get("expressions"):
170
+ msg = "At least one SET clause must be specified for UPDATE statement."
171
+ raise SQLBuilderError(msg)
172
+
173
+ return super().build(dialect=dialect)
@@ -0,0 +1,330 @@
1
+ """Vector distance helpers and SQL generator registration."""
2
+
3
+ # ruff: noqa: N802
4
+ # pyright: ignore[reportConstantRedefinition]
5
+ from collections.abc import Callable, MutableMapping
6
+ from typing import TYPE_CHECKING, Any, Final, TypeAlias, cast
7
+
8
+ from sqlglot import exp
9
+
10
+ if TYPE_CHECKING:
11
+ from sqlglot.dialects.bigquery import BigQuery
12
+ from sqlglot.dialects.duckdb import DuckDB
13
+ from sqlglot.dialects.mysql import MySQL
14
+ from sqlglot.dialects.oracle import Oracle
15
+ from sqlglot.dialects.postgres import Postgres
16
+ from sqlglot.generator import Generator
17
+
18
+ from sqlspec.dialects.spanner import Spangres, Spanner
19
+
20
+ SupportedVectorDistanceDialect: TypeAlias = "BigQuery | DuckDB | MySQL | Oracle | Postgres | Spangres | Spanner"
21
+
22
+ __all__ = (
23
+ "VectorDistance",
24
+ "has_vector_distance_ancestor",
25
+ "is_vector_distance_expression",
26
+ "render_vector_distance_bigquery",
27
+ "render_vector_distance_duckdb",
28
+ "render_vector_distance_generic",
29
+ "render_vector_distance_mysql",
30
+ "render_vector_distance_oracle",
31
+ "render_vector_distance_postgres",
32
+ "vector_distance_metric",
33
+ )
34
+
35
+ _VECTOR_DISTANCE_META_KEY: Final[str] = "sqlspec_vector_distance_metric"
36
+ _OperatorTransform = Callable[[Any, exp.Operator], str]
37
+ _SQLGLOT_VECTOR_DISTANCE_REGISTERED = False
38
+ _BASE_OPERATOR_TRANSFORM: _OperatorTransform | None = None
39
+ _POSTGRES_OPERATOR_TRANSFORM: _OperatorTransform | None = None
40
+ _MYSQL_OPERATOR_TRANSFORM: _OperatorTransform | None = None
41
+ _ORACLE_OPERATOR_TRANSFORM: _OperatorTransform | None = None
42
+ _BIGQUERY_OPERATOR_TRANSFORM: _OperatorTransform | None = None
43
+ _DUCKDB_OPERATOR_TRANSFORM: _OperatorTransform | None = None
44
+ _SPANNER_OPERATOR_TRANSFORM: _OperatorTransform | None = None
45
+ _SPANGRES_OPERATOR_TRANSFORM: _OperatorTransform | None = None
46
+
47
+
48
+ def _normalize_metric(metric: Any) -> str:
49
+ """Normalize vector metrics to a lowercase string."""
50
+ if isinstance(metric, exp.Literal):
51
+ return str(metric.this).lower()
52
+ if isinstance(metric, exp.Identifier):
53
+ identifier = metric.this
54
+ return identifier.lower() if isinstance(identifier, str) else "euclidean"
55
+ if isinstance(metric, str):
56
+ return metric.lower()
57
+ return "euclidean"
58
+
59
+
60
+ def is_vector_distance_expression(expression: object) -> bool:
61
+ """Return True when an Operator node is a SQLSpec vector-distance expression."""
62
+ return isinstance(expression, exp.Operator) and _VECTOR_DISTANCE_META_KEY in expression.meta
63
+
64
+
65
+ def has_vector_distance_ancestor(expression: exp.Expr) -> bool:
66
+ """Return True when any ancestor is a SQLSpec vector-distance expression."""
67
+ parent = expression.parent
68
+ while parent is not None:
69
+ if is_vector_distance_expression(parent):
70
+ return True
71
+ parent = parent.parent
72
+ return False
73
+
74
+
75
+ def vector_distance_metric(expression: object) -> str:
76
+ """Get the normalized vector-distance metric from an Operator node."""
77
+ if not isinstance(expression, exp.Operator):
78
+ msg = f"Expected sqlglot Operator, got {type(expression)}"
79
+ raise TypeError(msg)
80
+ metric = expression.meta.get(_VECTOR_DISTANCE_META_KEY)
81
+ if isinstance(metric, str):
82
+ return metric
83
+ operator = expression.args.get("operator")
84
+ return str(operator).lower() if operator is not None else "euclidean"
85
+
86
+
87
+ def _build_vector_distance(this: exp.Expr, expression: exp.Expr, metric: Any = "euclidean") -> exp.Operator:
88
+ normalized_metric = _normalize_metric(metric)
89
+ node = exp.Operator(this=this, expression=expression, operator=normalized_metric)
90
+ node.meta[_VECTOR_DISTANCE_META_KEY] = normalized_metric
91
+ return node
92
+
93
+
94
+ def VectorDistance(*, this: exp.Expr, expression: exp.Expr, metric: Any = "euclidean") -> exp.Operator:
95
+ """Build a SQLSpec vector-distance expression."""
96
+ _register_with_sqlglot()
97
+ return _build_vector_distance(this=this, expression=expression, metric=metric)
98
+
99
+
100
+ def render_vector_distance_postgres(left: str, right: str, metric: str) -> str:
101
+ """Render PostgreSQL pgvector operator syntax."""
102
+ operator_map = {"euclidean": "<->", "cosine": "<=>", "inner_product": "<#>"}
103
+
104
+ operator = operator_map.get(metric)
105
+ if operator:
106
+ return f"{left} {operator} {right}"
107
+
108
+ return render_vector_distance_generic(left, right, metric)
109
+
110
+
111
+ def render_vector_distance_mysql(left: str, right: str, metric: str) -> str:
112
+ """Render MySQL DISTANCE function syntax."""
113
+ metric_map = {"euclidean": "EUCLIDEAN", "cosine": "COSINE", "inner_product": "DOT"}
114
+
115
+ mysql_metric = metric_map.get(metric, "EUCLIDEAN")
116
+
117
+ if ("ARRAY" in right or "[" in right) and "STRING_TO_VECTOR" not in right:
118
+ right = f"STRING_TO_VECTOR({right})"
119
+
120
+ return f"DISTANCE({left}, {right}, '{mysql_metric}')"
121
+
122
+
123
+ def render_vector_distance_oracle(left: str, right: str, metric: str) -> str:
124
+ """Render Oracle VECTOR_DISTANCE function syntax."""
125
+ metric_map = {
126
+ "euclidean": "EUCLIDEAN",
127
+ "cosine": "COSINE",
128
+ "inner_product": "DOT",
129
+ "euclidean_squared": "EUCLIDEAN_SQUARED",
130
+ }
131
+
132
+ oracle_metric = metric_map.get(metric, "EUCLIDEAN")
133
+
134
+ if ("[" in right or "ARRAY" in right) and "TO_VECTOR" not in right:
135
+ right = f"TO_VECTOR({right})"
136
+
137
+ return f"VECTOR_DISTANCE({left}, {right}, {oracle_metric})"
138
+
139
+
140
+ def render_vector_distance_bigquery(left: str, right: str, metric: str) -> str:
141
+ """Render BigQuery vector distance function syntax."""
142
+ function_map = {"euclidean": "EUCLIDEAN_DISTANCE", "cosine": "COSINE_DISTANCE", "inner_product": "DOT_PRODUCT"}
143
+
144
+ function_name = function_map.get(metric)
145
+ if function_name:
146
+ return f"{function_name}({left}, {right})"
147
+
148
+ return render_vector_distance_generic(left, right, metric)
149
+
150
+
151
+ def render_vector_distance_duckdb(left: str, right: str, metric: str) -> str:
152
+ """Render DuckDB VSS extension function syntax."""
153
+ function_map = {
154
+ "euclidean": "array_distance",
155
+ "cosine": "array_cosine_distance",
156
+ "inner_product": "array_negative_inner_product",
157
+ }
158
+ function_name = function_map.get(metric)
159
+ if function_name:
160
+ return f"{function_name}({left}, CAST({right} AS DOUBLE[]))"
161
+
162
+ return render_vector_distance_generic(left, right, metric)
163
+
164
+
165
+ def render_vector_distance_generic(left: str, right: str, metric: str) -> str:
166
+ """Render generic VECTOR_DISTANCE function syntax."""
167
+ return f"VECTOR_DISTANCE({left}, {right}, '{metric.upper()}')"
168
+
169
+
170
+ def _render_with_metric(generator: "Generator", expression: exp.Operator, dialect: str) -> str:
171
+ left_sql = generator.sql(expression, "this")
172
+ right_sql = generator.sql(expression, "expression")
173
+ metric = vector_distance_metric(expression)
174
+
175
+ if dialect == "postgres":
176
+ return render_vector_distance_postgres(left_sql, right_sql, metric)
177
+ if dialect == "mysql":
178
+ return render_vector_distance_mysql(left_sql, right_sql, metric)
179
+ if dialect == "oracle":
180
+ if isinstance(expression.expression, exp.Array):
181
+ values = [
182
+ str(item.this) if isinstance(item, exp.Literal) else generator.sql(item)
183
+ for item in expression.expression.expressions
184
+ ]
185
+ right_sql = f"TO_VECTOR('[{', '.join(values)}]')"
186
+ return render_vector_distance_oracle(left_sql, right_sql, metric)
187
+ if dialect == "bigquery":
188
+ return render_vector_distance_bigquery(left_sql, right_sql, metric)
189
+ if dialect == "duckdb":
190
+ if isinstance(expression.expression, exp.Array) and expression.expression.expressions:
191
+ target_type = f"DOUBLE[{len(expression.expression.expressions)}]"
192
+ else:
193
+ target_type = "DOUBLE[]"
194
+ function_map = {
195
+ "euclidean": "array_distance",
196
+ "cosine": "array_cosine_distance",
197
+ "inner_product": "array_negative_inner_product",
198
+ }
199
+ function_name = function_map.get(metric)
200
+ if function_name:
201
+ return f"{function_name}({left_sql}, CAST({right_sql} AS {target_type}))"
202
+ return render_vector_distance_generic(left_sql, right_sql, metric)
203
+
204
+ return render_vector_distance_generic(left_sql, right_sql, metric)
205
+
206
+
207
+ def _operator_sql_base(generator: "Generator", expression: exp.Operator) -> str:
208
+ if is_vector_distance_expression(expression):
209
+ return _render_with_metric(generator, expression, "generic")
210
+ return _require_operator_transform(_BASE_OPERATOR_TRANSFORM)(generator, expression)
211
+
212
+
213
+ def _operator_sql_postgres(generator: "Generator", expression: exp.Operator) -> str:
214
+ if is_vector_distance_expression(expression):
215
+ return _render_with_metric(generator, expression, "postgres")
216
+ return _require_operator_transform(_POSTGRES_OPERATOR_TRANSFORM)(generator, expression)
217
+
218
+
219
+ def _operator_sql_mysql(generator: "Generator", expression: exp.Operator) -> str:
220
+ if is_vector_distance_expression(expression):
221
+ return _render_with_metric(generator, expression, "mysql")
222
+ return _require_operator_transform(_MYSQL_OPERATOR_TRANSFORM)(generator, expression)
223
+
224
+
225
+ def _operator_sql_oracle(generator: "Generator", expression: exp.Operator) -> str:
226
+ if is_vector_distance_expression(expression):
227
+ return _render_with_metric(generator, expression, "oracle")
228
+ return _require_operator_transform(_ORACLE_OPERATOR_TRANSFORM)(generator, expression)
229
+
230
+
231
+ def _operator_sql_bigquery(generator: "Generator", expression: exp.Operator) -> str:
232
+ if is_vector_distance_expression(expression):
233
+ return _render_with_metric(generator, expression, "bigquery")
234
+ return _require_operator_transform(_BIGQUERY_OPERATOR_TRANSFORM)(generator, expression)
235
+
236
+
237
+ def _operator_sql_duckdb(generator: "Generator", expression: exp.Operator) -> str:
238
+ if is_vector_distance_expression(expression):
239
+ return _render_with_metric(generator, expression, "duckdb")
240
+ return _require_operator_transform(_DUCKDB_OPERATOR_TRANSFORM)(generator, expression)
241
+
242
+
243
+ def _operator_sql_spanner(generator: "Generator", expression: exp.Operator) -> str:
244
+ if is_vector_distance_expression(expression):
245
+ return _render_with_metric(generator, expression, "bigquery")
246
+ return _require_operator_transform(_SPANNER_OPERATOR_TRANSFORM)(generator, expression)
247
+
248
+
249
+ def _operator_sql_spangres(generator: "Generator", expression: exp.Operator) -> str:
250
+ if is_vector_distance_expression(expression):
251
+ return _render_with_metric(generator, expression, "postgres")
252
+ return _require_operator_transform(_SPANGRES_OPERATOR_TRANSFORM)(generator, expression)
253
+
254
+
255
+ def _require_operator_transform(transform: _OperatorTransform | None) -> _OperatorTransform:
256
+ """Return a registered fallback transform or fail loudly."""
257
+ if transform is None:
258
+ msg = "Vector-distance SQLGlot transforms have not been registered"
259
+ raise RuntimeError(msg)
260
+ return transform
261
+
262
+
263
+ def _register_operator_transform(
264
+ transforms: MutableMapping[type[exp.Expr], "_OperatorTransform"], wrapper: "_OperatorTransform"
265
+ ) -> None:
266
+ """Install an operator transform wrapper."""
267
+ transforms[exp.Operator] = wrapper
268
+
269
+
270
+ def _register_with_sqlglot() -> None:
271
+ """Register vector-distance Operator rendering with SQLGlot generators."""
272
+ global \
273
+ _SQLGLOT_VECTOR_DISTANCE_REGISTERED, \
274
+ _BASE_OPERATOR_TRANSFORM, \
275
+ _POSTGRES_OPERATOR_TRANSFORM, \
276
+ _MYSQL_OPERATOR_TRANSFORM, \
277
+ _ORACLE_OPERATOR_TRANSFORM, \
278
+ _BIGQUERY_OPERATOR_TRANSFORM, \
279
+ _DUCKDB_OPERATOR_TRANSFORM, \
280
+ _SPANNER_OPERATOR_TRANSFORM, \
281
+ _SPANGRES_OPERATOR_TRANSFORM
282
+
283
+ if _SQLGLOT_VECTOR_DISTANCE_REGISTERED:
284
+ return
285
+
286
+ from sqlglot.dialects.bigquery import BigQuery
287
+ from sqlglot.dialects.duckdb import DuckDB
288
+ from sqlglot.dialects.mysql import MySQL
289
+ from sqlglot.dialects.oracle import Oracle
290
+ from sqlglot.dialects.postgres import Postgres
291
+ from sqlglot.generator import Generator
292
+
293
+ from sqlspec.dialects.spanner import Spangres, Spanner
294
+
295
+ _BASE_OPERATOR_TRANSFORM = cast("_OperatorTransform", Generator.TRANSFORMS[exp.Operator])
296
+ _POSTGRES_OPERATOR_TRANSFORM = cast("_OperatorTransform", Postgres.Generator.TRANSFORMS[exp.Operator])
297
+ _MYSQL_OPERATOR_TRANSFORM = cast("_OperatorTransform", MySQL.Generator.TRANSFORMS[exp.Operator])
298
+ _ORACLE_OPERATOR_TRANSFORM = cast("_OperatorTransform", Oracle.Generator.TRANSFORMS[exp.Operator])
299
+ _BIGQUERY_OPERATOR_TRANSFORM = cast("_OperatorTransform", BigQuery.Generator.TRANSFORMS[exp.Operator])
300
+ _DUCKDB_OPERATOR_TRANSFORM = cast("_OperatorTransform", DuckDB.Generator.TRANSFORMS[exp.Operator])
301
+ _SPANNER_OPERATOR_TRANSFORM = cast("_OperatorTransform", Spanner.Generator.TRANSFORMS[exp.Operator])
302
+ _SPANGRES_OPERATOR_TRANSFORM = cast("_OperatorTransform", Spangres.Generator.TRANSFORMS[exp.Operator])
303
+
304
+ _register_operator_transform(Generator.TRANSFORMS, _operator_sql_base)
305
+ _register_operator_transform(Postgres.Generator.TRANSFORMS, _operator_sql_postgres)
306
+ _register_operator_transform(MySQL.Generator.TRANSFORMS, _operator_sql_mysql)
307
+ _register_operator_transform(Oracle.Generator.TRANSFORMS, _operator_sql_oracle)
308
+ _register_operator_transform(BigQuery.Generator.TRANSFORMS, _operator_sql_bigquery)
309
+ _register_operator_transform(DuckDB.Generator.TRANSFORMS, _operator_sql_duckdb)
310
+ _register_operator_transform(Spanner.Generator.TRANSFORMS, _operator_sql_spanner)
311
+ _register_operator_transform(Spangres.Generator.TRANSFORMS, _operator_sql_spangres)
312
+
313
+ # sqlglot caches the dispatch table (built from TRANSFORMS) per Generator class
314
+ # in _DISPATCH_CACHE. We must invalidate stale entries so the next instantiation
315
+ # picks up our new Operator transforms.
316
+ from sqlglot.generator import _DISPATCH_CACHE # pyright: ignore[reportPrivateUsage]
317
+
318
+ for gen_cls in (
319
+ Generator,
320
+ Postgres.Generator,
321
+ MySQL.Generator,
322
+ Oracle.Generator,
323
+ BigQuery.Generator,
324
+ DuckDB.Generator,
325
+ Spanner.Generator,
326
+ Spangres.Generator,
327
+ ):
328
+ _DISPATCH_CACHE.pop(gen_cls, None)
329
+
330
+ _SQLGLOT_VECTOR_DISTANCE_REGISTERED = True