sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,499 @@
1
+ # pyright: reportPrivateUsage=false
2
+ """JOIN operation mixins.
3
+
4
+ Provides mixins for JOIN operations in SELECT statements.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any, Union, cast
8
+
9
+ from mypy_extensions import trait
10
+ from sqlglot import exp
11
+ from typing_extensions import Self
12
+
13
+ from sqlspec.builder._base import BuiltQuery, QueryBuilder
14
+ from sqlspec.builder._parsing_utils import parse_table_expression
15
+ from sqlspec.exceptions import SQLBuilderError
16
+ from sqlspec.utils.type_guards import has_expression_and_parameters, has_expression_and_sql, has_parameter_builder
17
+
18
+ if TYPE_CHECKING:
19
+ from sqlspec.core import SQL
20
+ from sqlspec.protocols import HasParameterBuilderProtocol, SQLBuilderProtocol
21
+
22
+ __all__ = ("JoinBuilder", "JoinClauseMixin", "create_join_builder")
23
+
24
+
25
+ def _handle_sql_object_condition(on: Any, builder: "SQLBuilderProtocol") -> exp.Expression:
26
+ if has_expression_and_parameters(on) and on.expression is not None:
27
+ for param_name, param_value in on.parameters.items():
28
+ builder.add_parameter(param_value, name=param_name)
29
+ return cast("exp.Expression", on.expression)
30
+ if has_expression_and_parameters(on):
31
+ for param_name, param_value in on.parameters.items():
32
+ builder.add_parameter(param_value, name=param_name)
33
+ parsed_expr = exp.maybe_parse(on.sql, dialect=builder.dialect) # pyright: ignore[reportAttributeAccessIssue]
34
+ return parsed_expr if parsed_expr is not None else exp.condition(str(on.sql)) # pyright: ignore[reportAttributeAccessIssue]
35
+
36
+
37
+ def _parse_join_condition(
38
+ builder: "SQLBuilderProtocol", on: Union[str, exp.Expression, "SQL"] | None
39
+ ) -> exp.Expression | None:
40
+ if on is None:
41
+ return None
42
+ if isinstance(on, str):
43
+ return exp.condition(on)
44
+ if has_expression_and_sql(on):
45
+ return _handle_sql_object_condition(on, builder)
46
+ if isinstance(on, exp.Expression):
47
+ return on
48
+ return exp.condition(str(on))
49
+
50
+
51
+ def _handle_query_builder_table(table: Any, alias: str | None, builder: "SQLBuilderProtocol") -> exp.Expression:
52
+ subquery_expression: exp.Expression
53
+ builder_table = cast("HasParameterBuilderProtocol", table)
54
+ parameters = builder_table.parameters
55
+
56
+ if isinstance(table, QueryBuilder):
57
+ subquery_expression = table._build_final_expression(copy=True)
58
+ else:
59
+ subquery_result = builder_table.build()
60
+ sql_text = subquery_result.sql if isinstance(subquery_result, BuiltQuery) else str(subquery_result)
61
+ subquery_expression = exp.maybe_parse(sql_text, dialect=builder.dialect) or exp.convert(sql_text)
62
+
63
+ if parameters:
64
+ for param_name, param_value in parameters.items():
65
+ builder.add_parameter(param_value, name=param_name)
66
+
67
+ subquery_exp = exp.paren(subquery_expression)
68
+ return exp.alias_(subquery_exp, alias) if alias else subquery_exp
69
+
70
+
71
+ def _parse_join_table(
72
+ builder: "SQLBuilderProtocol", table: str | exp.Expression | Any, alias: str | None
73
+ ) -> exp.Expression:
74
+ if isinstance(table, str):
75
+ return parse_table_expression(table, alias)
76
+ if has_parameter_builder(table):
77
+ return _handle_query_builder_table(table, alias, builder)
78
+ if isinstance(table, exp.Expression):
79
+ return table
80
+ return cast("exp.Expression", table)
81
+
82
+
83
+ def _create_join_expression(table_expr: exp.Expression, on_expr: exp.Expression | None, join_type: str) -> exp.Join:
84
+ join_type_upper = join_type.upper()
85
+ if join_type_upper == "INNER":
86
+ return exp.Join(this=table_expr, on=on_expr)
87
+ if join_type_upper == "LEFT":
88
+ return exp.Join(this=table_expr, on=on_expr, side="LEFT")
89
+ if join_type_upper == "RIGHT":
90
+ return exp.Join(this=table_expr, on=on_expr, side="RIGHT")
91
+ if join_type_upper == "FULL":
92
+ return exp.Join(this=table_expr, on=on_expr, side="FULL", kind="OUTER")
93
+ if join_type_upper == "CROSS":
94
+ return exp.Join(this=table_expr, kind="CROSS")
95
+ msg = f"Unsupported join type: {join_type}"
96
+ raise SQLBuilderError(msg)
97
+
98
+
99
+ def _apply_lateral_modifier(join_expr: exp.Join) -> None:
100
+ current_kind = join_expr.args.get("kind")
101
+ current_side = join_expr.args.get("side")
102
+
103
+ if current_kind == "CROSS":
104
+ join_expr.set("kind", "CROSS LATERAL")
105
+ elif current_kind == "OUTER" and current_side == "FULL":
106
+ join_expr.set("side", "FULL")
107
+ join_expr.set("kind", "OUTER LATERAL")
108
+ elif current_side:
109
+ join_expr.set("kind", f"{current_side} LATERAL")
110
+ join_expr.set("side", None)
111
+ else:
112
+ join_expr.set("kind", "LATERAL")
113
+
114
+
115
+ def build_join_clause(
116
+ builder: "SQLBuilderProtocol",
117
+ table: str | exp.Expression | Any,
118
+ on: Union[str, exp.Expression, "SQL"] | None,
119
+ alias: str | None,
120
+ join_type: str,
121
+ *,
122
+ lateral: bool = False,
123
+ ) -> exp.Join:
124
+ table_expr = _parse_join_table(builder, table, alias)
125
+ on_expr = _parse_join_condition(builder, on)
126
+ join_expr = _create_join_expression(table_expr, on_expr, join_type)
127
+ if lateral:
128
+ _apply_lateral_modifier(join_expr)
129
+ return join_expr
130
+
131
+
132
+ @trait
133
+ class JoinClauseMixin:
134
+ """Mixin providing JOIN clause methods for SELECT builders.
135
+
136
+ ``_expression`` is populated by the base builder class so the mixin can append JOINs without initializing the underlying SELECT expression.
137
+ """
138
+
139
+ __slots__ = ()
140
+
141
+ _expression: exp.Expression | None
142
+
143
+ def join(
144
+ self,
145
+ table: str | exp.Expression | Any,
146
+ on: Union[str, exp.Expression, "SQL"] | None = None,
147
+ alias: str | None = None,
148
+ join_type: str = "INNER",
149
+ lateral: bool = False,
150
+ as_of: Any | None = None,
151
+ as_of_type: str | None = None,
152
+ ) -> Self:
153
+ """Add a JOIN clause to the SELECT expression.
154
+
155
+ ``as_of`` attaches a temporal version clause by copying the inner table, honoring existing aliases, and updating the JOIN target without mutating shared expressions.
156
+ """
157
+ builder = cast("SQLBuilderProtocol", self)
158
+ if builder._expression is None:
159
+ builder._expression = exp.Select()
160
+ if not isinstance(builder._expression, exp.Select):
161
+ msg = "JOIN clause is only supported for SELECT statements."
162
+ raise SQLBuilderError(msg)
163
+
164
+ if isinstance(table, exp.Join):
165
+ builder._expression = builder._expression.join(table, copy=False)
166
+ return cast("Self", builder)
167
+
168
+ join_expr = build_join_clause(builder, table, on, alias, join_type, lateral=lateral)
169
+
170
+ if as_of is not None:
171
+ inner_table = join_expr.this
172
+ inner_table = inner_table.copy()
173
+
174
+ target_alias = alias
175
+
176
+ if isinstance(inner_table, exp.Alias):
177
+ target_alias = inner_table.alias
178
+ inner_table = inner_table.this
179
+
180
+ if target_alias is None and isinstance(inner_table, exp.Table):
181
+ alias_expr = inner_table.args.get("alias")
182
+ if alias_expr is not None:
183
+ target_alias = alias_expr.this
184
+ inner_table.set("alias", None)
185
+
186
+ version = exp.Version(this=as_of_type or "TIMESTAMP", kind="AS OF", expression=exp.convert(as_of))
187
+ inner_table.set("version", version)
188
+
189
+ new_this = exp.alias_(inner_table, target_alias) if target_alias else inner_table
190
+ join_expr.set("this", new_this)
191
+
192
+ builder._expression = builder._expression.join(join_expr, copy=False)
193
+ return cast("Self", builder)
194
+
195
+ def inner_join(
196
+ self,
197
+ table: str | exp.Expression | Any,
198
+ on: Union[str, exp.Expression, "SQL"],
199
+ alias: str | None = None,
200
+ as_of: Any | None = None,
201
+ ) -> Self:
202
+ return self.join(table, on, alias, "INNER", as_of=as_of)
203
+
204
+ def left_join(
205
+ self,
206
+ table: str | exp.Expression | Any,
207
+ on: Union[str, exp.Expression, "SQL"],
208
+ alias: str | None = None,
209
+ as_of: Any | None = None,
210
+ ) -> Self:
211
+ return self.join(table, on, alias, "LEFT", as_of=as_of)
212
+
213
+ def right_join(
214
+ self,
215
+ table: str | exp.Expression | Any,
216
+ on: Union[str, exp.Expression, "SQL"],
217
+ alias: str | None = None,
218
+ as_of: Any | None = None,
219
+ ) -> Self:
220
+ return self.join(table, on, alias, "RIGHT", as_of=as_of)
221
+
222
+ def full_join(
223
+ self,
224
+ table: str | exp.Expression | Any,
225
+ on: Union[str, exp.Expression, "SQL"],
226
+ alias: str | None = None,
227
+ as_of: Any | None = None,
228
+ ) -> Self:
229
+ return self.join(table, on, alias, "FULL", as_of=as_of)
230
+
231
+ def cross_join(
232
+ self,
233
+ table: str | exp.Expression | Any,
234
+ alias: str | None = None,
235
+ as_of: Any | None = None,
236
+ as_of_type: str | None = None,
237
+ ) -> Self:
238
+ builder = cast("SQLBuilderProtocol", self)
239
+ if builder._expression is None:
240
+ builder._expression = exp.Select()
241
+ if not isinstance(builder._expression, exp.Select):
242
+ msg = "Cannot add cross join to a non-SELECT expression."
243
+ raise SQLBuilderError(msg)
244
+ table_expr = _parse_join_table(builder, table, alias)
245
+
246
+ if as_of is not None:
247
+ # Handle logic similar to join() but specifically for cross join which parses table earlier
248
+ inner_table = table_expr
249
+
250
+ # Copy to avoid mutating original expression
251
+ inner_table = inner_table.copy()
252
+
253
+ target_alias = alias
254
+ if isinstance(inner_table, exp.Alias):
255
+ target_alias = inner_table.alias
256
+ inner_table = inner_table.this
257
+ elif isinstance(inner_table, exp.Table):
258
+ alias_expr = inner_table.args.get("alias")
259
+ if alias_expr is not None:
260
+ target_alias = alias_expr.this
261
+ inner_table.set("alias", None)
262
+
263
+ # Create Version expression and attach to table
264
+ version = exp.Version(this=as_of_type or "TIMESTAMP", kind="AS OF", expression=exp.convert(as_of))
265
+ inner_table.set("version", version)
266
+ table_expr = exp.alias_(inner_table, target_alias) if target_alias else inner_table
267
+
268
+ join_expr = exp.Join(this=table_expr, kind="CROSS")
269
+ builder._expression = builder._expression.join(join_expr, copy=False)
270
+ return cast("Self", builder)
271
+
272
+ def lateral_join(
273
+ self,
274
+ table: str | exp.Expression | Any,
275
+ on: Union[str, exp.Expression, "SQL"] | None = None,
276
+ alias: str | None = None,
277
+ ) -> Self:
278
+ """Create a LATERAL JOIN.
279
+
280
+ Args:
281
+ table: Table, subquery, or table function to join
282
+ on: Optional join condition (for LATERAL JOINs with ON clause)
283
+ alias: Optional alias for the joined table/subquery
284
+
285
+ Returns:
286
+ Self for method chaining
287
+
288
+ Example:
289
+ ```python
290
+ query = (
291
+ sql
292
+ .select("u.name", "arr.value")
293
+ .from_("users u")
294
+ .lateral_join("UNNEST(u.tags)", alias="arr")
295
+ )
296
+ ```
297
+ """
298
+ return self.join(table, on=on, alias=alias, join_type="INNER", lateral=True)
299
+
300
+ def left_lateral_join(
301
+ self,
302
+ table: str | exp.Expression | Any,
303
+ on: Union[str, exp.Expression, "SQL"] | None = None,
304
+ alias: str | None = None,
305
+ ) -> Self:
306
+ """Create a LEFT LATERAL JOIN.
307
+
308
+ Args:
309
+ table: Table, subquery, or table function to join
310
+ on: Optional join condition
311
+ alias: Optional alias for the joined table/subquery
312
+
313
+ Returns:
314
+ Self for method chaining
315
+ """
316
+ return self.join(table, on=on, alias=alias, join_type="LEFT", lateral=True)
317
+
318
+ def cross_lateral_join(self, table: str | exp.Expression | Any, alias: str | None = None) -> Self:
319
+ """Create a CROSS LATERAL JOIN (no ON condition).
320
+
321
+ Args:
322
+ table: Table, subquery, or table function to join
323
+ alias: Optional alias for the joined table/subquery
324
+
325
+ Returns:
326
+ Self for method chaining
327
+ """
328
+ return self.join(table, on=None, alias=alias, join_type="CROSS", lateral=True)
329
+
330
+
331
+ class JoinBuilder:
332
+ """Builder for JOIN operations with fluent syntax.
333
+
334
+ Example:
335
+ ```python
336
+ from sqlspec import sql
337
+
338
+ # sql.left_join_("posts").on("users.id = posts.user_id")
339
+ join_clause = sql.left_join_("posts").on(
340
+ "users.id = posts.user_id"
341
+ )
342
+
343
+ # Or with query builder
344
+ query = (
345
+ sql
346
+ .select("users.name", "posts.title")
347
+ .from_("users")
348
+ .join(
349
+ sql.left_join_("posts").on(
350
+ "users.id = posts.user_id"
351
+ )
352
+ )
353
+ )
354
+ ```
355
+ """
356
+
357
+ def __init__(self, join_type: str, lateral: bool = False) -> None:
358
+ """Initialize the join builder.
359
+
360
+ Args:
361
+ join_type: Type of join (inner, left, right, full, cross, lateral)
362
+ lateral: Whether this is a LATERAL join
363
+ """
364
+ self._join_type = join_type.upper()
365
+ self._lateral = lateral
366
+ self._table: str | exp.Expression | None = None
367
+ self._condition: exp.Expression | None = None
368
+ self._alias: str | None = None
369
+ self._as_of: Any | None = None
370
+ self._as_of_type: str | None = None
371
+
372
+ def __call__(self, table: str | exp.Expression, alias: str | None = None) -> Self:
373
+ """Set the table to join.
374
+
375
+ Args:
376
+ table: Table name or expression to join
377
+ alias: Optional alias for the table
378
+
379
+ Returns:
380
+ Self for method chaining
381
+ """
382
+ self._table = table
383
+ self._alias = alias
384
+ return self
385
+
386
+ def as_of(self, time_expr: Any, kind: str | None = None) -> Self:
387
+ """Set AS OF clause for the join (Time Travel/Flashback).
388
+
389
+ Args:
390
+ time_expr: Timestamp or system time expression
391
+ kind: Type of AS OF clause (SYSTEM TIME, TIMESTAMP). If None, defaults based on dialect.
392
+
393
+ Returns:
394
+ Self for method chaining
395
+ """
396
+ self._as_of = time_expr
397
+ self._as_of_type = kind
398
+ return self
399
+
400
+ def on(self, condition: str | exp.Expression) -> exp.Expression:
401
+ """Set the join condition and build the JOIN expression.
402
+
403
+ Args:
404
+ condition: JOIN condition (e.g., "users.id = posts.user_id")
405
+
406
+ Returns:
407
+ Complete JOIN expression
408
+ """
409
+ if not self._table:
410
+ msg = "Table must be set before calling .on()"
411
+ raise SQLBuilderError(msg)
412
+
413
+ condition_expr: exp.Expression
414
+ if isinstance(condition, str):
415
+ parsed: exp.Expression | None = exp.maybe_parse(condition)
416
+ condition_expr = parsed or exp.condition(condition)
417
+ else:
418
+ condition_expr = condition
419
+
420
+ table_expr: exp.Expression
421
+ if isinstance(self._table, str):
422
+ table_expr = exp.to_table(self._table)
423
+ if self._alias:
424
+ table_expr = exp.alias_(table_expr, self._alias)
425
+ else:
426
+ table_expr = self._table
427
+ if self._alias:
428
+ table_expr = exp.alias_(table_expr, self._alias)
429
+
430
+ if self._as_of is not None:
431
+ inner_table = table_expr.copy()
432
+ target_alias = self._alias
433
+
434
+ if isinstance(inner_table, exp.Alias):
435
+ target_alias = inner_table.alias
436
+ inner_table = inner_table.this
437
+ elif isinstance(inner_table, exp.Table):
438
+ alias_expr = inner_table.args.get("alias")
439
+ if alias_expr is not None:
440
+ target_alias = alias_expr.this
441
+ inner_table.set("alias", None)
442
+
443
+ version = exp.Version(
444
+ this=self._as_of_type or "TIMESTAMP", kind="AS OF", expression=exp.convert(self._as_of)
445
+ )
446
+ inner_table.set("version", version)
447
+ table_expr = exp.alias_(inner_table, target_alias) if target_alias else inner_table
448
+
449
+ if self._join_type in {"INNER JOIN", "INNER", "LATERAL JOIN"}:
450
+ join_expr = exp.Join(this=table_expr, on=condition_expr)
451
+ elif self._join_type in {"LEFT JOIN", "LEFT"}:
452
+ join_expr = exp.Join(this=table_expr, on=condition_expr, side="LEFT")
453
+ elif self._join_type in {"RIGHT JOIN", "RIGHT"}:
454
+ join_expr = exp.Join(this=table_expr, on=condition_expr, side="RIGHT")
455
+ elif self._join_type in {"FULL JOIN", "FULL"}:
456
+ join_expr = exp.Join(this=table_expr, on=condition_expr, side="FULL", kind="OUTER")
457
+ elif self._join_type in {"CROSS JOIN", "CROSS"}:
458
+ join_expr = exp.Join(this=table_expr, kind="CROSS")
459
+ else:
460
+ join_expr = exp.Join(this=table_expr, on=condition_expr)
461
+
462
+ if self._lateral or self._join_type == "LATERAL JOIN":
463
+ current_kind = join_expr.args.get("kind")
464
+ current_side = join_expr.args.get("side")
465
+
466
+ if current_kind == "CROSS":
467
+ join_expr.set("kind", "CROSS LATERAL")
468
+ elif current_kind == "OUTER" and current_side == "FULL":
469
+ join_expr.set("side", "FULL")
470
+ join_expr.set("kind", "OUTER LATERAL")
471
+ elif current_side:
472
+ join_expr.set("kind", f"{current_side} LATERAL")
473
+ join_expr.set("side", None)
474
+ else:
475
+ join_expr.set("kind", "LATERAL")
476
+
477
+ return join_expr
478
+
479
+
480
+ def create_join_builder(join_type: str, lateral: bool = False) -> "JoinBuilder":
481
+ """Create a JoinBuilder without tripping trait instantiation errors.
482
+
483
+ This guards against runtime environments where a trait-decorated JoinBuilder
484
+ may raise on direct construction.
485
+ """
486
+ try:
487
+ return JoinBuilder(join_type, lateral=lateral)
488
+ except TypeError as exc:
489
+ if "traits may not be directly created" not in str(exc):
490
+ raise
491
+ builder = object.__new__(JoinBuilder)
492
+ builder._join_type = join_type.upper()
493
+ builder._lateral = lateral
494
+ builder._table = None
495
+ builder._condition = None
496
+ builder._alias = None
497
+ builder._as_of = None
498
+ builder._as_of_type = None
499
+ return builder