@hdnax/sqlingo.js 0.0.5 → 0.1.0

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 (243) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.repo.md +1 -2
  3. package/dist/chunk-2YNOERAO.cjs +2 -0
  4. package/dist/chunk-2YNOERAO.cjs.map +1 -0
  5. package/dist/chunk-2Z3O2CFM.cjs +19 -0
  6. package/dist/chunk-2Z3O2CFM.cjs.map +1 -0
  7. package/dist/chunk-4ZMKB6PV.cjs +2 -0
  8. package/dist/chunk-4ZMKB6PV.cjs.map +1 -0
  9. package/dist/chunk-53OWF4GG.js +2 -0
  10. package/dist/chunk-53OWF4GG.js.map +1 -0
  11. package/dist/chunk-C4CLTVOW.cjs +2 -0
  12. package/dist/chunk-C4CLTVOW.cjs.map +1 -0
  13. package/dist/chunk-DOKMTZYO.cjs +4 -0
  14. package/dist/chunk-DOKMTZYO.cjs.map +1 -0
  15. package/dist/chunk-FCGUTI7Y.js +2 -0
  16. package/dist/chunk-FCGUTI7Y.js.map +1 -0
  17. package/dist/chunk-IPCIXWCY.js +2 -0
  18. package/dist/chunk-IPCIXWCY.js.map +1 -0
  19. package/dist/chunk-KCNOE4DZ.js +19 -0
  20. package/dist/chunk-KCNOE4DZ.js.map +1 -0
  21. package/dist/chunk-NRJHX2GZ.js +2 -0
  22. package/dist/chunk-NRJHX2GZ.js.map +1 -0
  23. package/dist/chunk-O2J5RKBN.js +2 -0
  24. package/dist/chunk-O2J5RKBN.js.map +1 -0
  25. package/dist/chunk-PXUASP5I.js +2 -0
  26. package/dist/chunk-PXUASP5I.js.map +1 -0
  27. package/dist/chunk-R7C3ZHVK.cjs +2 -0
  28. package/dist/chunk-R7C3ZHVK.cjs.map +1 -0
  29. package/dist/chunk-UHWHUDLE.cjs +2 -0
  30. package/dist/chunk-UHWHUDLE.cjs.map +1 -0
  31. package/dist/chunk-WRNYJ54A.cjs +2 -0
  32. package/dist/chunk-WRNYJ54A.cjs.map +1 -0
  33. package/dist/chunk-XZQFOICX.cjs +3 -0
  34. package/dist/chunk-XZQFOICX.cjs.map +1 -0
  35. package/dist/chunk-YLOQRUXC.js +2 -0
  36. package/dist/chunk-YLOQRUXC.js.map +1 -0
  37. package/dist/chunk-YSS2WVCM.cjs +2 -0
  38. package/dist/chunk-YSS2WVCM.cjs.map +1 -0
  39. package/dist/chunk-Z5V6VOIN.js +3 -0
  40. package/dist/chunk-Z5V6VOIN.js.map +1 -0
  41. package/dist/chunk-ZBFGQPJR.js +4 -0
  42. package/dist/chunk-ZBFGQPJR.js.map +1 -0
  43. package/dist/dialects/athena.cjs +2 -0
  44. package/dist/dialects/athena.cjs.map +1 -0
  45. package/dist/dialects/athena.d.cts +66 -0
  46. package/dist/dialects/athena.d.ts +66 -0
  47. package/dist/dialects/athena.js +2 -0
  48. package/dist/dialects/athena.js.map +1 -0
  49. package/dist/dialects/bigquery.cjs +3 -0
  50. package/dist/dialects/bigquery.cjs.map +1 -0
  51. package/dist/dialects/bigquery.d.cts +651 -0
  52. package/dist/dialects/bigquery.d.ts +651 -0
  53. package/dist/dialects/bigquery.js +3 -0
  54. package/dist/dialects/bigquery.js.map +1 -0
  55. package/dist/dialects/clickhouse.cjs +2 -0
  56. package/dist/dialects/clickhouse.cjs.map +1 -0
  57. package/dist/dialects/clickhouse.d.cts +634 -0
  58. package/dist/dialects/clickhouse.d.ts +634 -0
  59. package/dist/dialects/clickhouse.js +2 -0
  60. package/dist/dialects/clickhouse.js.map +1 -0
  61. package/dist/dialects/databricks.cjs +2 -0
  62. package/dist/dialects/databricks.cjs.map +1 -0
  63. package/dist/dialects/databricks.d.cts +484 -0
  64. package/dist/dialects/databricks.d.ts +484 -0
  65. package/dist/dialects/databricks.js +2 -0
  66. package/dist/dialects/databricks.js.map +1 -0
  67. package/dist/dialects/doris.cjs +2 -0
  68. package/dist/dialects/doris.cjs.map +1 -0
  69. package/dist/dialects/doris.d.cts +484 -0
  70. package/dist/dialects/doris.d.ts +484 -0
  71. package/dist/dialects/doris.js +2 -0
  72. package/dist/dialects/doris.js.map +1 -0
  73. package/dist/dialects/dremio.cjs +2 -0
  74. package/dist/dialects/dremio.cjs.map +1 -0
  75. package/dist/dialects/dremio.d.cts +522 -0
  76. package/dist/dialects/dremio.d.ts +522 -0
  77. package/dist/dialects/dremio.js +2 -0
  78. package/dist/dialects/dremio.js.map +1 -0
  79. package/dist/dialects/drill.cjs +2 -0
  80. package/dist/dialects/drill.cjs.map +1 -0
  81. package/dist/dialects/drill.d.cts +512 -0
  82. package/dist/dialects/drill.d.ts +512 -0
  83. package/dist/dialects/drill.js +2 -0
  84. package/dist/dialects/drill.js.map +1 -0
  85. package/dist/dialects/druid.cjs +2 -0
  86. package/dist/dialects/druid.cjs.map +1 -0
  87. package/dist/dialects/druid.d.cts +17 -0
  88. package/dist/dialects/druid.d.ts +17 -0
  89. package/dist/dialects/druid.js +2 -0
  90. package/dist/dialects/druid.js.map +1 -0
  91. package/dist/dialects/duckdb.cjs +86 -0
  92. package/dist/dialects/duckdb.cjs.map +1 -0
  93. package/dist/dialects/duckdb.d.cts +756 -0
  94. package/dist/dialects/duckdb.d.ts +756 -0
  95. package/dist/dialects/duckdb.js +86 -0
  96. package/dist/dialects/duckdb.js.map +1 -0
  97. package/dist/dialects/dune.cjs +2 -0
  98. package/dist/dialects/dune.cjs.map +1 -0
  99. package/dist/dialects/dune.d.cts +21 -0
  100. package/dist/dialects/dune.d.ts +21 -0
  101. package/dist/dialects/dune.js +2 -0
  102. package/dist/dialects/dune.js.map +1 -0
  103. package/dist/dialects/exasol.cjs +2 -0
  104. package/dist/dialects/exasol.cjs.map +1 -0
  105. package/dist/dialects/exasol.d.cts +507 -0
  106. package/dist/dialects/exasol.d.ts +507 -0
  107. package/dist/dialects/exasol.js +2 -0
  108. package/dist/dialects/exasol.js.map +1 -0
  109. package/dist/dialects/fabric.cjs +2 -0
  110. package/dist/dialects/fabric.cjs.map +1 -0
  111. package/dist/dialects/fabric.d.cts +463 -0
  112. package/dist/dialects/fabric.d.ts +463 -0
  113. package/dist/dialects/fabric.js +2 -0
  114. package/dist/dialects/fabric.js.map +1 -0
  115. package/dist/dialects/hive.cjs +2 -0
  116. package/dist/dialects/hive.cjs.map +1 -0
  117. package/dist/dialects/hive.d.cts +585 -0
  118. package/dist/dialects/hive.d.ts +585 -0
  119. package/dist/dialects/hive.js +2 -0
  120. package/dist/dialects/hive.js.map +1 -0
  121. package/dist/dialects/materialize.cjs +2 -0
  122. package/dist/dialects/materialize.cjs.map +1 -0
  123. package/dist/dialects/materialize.d.cts +890 -0
  124. package/dist/dialects/materialize.d.ts +890 -0
  125. package/dist/dialects/materialize.js +2 -0
  126. package/dist/dialects/materialize.js.map +1 -0
  127. package/dist/dialects/mysql.cjs +2 -0
  128. package/dist/dialects/mysql.cjs.map +1 -0
  129. package/dist/dialects/mysql.d.cts +292 -0
  130. package/dist/dialects/mysql.d.ts +292 -0
  131. package/dist/dialects/mysql.js +2 -0
  132. package/dist/dialects/mysql.js.map +1 -0
  133. package/dist/dialects/oracle.cjs +2 -0
  134. package/dist/dialects/oracle.cjs.map +1 -0
  135. package/dist/dialects/oracle.d.cts +539 -0
  136. package/dist/dialects/oracle.d.ts +539 -0
  137. package/dist/dialects/oracle.js +2 -0
  138. package/dist/dialects/oracle.js.map +1 -0
  139. package/dist/dialects/postgres.cjs +2 -0
  140. package/dist/dialects/postgres.cjs.map +1 -0
  141. package/dist/dialects/postgres.d.cts +587 -0
  142. package/dist/dialects/postgres.d.ts +587 -0
  143. package/dist/dialects/postgres.js +2 -0
  144. package/dist/dialects/postgres.js.map +1 -0
  145. package/dist/dialects/presto.cjs +2 -0
  146. package/dist/dialects/presto.cjs.map +1 -0
  147. package/dist/dialects/presto.d.cts +173 -0
  148. package/dist/dialects/presto.d.ts +173 -0
  149. package/dist/dialects/presto.js +2 -0
  150. package/dist/dialects/presto.js.map +1 -0
  151. package/dist/dialects/prql.cjs +2 -0
  152. package/dist/dialects/prql.cjs.map +1 -0
  153. package/dist/dialects/prql.d.cts +496 -0
  154. package/dist/dialects/prql.d.ts +496 -0
  155. package/dist/dialects/prql.js +2 -0
  156. package/dist/dialects/prql.js.map +1 -0
  157. package/dist/dialects/redshift.cjs +2 -0
  158. package/dist/dialects/redshift.cjs.map +1 -0
  159. package/dist/dialects/redshift.d.cts +132 -0
  160. package/dist/dialects/redshift.d.ts +132 -0
  161. package/dist/dialects/redshift.js +2 -0
  162. package/dist/dialects/redshift.js.map +1 -0
  163. package/dist/dialects/risingwave.cjs +2 -0
  164. package/dist/dialects/risingwave.cjs.map +1 -0
  165. package/dist/dialects/risingwave.d.cts +478 -0
  166. package/dist/dialects/risingwave.d.ts +478 -0
  167. package/dist/dialects/risingwave.js +2 -0
  168. package/dist/dialects/risingwave.js.map +1 -0
  169. package/dist/dialects/singlestore.cjs +2 -0
  170. package/dist/dialects/singlestore.cjs.map +1 -0
  171. package/dist/dialects/singlestore.d.cts +73 -0
  172. package/dist/dialects/singlestore.d.ts +73 -0
  173. package/dist/dialects/singlestore.js +2 -0
  174. package/dist/dialects/singlestore.js.map +1 -0
  175. package/dist/dialects/snowflake.cjs +3 -0
  176. package/dist/dialects/snowflake.cjs.map +1 -0
  177. package/dist/dialects/snowflake.d.cts +320 -0
  178. package/dist/dialects/snowflake.d.ts +320 -0
  179. package/dist/dialects/snowflake.js +3 -0
  180. package/dist/dialects/snowflake.js.map +1 -0
  181. package/dist/dialects/solr.cjs +2 -0
  182. package/dist/dialects/solr.cjs.map +1 -0
  183. package/dist/dialects/solr.d.cts +458 -0
  184. package/dist/dialects/solr.d.ts +458 -0
  185. package/dist/dialects/solr.js +2 -0
  186. package/dist/dialects/solr.js.map +1 -0
  187. package/dist/dialects/spark.cjs +2 -0
  188. package/dist/dialects/spark.cjs.map +1 -0
  189. package/dist/dialects/spark.d.cts +484 -0
  190. package/dist/dialects/spark.d.ts +484 -0
  191. package/dist/dialects/spark.js +2 -0
  192. package/dist/dialects/spark.js.map +1 -0
  193. package/dist/dialects/spark2.cjs +2 -0
  194. package/dist/dialects/spark2.cjs.map +1 -0
  195. package/dist/dialects/spark2.d.cts +486 -0
  196. package/dist/dialects/spark2.d.ts +486 -0
  197. package/dist/dialects/spark2.js +2 -0
  198. package/dist/dialects/spark2.js.map +1 -0
  199. package/dist/dialects/sqlite.cjs +2 -0
  200. package/dist/dialects/sqlite.cjs.map +1 -0
  201. package/dist/dialects/sqlite.d.cts +510 -0
  202. package/dist/dialects/sqlite.d.ts +510 -0
  203. package/dist/dialects/sqlite.js +2 -0
  204. package/dist/dialects/sqlite.js.map +1 -0
  205. package/dist/dialects/starrocks.cjs +2 -0
  206. package/dist/dialects/starrocks.cjs.map +1 -0
  207. package/dist/dialects/starrocks.d.cts +518 -0
  208. package/dist/dialects/starrocks.d.ts +518 -0
  209. package/dist/dialects/starrocks.js +2 -0
  210. package/dist/dialects/starrocks.js.map +1 -0
  211. package/dist/dialects/tableau.cjs +2 -0
  212. package/dist/dialects/tableau.cjs.map +1 -0
  213. package/dist/dialects/tableau.d.cts +466 -0
  214. package/dist/dialects/tableau.d.ts +466 -0
  215. package/dist/dialects/tableau.js +2 -0
  216. package/dist/dialects/tableau.js.map +1 -0
  217. package/dist/dialects/teradata.cjs +2 -0
  218. package/dist/dialects/teradata.cjs.map +1 -0
  219. package/dist/dialects/teradata.d.cts +539 -0
  220. package/dist/dialects/teradata.d.ts +539 -0
  221. package/dist/dialects/teradata.js +2 -0
  222. package/dist/dialects/teradata.js.map +1 -0
  223. package/dist/dialects/trino.cjs +2 -0
  224. package/dist/dialects/trino.cjs.map +1 -0
  225. package/dist/dialects/trino.d.cts +465 -0
  226. package/dist/dialects/trino.d.ts +465 -0
  227. package/dist/dialects/trino.js +2 -0
  228. package/dist/dialects/trino.js.map +1 -0
  229. package/dist/dialects/tsql.cjs +2 -0
  230. package/dist/dialects/tsql.cjs.map +1 -0
  231. package/dist/dialects/tsql.d.cts +703 -0
  232. package/dist/dialects/tsql.d.ts +703 -0
  233. package/dist/dialects/tsql.js +2 -0
  234. package/dist/dialects/tsql.js.map +1 -0
  235. package/dist/index.cjs +5 -25
  236. package/dist/index.cjs.map +1 -1
  237. package/dist/index.d.cts +3 -14178
  238. package/dist/index.d.ts +3 -14178
  239. package/dist/index.js +5 -25
  240. package/dist/index.js.map +1 -1
  241. package/dist/tokens-VcMD09XM.d.cts +15805 -0
  242. package/dist/tokens-VcMD09XM.d.ts +15805 -0
  243. package/package.json +171 -5
@@ -0,0 +1,4 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunk2Z3O2CFMcjs = require('./chunk-2Z3O2CFM.cjs');function is(e){let t=_chunk2Z3O2CFMcjs.U.call(void 0, e);if(t){let a=t.refCount(),s=[];for(let r of t.traverse())s.push(r);for(let r=s.length-1;0<=r;r--){let o=s[r];if(o.isCte){let c=o;if((a.get(c)||0)<=0){let n=o.expression.parent;if(!n)continue;let l=n.parent;if(n.pop(),l){let f=l.args.expressions;(!f||f.length===0)&&l.pop()}for(let[,f]of Object.entries(o.selectedSources)){let[,p]=f;if(p instanceof _chunk2Z3O2CFMcjs.S){let m=a.get(p)||0;a.set(p,m-1)}}}}}}return e}function as(e){for(let t of _chunk2Z3O2CFMcjs.T.call(void 0, e)){if(0<t.unqualifiedColumns.length)continue;let a=t.expression.args.joins;if(a)for(let s=a.length-1;0<=s;s--){let r=a[s];if(_chunk2Z3O2CFMcjs.o.call(void 0, r,_chunk2Z3O2CFMcjs.Bb),r.isSemiOrAntiJoin)continue;let o=r.aliasOrName;o&&En(t,r,o)&&(r.pop(),t.removeSource(o))}}return e}function En(e,t,a){let s=e.sources.get(a);if(!(s instanceof _chunk2Z3O2CFMcjs.S)||hn(e,t,a))return!1;let r=t.args.side,o=t.args.on;return r==="left"&&Sn(s,t)||!o&&$s(s)}function hn(e,t,a){let s=t.args.on,r=new Set;if(s)for(let c of s.findAll(_chunk2Z3O2CFMcjs.Ic))r.add(c);return e.sourceColumns(a).some(c=>!r.has(c))}function Sn(e,t){let a=yn(e);if(!a||a.size===0)return!1;let{joinKeys:s}=Ws(t),r=new Set(s.map(o=>o.name));for(let o of a)if(!r.has(o))return!1;return!0}function yn(e){let t=e.expression;if(!(t instanceof _chunk2Z3O2CFMcjs.Wd))return;let a=t;if(a.args.distinct)return new Set(a.namedSelects);let s=a.args.group;if(s){let r=new Set((_nullishCoalesce(s.args.expressions, () => ([]))).filter(n=>n instanceof _chunk2Z3O2CFMcjs.Ca).map(n=>n.sql())),o=new Set,c=new Set;for(let n of a.selects){if(!(n instanceof _chunk2Z3O2CFMcjs.Ca))continue;let l=n.unalias().sql();r.has(l)&&(o.add(l),c.add(n.aliasOrName))}return[...r].every(n=>o.has(n))?c:new Set}return $s(e)?new Set(a.namedSelects):new Set}function $s(e){let t=e.expression;if(!(t instanceof _chunk2Z3O2CFMcjs.Wd))return!1;let a=t;return!!(!a.args.from||a.selects.every(r=>r instanceof _chunk2Z3O2CFMcjs.Ca?r.unalias()instanceof _chunk2Z3O2CFMcjs.he:!1)||bn(e))}function bn(e){let t=e.expression.getArgKey("limit");return t instanceof _chunk2Z3O2CFMcjs.Ab?_optionalChain([t, 'access', _2 => _2.args, 'access', _3 => _3.expression, 'optionalAccess', _4 => _4.args, 'access', _5 => _5.this])==="1":!1}function Ws(e){let t=e.aliasOrName,s=(e.args.on||_chunk2Z3O2CFMcjs.Co.call(void 0, )).copy(),r=[],o=[];function c(i){let[n,l]=i.unnestOperands();if(!n||!l)return;let f=zs(n),p=zs(l);t&&f.has(t)&&!p.has(t)?(o.push(n),r.push(l),i.replace(_chunk2Z3O2CFMcjs.Co.call(void 0, ))):t&&p.has(t)&&!f.has(t)&&(o.push(l),r.push(n),i.replace(_chunk2Z3O2CFMcjs.Co.call(void 0, )))}if(_chunk2Z3O2CFMcjs.$.call(void 0, s)){let i=s instanceof _chunk2Z3O2CFMcjs.kn?s:_chunk2Z3O2CFMcjs.ao.call(void 0, [s,_chunk2Z3O2CFMcjs.Co.call(void 0, )],{copy:!1});for(let n of i.flatten())n instanceof _chunk2Z3O2CFMcjs.Ce&&c(n)}else if(_chunk2Z3O2CFMcjs.$.call(void 0, s,{dnf:!0})){let i;for(let n of s.flatten()){let l=Array.from(n.flatten()).filter(f=>f instanceof _chunk2Z3O2CFMcjs.Ce);if(i===void 0)i=l;else{let f=[];for(let p of l){let m=i.filter(d=>p.sql()===d.sql());0<m.length&&(f.push(p),f.push(...m))}i=f}}if(i)for(let n of i)c(n)}return{sourceKeys:r,joinKeys:o,on:s}}function zs(e){let t=new Set;for(let a of e.findAll(_chunk2Z3O2CFMcjs.Ic))a.table&&t.add(a.table);return t}function $e(e){if(e instanceof _chunk2Z3O2CFMcjs.Xd&&e.args.this)return $e(e.args.this),e;let t=_chunk2Z3O2CFMcjs.U.call(void 0, e);if(!t)return e;let a=new Map;for(let n of t.cteScopes){let l=n.expression.parent;l&&a.set(l.alias,n)}for(let n of t.traverse())for(let[,l]of n.sources)l instanceof _chunk2Z3O2CFMcjs.Tb&&a.set(l.name,l);let s=new Map,r=t.expression.args.with,o=!1;if(r){_chunk2Z3O2CFMcjs.o.call(void 0, r,_chunk2Z3O2CFMcjs.Va),o=!!r.args.recursive;for(let n of _nullishCoalesce(r.args.expressions, () => ([])))_chunk2Z3O2CFMcjs.n.call(void 0, n,_chunk2Z3O2CFMcjs.Fc)&&n.args.this&&n.args.this&&s.set(n.args.this.sqlKey,n.alias)}let c=[];for(let n of t.cteScopes){for(let f of n.traverse()){if(f===n)continue;let p=Bs(f,s,a);p&&c.push(p)}let l=n.expression.parent;l&&c.push(l)}let i=[...t.unionScopes,...t.subqueryScopes,...t.tableScopes];for(let n of i)for(let l of n.traverse()){let f=Bs(l,s,a);f&&c.push(f)}return 0<c.length&&_optionalChain([(e instanceof _chunk2Z3O2CFMcjs.Ha?e.args.expression:e), 'optionalAccess', _6 => _6.setArgKey, 'call', _7 => _7("with",new (0, _chunk2Z3O2CFMcjs.Va)({expressions:c,recursive:o}))]),e}function Bs(e,t,a){if(e.isDerivedTable)return An(e,t,a);if(e.isCte)return Cn(e,t,a)}function An(e,t,a){if(e.parent&&(0<e.parent.pivots.length||e.parent.expression instanceof _chunk2Z3O2CFMcjs.ne))return;let s=e.expression.parent;if(!s)return;s instanceof _chunk2Z3O2CFMcjs.Xd&&(s=s.unwrap());let[r,o]=Qs(e,t,a),c=_chunk2Z3O2CFMcjs.ho.call(void 0, _chunk2Z3O2CFMcjs.$n.call(void 0, r),s.alias||r,{copy:!1}),n=s.args.joins;return n&&Array.isArray(n)&&c.setArgKey("joins",n),s.replace(c),o}function Cn(e,t,a){let s=e.expression.parent;if(!s)return;let[r,o]=Qs(e,t,a),c=s.parent;if(s.pop(),c){let i=c.args.expressions;(!i||i.length===0)&&c.pop()}if(e.parent)for(let i of e.parent.traverse())for(let[,n]of Object.entries(i.selectedSources)){let[l,f]=n;if(f===e){let p=_chunk2Z3O2CFMcjs.ho.call(void 0, _chunk2Z3O2CFMcjs.$n.call(void 0, r),l.aliasOrName,{copy:!1});l.replace(p)}}return o}function Qs(e,t,a){let s=t.get(e.expression.sqlKey),o=_optionalChain([e, 'access', _8 => _8.expression, 'access', _9 => _9.parent, 'optionalAccess', _10 => _10.alias])||"";o||(o=_chunk2Z3O2CFMcjs.ea.call(void 0, Array.from(a.keys()),"cte")),s?o=s:a.has(o)&&(o=_chunk2Z3O2CFMcjs.ea.call(void 0, Array.from(a.keys()),o)),a.set(o,e);let c;return s||(t.set(e.expression.sqlKey,o),c=new (0, _chunk2Z3O2CFMcjs.Fc)({this:e.expression,alias:new (0, _chunk2Z3O2CFMcjs.Ya)({this:_chunk2Z3O2CFMcjs.eo.call(void 0, o)})})),[o,c]}function cs(e,t={}){let{leaveTablesIsolated:a=!1}=t;return e=wn(e,{leaveTablesIsolated:a}),e=Nn(e,{leaveTablesIsolated:a}),e}var Tn=[_chunk2Z3O2CFMcjs.Ic,_chunk2Z3O2CFMcjs.Ce,_chunk2Z3O2CFMcjs.ge,_chunk2Z3O2CFMcjs.Re,_chunk2Z3O2CFMcjs.Ve];function wn(e,t){let{leaveTablesIsolated:a}=t,s=Array.from(_chunk2Z3O2CFMcjs.T.call(void 0, e)),r=new Map;for(let c of s)for(let[,i]of Object.entries(c.selectedSources)){let[n,l]=i;if(l instanceof _chunk2Z3O2CFMcjs.S&&l.isCte){let f=r.get(l);f||(f=[],r.set(l,f)),f.push([c,l,n])}}let o=[];for(let[,c]of r)c.length===1&&o.push(c[0]);for(let[c,i,n]of o){let l=n.findAncestor(_chunk2Z3O2CFMcjs.pb,_chunk2Z3O2CFMcjs.Bb);if(l&&Gs(c,i,{leaveTablesIsolated:a},l)){let f=n.aliasOrName;Hs(c,i,f),Ys(c,i,n,f),Xs(c,i,f),en(c,i),Vs(c,i,l),Zs(c,i,l),sn(c,i),On(i),c.clearCache()}}return e}function Nn(e,t){let{leaveTablesIsolated:a}=t;for(let s of _chunk2Z3O2CFMcjs.T.call(void 0, e))for(let r of s.derivedTables){let o=r.findAncestor(_chunk2Z3O2CFMcjs.pb,_chunk2Z3O2CFMcjs.Bb),c=r.aliasOrName,i=s.sources.get(c);i instanceof _chunk2Z3O2CFMcjs.S&&o&&Gs(s,i,{leaveTablesIsolated:a},o)&&(Hs(s,i,c),Ys(s,i,r,c),Xs(s,i,c),en(s,i),Vs(s,i,o),Zs(s,i,o),sn(s,i),s.clearCache())}return e}function Gs(e,t,a,s){let{leaveTablesIsolated:r}=a,o=t.expression.unnest();function c(){let u=new Set;if(!(o instanceof _chunk2Z3O2CFMcjs.Wd))return!1;let g=o;for(let y of g.selects)y instanceof _chunk2Z3O2CFMcjs.Ca&&y.find(_chunk2Z3O2CFMcjs.Yd)&&u.add(y.aliasOrName);let b=s.aliasOrName,x=[];for(let y of e.columns)y.findAncestor(_chunk2Z3O2CFMcjs.Zb,_chunk2Z3O2CFMcjs.yb,_chunk2Z3O2CFMcjs.Fb,_chunk2Z3O2CFMcjs.Bb,_chunk2Z3O2CFMcjs.qb,_chunk2Z3O2CFMcjs.he)!==void 0&&x.push(y);return 0<x.filter(y=>y.table===b&&u.has(y.name)).length}function i(){if(!(s instanceof _chunk2Z3O2CFMcjs.Bb))return!1;let u=s.aliasOrName,g=s.args.on;if(!g)return!1;let b=Array.from(g.findAll(_chunk2Z3O2CFMcjs.Ic)).filter(h=>h.table===u).map(h=>h.name),x=t.expression.getArgKey("from");if(!x)return!1;let E=x.aliasOrName;if(!(t.expression instanceof _chunk2Z3O2CFMcjs.Wd))return!1;let y=t.expression,S=new Map;for(let h of y.selects)h instanceof _chunk2Z3O2CFMcjs.Ca&&S.set(h.aliasOrName,h);return b.some(h=>{let A=S.get(h);return A?Array.from(A.findAll(_chunk2Z3O2CFMcjs.Ic)).some(M=>M.table!==E):!1})}function n(){let u=t.expression.parent,g=e.expression.parent;for(;g;){if(g===u)return!0;g=g.parent}return!1}if(!(e.expression instanceof _chunk2Z3O2CFMcjs.Wd))return!1;let l=e.expression;if(l.isStar||!(o instanceof _chunk2Z3O2CFMcjs.Wd))return!1;let f=o;for(let u of _chunk2Z3O2CFMcjs.op.UNMERGABLE_ARGS)if(f.getArgKey(u))return!1;if(!f.args.from||0<e.pivots.length)return!1;for(let u of _nullishCoalesce(f.args.expressions, () => ([])))if(u instanceof _chunk2Z3O2CFMcjs.Ca&&(u.find(_chunk2Z3O2CFMcjs.he)||u.find(_chunk2Z3O2CFMcjs.Wd)||u.find(_chunk2Z3O2CFMcjs.yi)))return!1;if(r&&1<Object.keys(e.selectedSources).length||s instanceof _chunk2Z3O2CFMcjs.Bb&&f.args.joins&&0<f.args.joins.length)return!1;let p=s instanceof _chunk2Z3O2CFMcjs.Bb?s.args.side:void 0;if(s instanceof _chunk2Z3O2CFMcjs.Bb&&f.args.where&&(p==="full"||p==="left"||p==="right"))return!1;let m=l.args.joins;return!(s instanceof _chunk2Z3O2CFMcjs.pb&&f.args.where&&m&&m.some(u=>_chunk2Z3O2CFMcjs.n.call(void 0, u,_chunk2Z3O2CFMcjs.Bb)&&(u.args.side==="full"||u.args.side==="right"))||i()||c()||n()||f.args.order&&e.isUnion||_chunk2Z3O2CFMcjs.ca.call(void 0, _nullishCoalesce(f.args.expressions, () => ([])),0)instanceof _chunk2Z3O2CFMcjs.Lb)}function Hs(e,t,a){let s=new Set(Object.keys(t.selectedSources)),r=new Set(Object.keys(e.selectedSources)),o=new Set(Array.from(s).filter(i=>r.has(i)));o.delete(a);let c=new Set([...r,...s]);for(let i of o){let n=_chunk2Z3O2CFMcjs.ea.call(void 0, Array.from(c),i),l=t.selectedSources[i];if(!l)continue;let[f]=l,p=_chunk2Z3O2CFMcjs.eo.call(void 0, n);f instanceof _chunk2Z3O2CFMcjs.Tb?f.alias?f.setArgKey("alias",p):f.replace(_chunk2Z3O2CFMcjs.ho.call(void 0, f,p,{copy:!1})):_optionalChain([f, 'optionalAccess', _11 => _11.parent]) instanceof _chunk2Z3O2CFMcjs.Xd&&f.parent.setArgKey("alias",new (0, _chunk2Z3O2CFMcjs.Ya)({this:p}));for(let m of t.sourceColumns(i))m.setArgKey("table",_chunk2Z3O2CFMcjs.eo.call(void 0, n));t.renameSource(i,n),c.add(n)}}function Ys(e,t,a,s){let o=t.expression.getArgKey("from").args.this;o.setArgKey("joins",a.args.joins),a.replace(o);for(let i of e.joinHints){let n=Array.from(i.findAll(_chunk2Z3O2CFMcjs.Tb));for(let l of n)l.aliasOrName===a.aliasOrName&&l.setArgKey("this",_chunk2Z3O2CFMcjs.eo.call(void 0, o.aliasOrName))}e.removeSource(s);let c=t.sources.get(o.aliasOrName);c!==void 0&&e.addSource(o.aliasOrName,c)}function Vs(e,t,a){let s=[],r=t.expression.getArgKey("joins");if(r)for(let o of r){s.push(o);let c=t.sources.get(o.aliasOrName);c&&e.addSource(o.aliasOrName,c)}if(0<s.length){let o=e.expression.getArgKey("joins")||[],c;a instanceof _chunk2Z3O2CFMcjs.pb?c=0:c=o.indexOf(a)+1,o.splice(c,0,...s),e.expression.setArgKey("joins",o)}}function Xs(e,t,a){let s=new Map;for(let o of e.columns)if(o.table===a){let c=o.name,i=s.get(c);i||(i=[],s.set(c,i)),i.push(o)}if(!(t.expression instanceof _chunk2Z3O2CFMcjs.Wd))return;let r=t.expression;for(let o of _nullishCoalesce(r.args.expressions, () => ([]))){if(!(o instanceof _chunk2Z3O2CFMcjs.Ca))continue;let c=o.aliasOrName;if(!c)continue;let i=s.get(c)||[],n=o.unalias(),l=!Tn.some(p=>n instanceof p),f=n.isNumber;for(let p of i){let m=p.parent;if(f&&m instanceof _chunk2Z3O2CFMcjs.yb){p.replace(_chunk2Z3O2CFMcjs.eo.call(void 0, p.name));continue}let d=n;m&&(m instanceof _chunk2Z3O2CFMcjs.ce||m instanceof _chunk2Z3O2CFMcjs.be)&&l&&(d=_chunk2Z3O2CFMcjs.do.call(void 0, d,{copy:!1})),m instanceof _chunk2Z3O2CFMcjs.Wd&&p.name!==d.name&&(d=_chunk2Z3O2CFMcjs.ho.call(void 0, d,p.name,{copy:!1})),p.replace(d.copy())}}}function Zs(e,t,a){let s=t.expression.getArgKey("where");if(!s)return;let r=s.args.this;if(!(r instanceof _chunk2Z3O2CFMcjs.Ca))return;let o=e.expression;if(a instanceof _chunk2Z3O2CFMcjs.Bb){let c=o.args.from,i=new Set;c&&i.add(c.aliasOrName);let n=o.args.joins;if(n)for(let p of n){let m=p.aliasOrName;if(i.add(m),m===a.aliasOrName)break}let l=_chunk2Z3O2CFMcjs.Go.call(void 0, r);if(Array.from(l).every(p=>i.has(p))){a.on(r,{copy:!1});return}}o.where(r,{copy:!1})}function en(e,t){let a=e.expression;a.args.group||a.args.distinct||a.args.having||a.args.order||Object.keys(e.selectedSources).length!==1||_optionalChain([a, 'access', _12 => _12.args, 'access', _13 => _13.expressions, 'optionalAccess', _14 => _14.some, 'call', _15 => _15(r=>r instanceof _chunk2Z3O2CFMcjs.Ca?r.find(_chunk2Z3O2CFMcjs.he)!==void 0:!1)])||a.setArgKey("order",t.expression.getArgKey("order"))}function sn(e,t){let a=t.expression.getArgKey("hint");if(!a)return;let s=e.expression,r=s.args.hint;if(r){let o=a.args.expressions;for(let c of _nullishCoalesce(o, () => ([])))c instanceof _chunk2Z3O2CFMcjs.Ca&&r.append("expressions",c)}else s.setArgKey("hint",a)}function On(e){let t=e.expression.parent;if(!t)return;let a=t.parent;if(!a)return;_optionalChain([a, 'access', _16 => _16.args, 'access', _17 => _17.expressions, 'optionalAccess', _18 => _18.length])===1?a.pop():t.pop()}function ls(e,t={}){let{dialect:a}=t,s=_chunk2Z3O2CFMcjs.U.call(void 0, e),r=_chunk2Z3O2CFMcjs.op.getOrRaise(a),o=r.constructor.UNNEST_REQUIRES_CROSS_JOIN;if(s){let c=s.refCount();for(let i of Array.from(s.traverse()).reverse()){let n=i.expression,l=n.getArgKey("where");if(l){let p=i.selectedSources,m=n.getArgKey("joins"),d=new Map;m&&m.forEach((g,b)=>{let x=g.aliasOrName;x&&d.set(x,b)});let u=!0;for(let[g,b]of Object.entries(p)){let[x]=b;if(!x)continue;let E=x.findAncestor(_chunk2Z3O2CFMcjs.Bb,_chunk2Z3O2CFMcjs.pb);if(E instanceof _chunk2Z3O2CFMcjs.Bb){if(E.args.side==="right"){p={[g]:b};break}if(x instanceof _chunk2Z3O2CFMcjs.Ai&&o){u=!1;break}}}if(u){let g=l.args.this;g instanceof _chunk2Z3O2CFMcjs.Ca&&nn(g,p,c,r,d)}}let f=n.getArgKey("joins");if(f)for(let p of f){let m=p.aliasOrName;if(m&&m in i.selectedSources){let d=p.args.on;nn(d,{[m]:i.selectedSources[m]},c,r)}}}}return e}function nn(e,t,a,s,r){if(!e)return;let o=_chunk2Z3O2CFMcjs.aa.call(void 0, e,{dialect:s});e=e.replace(o);let c=_chunk2Z3O2CFMcjs.$.call(void 0, e)||!_chunk2Z3O2CFMcjs.$.call(void 0, e,{dnf:!0}),i=(c?e instanceof _chunk2Z3O2CFMcjs.kn:e instanceof _chunk2Z3O2CFMcjs.ln)?Array.from(e.flatten()):[e];c?vn(i,t,a,r):In(i,t,a)}function vn(e,t,a,s){let r=s||new Map;for(let o of e){let c=tn(o,t,a);for(let[i,n]of Object.entries(c))if(n instanceof _chunk2Z3O2CFMcjs.Bb){let l=_chunk2Z3O2CFMcjs.Go.call(void 0, o,{exclude:i}),f=_nullishCoalesce(r.get(i), () => (-1));if(Array.from(l).every(m=>(_nullishCoalesce(r.get(m), () => (-1)))<f)){o.replace(_chunk2Z3O2CFMcjs.Co.call(void 0, )),n.on(o,{copy:!1});break}}else if(n instanceof _chunk2Z3O2CFMcjs.Wd){o.replace(_chunk2Z3O2CFMcjs.Co.call(void 0, ));let l=on(n,o);_chunk2Z3O2CFMcjs.X.call(void 0, l,_chunk2Z3O2CFMcjs.he)?n.having(l,{copy:!1}):n.where(l,{copy:!1})}}}function In(e,t,a){let s=new Set;for(let c of e){let i=_chunk2Z3O2CFMcjs.Go.call(void 0, c);for(let n of e){let l=_chunk2Z3O2CFMcjs.Go.call(void 0, n);i=new Set(Array.from(i).filter(f=>l.has(f)))}for(let n of i)s.add(n)}let r=new Map,o={};for(let c of Array.from(s).sort()){for(let i of e){if(o=tn(i,t,a),!(c in o))continue;let n=r.get(c);r.set(c,n?_chunk2Z3O2CFMcjs.bo.call(void 0, [n,i]):i)}for(let[i,n]of Object.entries(o)){let l=r.get(i);if(l){if(n instanceof _chunk2Z3O2CFMcjs.Bb)n.on(l,{copy:!1});else if(n instanceof _chunk2Z3O2CFMcjs.Wd){let f=on(n,l);_chunk2Z3O2CFMcjs.X.call(void 0, f,_chunk2Z3O2CFMcjs.he)?n.having(f,{copy:!1}):n.where(f,{copy:!1})}}}}}function tn(e,t,a){let s={},r=_chunk2Z3O2CFMcjs.Go.call(void 0, e),o=e.findAncestor(_chunk2Z3O2CFMcjs.Bb,_chunk2Z3O2CFMcjs.Zb)instanceof _chunk2Z3O2CFMcjs.Zb;for(let c of Array.from(r).sort()){let i=t[c];if(!i)continue;let n=i[0],[,l]=i;if(n&&o&&(n=n.findAncestor(_chunk2Z3O2CFMcjs.Bb,_chunk2Z3O2CFMcjs.pb)),n instanceof _chunk2Z3O2CFMcjs.pb&&!(l instanceof _chunk2Z3O2CFMcjs.Tb)){let f=_optionalChain([_chunk2Z3O2CFMcjs.p.call(void 0, _optionalChain([(l instanceof _chunk2Z3O2CFMcjs.S?l.parent:_optionalChain([l, 'access', _19 => _19.parent, 'optionalAccess', _20 => _20.args])), 'optionalAccess', _21 => _21.expression]),_chunk2Z3O2CFMcjs.Ca), 'optionalAccess', _22 => _22.getArgKey, 'call', _23 => _23("with")]);if(f instanceof _chunk2Z3O2CFMcjs.Va&&_optionalChain([f, 'optionalAccess', _24 => _24.recursive]))return{};n=l instanceof _chunk2Z3O2CFMcjs.S?l.expression:l.args.expression}if(n instanceof _chunk2Z3O2CFMcjs.Bb){let f=n.side;if(f&&f!=="right")return{};s[c]=n}else if(n instanceof _chunk2Z3O2CFMcjs.Wd&&r.size===1){let f=n.selects.some(d=>d instanceof _chunk2Z3O2CFMcjs.Ca?d.find(_chunk2Z3O2CFMcjs.Yd)!==void 0:!1),p=!!n.args.group,m=a.get(l)||0;!p&&m<2&&!f&&(s[c]=n)}}return s}function on(e,t){let a=new Map;for(let r of e.selects)if(r instanceof _chunk2Z3O2CFMcjs.Ca)if(r instanceof _chunk2Z3O2CFMcjs.hc){let o=r.args.this;o instanceof _chunk2Z3O2CFMcjs.Ca&&a.set(r.alias,o)}else a.set(r.name,r);function s(r){if(r instanceof _chunk2Z3O2CFMcjs.Ic){let o=a.get(r.name);if(o)return o.copy()}return r}return t.transform(s)}var me=class e{constructor(t,a,s={}){let{inferSchema:r=!0}=s;this.scope=t,this.schema=a,this.dialect=a.dialect||new _chunk2Z3O2CFMcjs.op,this.inferSchema=r,this.getSourceColumnsCache=new _chunk2Z3O2CFMcjs.m}getTable(t){let a=typeof t=="string"?t:t.name,s=this.getTableNameFromSources(a);if(!s&&typeof t!="string"){let i=this.getColumnJoinContext(t);if(i)try{let n=this.getAvailableSourceColumns(i);s=this.getTableNameFromSources(a,n)}catch(n){if(!(n instanceof _chunk2Z3O2CFMcjs.j))throw n}}if(!s&&this.inferSchema){let i=this.getAllSourceColumns(),n=[];for(let[l,f]of i)(!f||f.length===0||f.includes("*"))&&n.push(l);n.length===1&&(s=n[0])}if(!s)return;let r=this.scope.selectedSources[s];if(!r)return _chunk2Z3O2CFMcjs.eo.call(void 0, s);let[o]=r,c=o;if(c instanceof _chunk2Z3O2CFMcjs.Fa)for(;c&&c.alias!==s;)c=c.parent;if(c){let i=c.getArgKey("alias");if(i instanceof _chunk2Z3O2CFMcjs.Ca&&(i.args.this instanceof _chunk2Z3O2CFMcjs.rb||typeof i.args.this=="string"))return _chunk2Z3O2CFMcjs.eo.call(void 0, i.args.this)}return _chunk2Z3O2CFMcjs.eo.call(void 0, s)}get allColumns(){if(!this.allColumnsCache){this.allColumnsCache=new Set;for(let t of this.getAllSourceColumns().values())for(let a of t)this.allColumnsCache.add(a)}return this.allColumnsCache}getSourceColumnsFromSetOp(t){if(t instanceof _chunk2Z3O2CFMcjs.Wd)return t.namedSelects;if(t instanceof _chunk2Z3O2CFMcjs.Xd){let c=t.args.this;if(c instanceof _chunk2Z3O2CFMcjs.Ud)return this.getSourceColumnsFromSetOp(c)}if(!(t instanceof _chunk2Z3O2CFMcjs.Ud))throw new Error(`Unknown set operation: ${t}`);let a=t,s=a.args.on;if(s)return s.map(c=>c.name);let r=a.args.side,o=a.args.kind;if(r||o){let c=a.args.this,i=a.args.expression;if(!c||!i)return[];let n=this.getSourceColumnsFromSetOp(c),l=this.getSourceColumnsFromSetOp(i);if(r==="left")return n;if(r==="full"){let f=[...n,...l];return Array.from(new Set(f))}else if(o==="inner"){let f=new Set(n),p=new Set(l);return Array.from(f).filter(m=>p.has(m))}}return t.namedSelects}getSourceColumns(t,a={}){let{onlyVisible:s=!1}=a;if(this.getSourceColumnsCache.has(t,s))return _nullishCoalesce(this.getSourceColumnsCache.get(t,s), () => ([]));let r=this.scope.sources.get(t);if(!r)throw new (0, _chunk2Z3O2CFMcjs.j)(`Unknown table: ${t}`);let o=[];if(r instanceof _chunk2Z3O2CFMcjs.Tb)o=_optionalChain([this, 'access', _25 => _25.schema, 'access', _26 => _26.columnNames, 'optionalCall', _27 => _27(r,{onlyVisible:s})])||[];else if(r instanceof _chunk2Z3O2CFMcjs.S){let n=r.expression;if(n instanceof _chunk2Z3O2CFMcjs.se||n instanceof _chunk2Z3O2CFMcjs.Ai){if(o=n.namedSelects,this.dialect._constructor.UNNEST_COLUMN_ONLY&&n instanceof _chunk2Z3O2CFMcjs.Ai){let l=n;if(!l.type||_chunk2Z3O2CFMcjs.Lo.call(void 0, l.type,"unknown")){let f=l.args.expressions,p=_chunk2Z3O2CFMcjs.ca.call(void 0, _nullishCoalesce(f, () => ([])),0);if(p instanceof _chunk2Z3O2CFMcjs.Ic&&this.scope.parent){let m=this.getUnnestColumnType(p);if(_optionalChain([m, 'optionalAccess', _28 => _28.isType, 'call', _29 => _29("array")])){let d=m.args.expressions;d&&0<d.length?l.type=d[0].copy():l.type=m.copy()}}}if(l.isType("struct"))for(let f of(l.type instanceof _chunk2Z3O2CFMcjs.Ca?l.type.args.expressions:void 0)||[])_chunk2Z3O2CFMcjs.n.call(void 0, f,_chunk2Z3O2CFMcjs.Ca)&&o.push(f.name)}}else if(n instanceof _chunk2Z3O2CFMcjs.Ud)o=this.getSourceColumnsFromSetOp(n);else{let l=_chunk2Z3O2CFMcjs.ca.call(void 0, _nullishCoalesce(n.args.expressions, () => ([])),0);if(l instanceof _chunk2Z3O2CFMcjs.Lb){let f=l.args.schema;o=f?_nullishCoalesce(_optionalChain([f, 'access', _30 => _30.args, 'access', _31 => _31.expressions, 'optionalAccess', _32 => _32.map, 'call', _33 => _33(p=>p instanceof _chunk2Z3O2CFMcjs.Ca?p.name:String(p))]), () => ([])):["key","value"]}else o=n.namedSelects}}let[c]=this.scope.selectedSources[t]||[void 0,void 0],i;if(c instanceof _chunk2Z3O2CFMcjs.S?i=c.expression.aliasColumnNames:c instanceof _chunk2Z3O2CFMcjs.Ca?i=c.aliasColumnNames:i=[],i.length){let n=[];for(let l=0;l<Math.max(o.length,i.length);l++){let f=_chunk2Z3O2CFMcjs.ca.call(void 0, i,l),p=_chunk2Z3O2CFMcjs.ca.call(void 0, o,l);n.push(f||p||"")}o=n}return this.getSourceColumnsCache.set(t,s,o),o}getAllSourceColumns(){if(!this.sourceColumns){this.sourceColumns=new Map;let t={...this.scope.selectedSources,...Object.fromEntries(this.scope.lateralSources.entries())};for(let a of Object.keys(t))this.sourceColumns.set(a,this.getSourceColumns(a))}return this.sourceColumns}getTableNameFromSources(t,a){let s;return a?s=this.getUnambiguousColumns(a):(this.unambiguousColumns||(this.unambiguousColumns=this.getUnambiguousColumns(this.getAllSourceColumns())),s=this.unambiguousColumns),s.get(t)}getColumnJoinContext(t){if(!this.scope.expression.args.joins||this.scope.expression.getArgKey("laterals")||this.scope.expression.getArgKey("pivots"))return;let s=t.findAncestor(_chunk2Z3O2CFMcjs.Bb,_chunk2Z3O2CFMcjs.Wd);if(s instanceof _chunk2Z3O2CFMcjs.Bb&&Object.keys(this.scope.selectedSources).includes(s.aliasOrName))return s}getAvailableSourceColumns(t){let{from:a,joins:s}=this.scope.expression.args;if(!a||!s)return new Map;let r=new Map,o=a instanceof _chunk2Z3O2CFMcjs.Ca?a.aliasOrName:a;o&&r.set(o,this.getSourceColumns(o));for(let c of s.slice(0,s.indexOf(t)+1)){let i=c.aliasOrName;i&&r.set(i,this.getSourceColumns(i))}return r}getUnambiguousColumns(t){if(t.size===0)return new Map;let a=Array.from(t.entries()),[s,r]=a[0];if(a.length===1)return new (0, _chunk2Z3O2CFMcjs.ka)(r,s);let o=new Map;if(this.dialect._constructor.UNNEST_COLUMN_ONLY){for(let[n,l]of this.scope.sources)if(l instanceof _chunk2Z3O2CFMcjs.S&&l.expression instanceof _chunk2Z3O2CFMcjs.Ai){let f=l.expression.args.alias;_chunk2Z3O2CFMcjs.n.call(void 0, f,_chunk2Z3O2CFMcjs.Ya)&&f.columns.length&&o.set(f.columns[0].name,n)}}let c=new Map;for(let n of r)c.set(n,s);let i=new Set(r);for(let[n,l]of a.slice(1)){let f=new Set(l),p=new Set([...i].filter(m=>f.has(m)));for(let m of l)i.add(m);for(let m of p){let d=o.get(m);if(d!==void 0){c.set(m,d);continue}c.delete(m)}for(let m of f)p.has(m)||c.set(m,n)}return c}getUnnestColumnType(t){let a=this.scope.parent;if(!a)return;let s;if(t.table)s=t.table;else{let c=new e(a,this.schema,{inferSchema:this.inferSchema}).getTable(t);if(!c)return;s=c.name}let r=a.sources.get(s);return r?this.getColumnTypeFromScope(r,t):void 0}getColumnTypeFromScope(t,a){if(t instanceof _chunk2Z3O2CFMcjs.Tb){let s=_optionalChain([this, 'access', _34 => _34.schema, 'access', _35 => _35.getColumnType, 'optionalCall', _36 => _36(t,a)]);if(s&&(typeof s.args.this=="string"?s.args.this:"unknown")!=="unknown")return s}else if(t instanceof _chunk2Z3O2CFMcjs.S)for(let[,s]of t.sources){let r=this.getColumnTypeFromScope(s,a);if(r&&(typeof r.args.this=="string"?r.args.this:"unknown")!=="unknown")return r}}};var Oe=Symbol("SELECT_ALL");function Rn(e){let{isAgg:t}=e;return _chunk2Z3O2CFMcjs.ho.call(void 0, t?new (0, _chunk2Z3O2CFMcjs.sn)({this:_chunk2Z3O2CFMcjs.$c.number(1)}):"1","_")}function fs(e,t={}){let{schema:a,removeUnusedSelections:s=!0,dialect:r}=t,o=_chunk2Z3O2CFMcjs.R.call(void 0, a,{dialect:r}),c=new Map,i=new Map,n=Array.from(_chunk2Z3O2CFMcjs.T.call(void 0, e));for(let l=n.length-1;0<=l;l--){let f=n[l],p=i.get(f)||new Set([Oe]),m=c.get(f)||0,d=f.expression;if(d.getArgKey("distinct")&&(p=new Set([Oe])),d instanceof _chunk2Z3O2CFMcjs.Ud){let u=d.args.kind,g=d.args.side;if(!u&&!g){let[b,x]=f.unionScopes;if(b.expression.selects.length!==x.expression.selects.length)throw new Error(`Invalid set operation due to column mismatch: ${f.expression.sql({dialect:r})}.`);if(i.set(b,p),x.expression.selects.some(E=>E instanceof _chunk2Z3O2CFMcjs.Ca&&E.isStar))i.set(x,p);else if(!b.expression.selects.some(E=>E instanceof _chunk2Z3O2CFMcjs.Ca&&E.isStar))if(d.args.byName)i.set(x,i.get(b)||new Set);else{let E=new Set;i.set(x,E);for(let y=0;y<b.expression.selects.length;y++){let S=b.expression.selects[y];if(S instanceof _chunk2Z3O2CFMcjs.Ca&&(p.has(Oe)||p.has(S.aliasOrName))){let h=x.expression.selects[y];h instanceof _chunk2Z3O2CFMcjs.Ca&&E.add(h.aliasOrName)}}}}}if(d instanceof _chunk2Z3O2CFMcjs.Wd){if(s&&_n(f,p,o,m),d.isStar)continue;let u=new Map;for(let g of f.columns){let b=g.table||"",x=g.name,E=u.get(b);E||(E=new Set,u.set(b,E)),E.add(x)}for(let[g,b]of Object.entries(f.selectedSources)){let[x,E]=b;if(E instanceof _chunk2Z3O2CFMcjs.S){let S=_chunk2Z3O2CFMcjs.ca.call(void 0, E.expression.selects,0),h;0<f.pivots.length||S instanceof _chunk2Z3O2CFMcjs.Lb?h=new Set([Oe]):h=u.get(g)||new Set;let A=i.get(E);A||(A=new Set,i.set(E,A));for(let O of h)A.add(O)}let y=x.aliasColumnNames;y&&0<y.length&&c.set(E,y.length)}}}return e}function _n(e,t,a,s){let o=e.expression.args.order,c=new Set;if(o)for(let u of o.findAll(_chunk2Z3O2CFMcjs.Ic))u.table||c.add(u.name);let i=[],n=!1,l=!1,f=!1,p=s,m=t.has(Oe),d=e.expression;for(let u of d.selects){if(typeof u=="string"||typeof u=="number"||typeof u=="boolean")continue;let g=u,b=g.aliasOrName;m||t.has(b)||c.has(b)||0<p?(i.push(g),p-=1):(g.isStar&&(l=!0),n=!0),!f&&g.find(_chunk2Z3O2CFMcjs.he)&&(f=!0)}if(l){let u=new me(e,a,{}),g=new Set(i.map(x=>x.aliasOrName)),b=Array.from(t).filter(x=>typeof x=="string").sort();for(let x of b)if(!g.has(x)){let E=u.getTable(x);i.push(_chunk2Z3O2CFMcjs.ho.call(void 0, _chunk2Z3O2CFMcjs._n.call(void 0, {col:x,table:_optionalChain([E, 'optionalAccess', _37 => _37.aliasOrName])}),x,{copy:!1}))}}i.length===0&&i.push(Rn({isAgg:f})),d.select(i,{append:!1,copy:!1}),n&&e.clearCache()}function ps(e,t={}){let{schema:a,dialect:s}=t,r=_chunk2Z3O2CFMcjs.R.call(void 0, a,{dialect:s});for(let o of _chunk2Z3O2CFMcjs.T.call(void 0, e))if(Object.keys(o.selectedSources).length!==1)for(let[,c]of Object.entries(o.selectedSources)){let[i,n]=c;if(!(n instanceof _chunk2Z3O2CFMcjs.Tb))continue;let l=i;if(!l.parent)continue;let f=_optionalChain([r, 'access', _38 => _38.columnNames, 'optionalCall', _39 => _39(n)]);if(!f||f.length===0||l.parent instanceof _chunk2Z3O2CFMcjs.Xd||_optionalChain([l, 'access', _40 => _40.parent, 'optionalAccess', _41 => _41.parent]) instanceof _chunk2Z3O2CFMcjs.Tb)continue;if(!l.alias)throw new (0, _chunk2Z3O2CFMcjs.j)("Tables require an alias. Run qualify_tables optimization.");let m=l.aliasOrName,d=_chunk2Z3O2CFMcjs.jo.call(void 0, "*").from(_chunk2Z3O2CFMcjs.ho.call(void 0, l,m,{table:!0}),{copy:!1}).subquery(m,{copy:!1});l.replace(d)}return e}function us(e,t={}){let{schema:a,expandAliasRefs:s=!0,expandStars:r=!0,inferSchema:o,allowPartialQualification:c=!1,dialect:i}=t,n=_chunk2Z3O2CFMcjs.R.call(void 0, a,{dialect:i}),l=new (0, _chunk2Z3O2CFMcjs.Z)({schema:n}),f=_nullishCoalesce(o, () => (!!n.empty)),p=n.dialect||new _chunk2Z3O2CFMcjs.op,m=p._constructor,d=m.PSEUDOCOLUMNS;for(let u of _chunk2Z3O2CFMcjs.T.call(void 0, e)){m.PREFER_CTE_ALIAS_COLUMN&&gn(u);let b=u.expression instanceof _chunk2Z3O2CFMcjs.Wd;jn(u,d);let x=new me(u,n,{inferSchema:f});rn(u.ctes),rn(u.derivedTables);let E=Kn(u,x);(n.empty||m.FORCE_EARLY_ALIAS_REF_EXPANSION)&&s&&an(u,x,p,{expandOnlyGroupby:m.EXPAND_ONLY_GROUP_ALIAS_REF}),Mn(u,x),Un(u,x,{allowPartialQualification:c}),!n.empty&&s&&an(u,x,p,{expandOnlyGroupby:!1}),b&&(r&&Ln(u,x,E,d,l),un(u)),Fn(u,p),kn(u,x),m.ANNOTATE_ALL_SCOPES&&l.annotateScope(u)}return e}function ms(e,t){let a=[];for(let s of _chunk2Z3O2CFMcjs.T.call(void 0, e)){if(!(s.expression instanceof _chunk2Z3O2CFMcjs.Wd))continue;let r=s.unqualifiedColumns;if(0<s.externalColumns.length&&!s.isCorrelatedSubquery&&s.pivots.length===0){let o=s.externalColumns[0],c=o.table?` for table: '${o.table}'`:"",i=_optionalChain([o, 'access', _42 => _42.args, 'access', _43 => _43.this, 'optionalAccess', _44 => _44.meta, 'optionalAccess', _45 => _45.line]),n=_optionalChain([o, 'access', _46 => _46.args, 'access', _47 => _47.this, 'optionalAccess', _48 => _48.meta, 'optionalAccess', _49 => _49.col]),l=_optionalChain([o, 'access', _50 => _50.args, 'access', _51 => _51.this, 'optionalAccess', _52 => _52.meta, 'optionalAccess', _53 => _53.start]),f=_optionalChain([o, 'access', _54 => _54.args, 'access', _55 => _55.this, 'optionalAccess', _56 => _56.meta, 'optionalAccess', _57 => _57.end]),p=`Column '${o.name}' could not be resolved${c}.`;if(i&&n&&(p+=` Line: ${i}, Col: ${n}`),t&&l!==void 0&&f!==void 0){let{formattedSql:m}=_chunk2Z3O2CFMcjs.l.call(void 0, {sql:t,positions:[[l,f]]});p+=`
2
+ ${m}`}throw new (0, _chunk2Z3O2CFMcjs.j)(p)}if(0<r.length&&0<s.pivots.length&&s.pivots[0].unpivot){let o=new Set(pn(s.pivots[0]));r=r.filter(c=>!o.has(c))}a.push(...r)}if(0<a.length){let s=a[0],r=s.args.this,o=_chunk2Z3O2CFMcjs.n.call(void 0, r,_chunk2Z3O2CFMcjs.Ca)?r.meta.line:void 0,c=_chunk2Z3O2CFMcjs.n.call(void 0, r,_chunk2Z3O2CFMcjs.Ca)?r.meta.col:void 0,i=_chunk2Z3O2CFMcjs.n.call(void 0, r,_chunk2Z3O2CFMcjs.Ca)?r.meta.start:void 0,n=_chunk2Z3O2CFMcjs.n.call(void 0, r,_chunk2Z3O2CFMcjs.Ca)?r.meta.end:void 0,l=`Ambiguous column '${s.name}'`;if(o&&c&&(l+=` (Line: ${o}, Col: ${c})`),t&&i!==void 0&&n!==void 0){let{formattedSql:f}=_chunk2Z3O2CFMcjs.l.call(void 0, {sql:t,positions:[[i,n]]});l+=`
3
+ ${f}`}throw new (0, _chunk2Z3O2CFMcjs.j)(l)}return e}function jn(e,t){if(t.size===0)return;let a=!1,s=e.expression;for(let r of e.columns){let o=r.name.toUpperCase();t.has(o)&&(o!=="LEVEL"||s instanceof _chunk2Z3O2CFMcjs.Wd&&s.args.connect)&&(r.replace(new (0, _chunk2Z3O2CFMcjs.Jc)({...r.args})),a=!0)}a&&e.clearCache()}function pn(e){let a=(e.args.fields||[]).filter(r=>r instanceof _chunk2Z3O2CFMcjs.Ye&&r.args.this instanceof _chunk2Z3O2CFMcjs.Ic).map(r=>r.args.this),s=[];for(let r of e.args.expressions)for(let o of r.findAll(_chunk2Z3O2CFMcjs.Ic))s.push(o);return[...a,...s]}function rn(e){for(let t of e){if(t.parent instanceof _chunk2Z3O2CFMcjs.Va&&t.parent.args.recursive)continue;let a=t.getArgKey("alias");a instanceof _chunk2Z3O2CFMcjs.Ya&&a.setArgKey("columns",void 0)}}function Kn(e,t){let a=e.expression.args.joins||[];if(a.length===0)return new Map;let s=new Set(a.map(n=>n.aliasOrName)),r=Object.keys(e.selectedSources).filter(n=>!s.has(n));if(0<s.size&&r.length===0)throw new (0, _chunk2Z3O2CFMcjs.j)(`Joins ${[...s].join(",")} missing source table ${e.expression}`);let o={},c=n=>{for(let l of t.getSourceColumns(n))l in o||(o[l]=n)};for(let n of r)c(n);let i=new Map;for(let n=0;n<a.length;n++){let l=a[n];_chunk2Z3O2CFMcjs.o.call(void 0, l,_chunk2Z3O2CFMcjs.Bb);let f=r[r.length-1];f&&c(f);let p=l.aliasOrName;r.push(p);let m=l.args.using;if(!m)continue;let d=t.getSourceColumns(p),u=[],g=m.length,b=l.isSemiOrAntiJoin;for(let x of m){let E=x.name,y=o[E];if((!y||!d.includes(E))&&0<Object.keys(o).length&&!("*"in o)&&0<d.length)throw new (0, _chunk2Z3O2CFMcjs.j)(`Cannot automatically join: ${E}`);y=y||f;let S;if(n===0||g===1)S=_chunk2Z3O2CFMcjs._n.call(void 0, {col:E,table:y});else{let h=r.slice(0,-1).filter(A=>t.getSourceColumns(A).includes(E)).map(A=>_chunk2Z3O2CFMcjs._n.call(void 0, {col:E,table:A}));1<h.length?S=new (0, _chunk2Z3O2CFMcjs.Jg)({this:h[0],expressions:h.slice(1)}):S=_chunk2Z3O2CFMcjs._n.call(void 0, {col:E,table:y})}if(u.push(S.eq(_chunk2Z3O2CFMcjs._n.call(void 0, {col:E,table:p}))),!b){let h=i.get(E);h||(h=[],i.set(E,h)),h.includes(y)||h.push(y),h.includes(p)||h.push(p)}}l.setArgKey("using",void 0),l.setArgKey("on",_chunk2Z3O2CFMcjs.ao.call(void 0, u,{copy:!1}))}if(0<i.size)for(let n of e.columns){let l=n.table?void 0:i.get(n.name);if(l!==void 0){let f=l.map(m=>_chunk2Z3O2CFMcjs._n.call(void 0, {col:n.name,table:m})),p=new (0, _chunk2Z3O2CFMcjs.Jg)({this:f[0],expressions:f.slice(1)});n.parent instanceof _chunk2Z3O2CFMcjs.Wd?p=_chunk2Z3O2CFMcjs.ho.call(void 0, p,n.name,{copy:!1}):n.parent instanceof _chunk2Z3O2CFMcjs.Cl&&(p=new (0, _chunk2Z3O2CFMcjs.Fe)({this:_chunk2Z3O2CFMcjs.eo.call(void 0, n.name),expression:p})),e.replace(n,p)}}return i}function an(e,t,a,s){let{expandOnlyGroupby:r}=s,o=e.expression,c=a._constructor;if(!(o instanceof _chunk2Z3O2CFMcjs.Wd)||c.DISABLES_ALIAS_REF_EXPANSION)return;let i=new Map,n=new Set(o.selects.map(d=>d.aliasOrName)),l=!1,f=(d,u={})=>{let{resolveTable:g=!1,literalIndex:b=!1}=u,x=d instanceof _chunk2Z3O2CFMcjs.yb,E=d instanceof _chunk2Z3O2CFMcjs.qb;if(!(!d||r&&!x))for(let y of _chunk2Z3O2CFMcjs.V.call(void 0, d,{prune:S=>S.isStar})){if(!(y instanceof _chunk2Z3O2CFMcjs.Ic)||r&&x&&y.parent!==d)continue;let S=!1,h=g&&!y.table?t.getTable(y.name):void 0,A=i.get(y.name),O=A?A[0]:void 0,M=A?A[1]:1;if(O)S=!!(O.find(_chunk2Z3O2CFMcjs.he)&&y.findAncestor(_chunk2Z3O2CFMcjs.he)&&!(y.findAncestor(_chunk2Z3O2CFMcjs.Yd,_chunk2Z3O2CFMcjs.Wd)instanceof _chunk2Z3O2CFMcjs.Yd)),E&&c.PROJECTION_ALIASES_SHADOW_SOURCE_NAMES&&(S=S||Array.from(O.findAll(_chunk2Z3O2CFMcjs.Ic)).some(F=>n.has(_optionalChain([F, 'access', _58 => _58.parts, 'access', _59 => _59[0], 'optionalAccess', _60 => _60.name])||"")));else if(c.PROJECTION_ALIASES_SHADOW_SOURCE_NAMES&&(x||E)){let F=h?h.name:y.table;if(F&&n.has(F)){y.replace(_chunk2Z3O2CFMcjs.eo.call(void 0, y.name)),l=!0;continue}}if(h&&(!O||S))y.setArgKey("table",h);else if(!y.table&&O&&!S)if((O instanceof _chunk2Z3O2CFMcjs.$c||O.isNumber)&&(b||g))b&&(y.replace(_chunk2Z3O2CFMcjs.$c.number(M)),l=!0);else{l=!0;let F=y.replace(_chunk2Z3O2CFMcjs.do.call(void 0, O)),Ie=_chunk2Z3O2CFMcjs.ba.call(void 0, F,a);Ie!==F&&F.replace(Ie)}}};for(let d=0;d<o.selects.length;d++){let u=o.selects[d];f(u),u instanceof _chunk2Z3O2CFMcjs.hc&&i.set(u.alias,[u.args.this,d+1])}let p=e,m=!1;for(;p&&!p.isCte;)p.isUnion&&p.parent&&(m=p.parent.expression.args.expression===p.expression),p=p.parent;if(p&&m){let d=p.expression.parent;if(d&&_optionalChain([d, 'access', _61 => _61.findAncestor, 'call', _62 => _62(_chunk2Z3O2CFMcjs.Va), 'optionalAccess', _63 => _63.args, 'access', _64 => _64.recursive])){let g=d.args.alias,b=g instanceof _chunk2Z3O2CFMcjs.Ya?g.columns:[],x=0<b.length?b:_optionalChain([d, 'access', _65 => _65.args, 'access', _66 => _66.this, 'optionalAccess', _67 => _67.selects])||[];for(let E of x)E instanceof _chunk2Z3O2CFMcjs.Ca&&i.delete(E.outputName)}}if(f(o.args.where),f(o.args.group,{literalIndex:!0}),f(o.args.having,{resolveTable:!0}),f(o.args.qualify,{resolveTable:!0}),c.SUPPORTS_ALIAS_REFS_IN_JOIN_CONDITIONS)for(let d of o.args.joins||[])f(d);l&&e.clearCache()}function Mn(e,t){let a=!1,s=[...e.columns,...e.stars];for(let r of s){if(r instanceof _chunk2Z3O2CFMcjs.Ae)continue;let o=r.table,c=r.meta.dotParts||[];if(delete r.meta.dotParts,o&&!e.sources.has(o)&&(!e.parent||!e.parent.sources.has(o)||!e.isCorrelatedSubquery)){let i=r.parts;if(i.length<2)continue;let n=i[0],l=i.slice(1);if(!n)continue;let f,p,m,d;if(e.sources.has(n.name)){if(l.length===0)continue;m=n,f=l[0],p=l.slice(1),d=!0}else m=t.getTable(n.name),f=n,p=l,d=!1;if(m){a=!0;let u=_chunk2Z3O2CFMcjs._n.call(void 0, {col:f,table:m});0<c.length&&(u.meta.dotParts=c.slice(d?2:1)),0<p.length?r.replace(_chunk2Z3O2CFMcjs.Ae.build([u,...p])):r.replace(u)}}}a&&e.clearCache()}function Un(e,t,a){let{allowPartialQualification:s}=a,r=t.dialect._constructor;for(let o of e.columns){let c=o.table,i=o.name;if(c&&e.sources.has(c)){let n=t.getSourceColumns(c);if(!s&&0<n.length&&!n.includes(i)&&!n.includes("*"))throw new (0, _chunk2Z3O2CFMcjs.j)(`Unknown column: ${i}`)}if(!c){if(0<e.pivots.length&&!o.findAncestor(_chunk2Z3O2CFMcjs.Yb)){o.setArgKey("table",_chunk2Z3O2CFMcjs.eo.call(void 0, e.pivots[0].alias));continue}let n=t.getTable(o);if(n){let l=e.sources.get(n.name);if(l instanceof _chunk2Z3O2CFMcjs.S&&l.columnIndex.has(o))continue}if(n)o.setArgKey("table",n);else if(r.TABLES_REFERENCEABLE_AS_COLUMNS&&o.parts.length===1&&i in e.selectedSources){let l=o.args.this;e.replace(o,new (0, _chunk2Z3O2CFMcjs.Dc)({this:_chunk2Z3O2CFMcjs.n.call(void 0, l,_chunk2Z3O2CFMcjs.Ca)?l:void 0}))}}}for(let o of e.pivots)if(o instanceof _chunk2Z3O2CFMcjs.Yb){for(let c of o.findAll(_chunk2Z3O2CFMcjs.Ic))if(!c.table&&t.allColumns.has(c.name)){let i=t.getTable(c.name);i&&c.setArgKey("table",i)}}}function cn(e,t,a){let s=_nullishCoalesce(e.getArgKey("except"), () => (e.getArgKey("except")));if(!s)return;let r=Array.isArray(s)?s:[s],o=new Set(r.filter(c=>c instanceof _chunk2Z3O2CFMcjs.Ca).map(c=>c.name));for(let c of t)a.set(c,o)}function ln(e,t,a){let s=e.getArgKey("rename");if(!s||s.length===0)return;let r={};for(let o of s)if(o instanceof _chunk2Z3O2CFMcjs.Ca){let c=o.args.this;c instanceof _chunk2Z3O2CFMcjs.Ca&&(r[c.name]=o.alias)}for(let o of t)a.set(o,r)}function fn(e,t,a){let s=e.getArgKey("replace");if(!s||s.length===0)return;let r={};for(let o of s)o instanceof _chunk2Z3O2CFMcjs.hc&&(r[o.alias]=o);for(let o of t)a.set(o,r)}function Dn(e){let t=e.find(_chunk2Z3O2CFMcjs.Ic);if(!(t instanceof _chunk2Z3O2CFMcjs.Ic)||!t.isType("struct"))return[];let a=t.copy(),s=a.type,r=_chunk2Z3O2CFMcjs.n.call(void 0, s,_chunk2Z3O2CFMcjs.ac)?s:void 0,o=e.parts.slice(1,-1);e:for(let n of o.slice(1)){let l=_optionalChain([r, 'optionalAccess', _68 => _68.args, 'access', _69 => _69.expressions])||[];for(let f of l){if(!(f.args.this instanceof _chunk2Z3O2CFMcjs.rb))return[];if(!_chunk2Z3O2CFMcjs.n.call(void 0, f,_chunk2Z3O2CFMcjs.Za))return[];let p=f.args.kind,m=_chunk2Z3O2CFMcjs.n.call(void 0, p,_chunk2Z3O2CFMcjs.ac)?p:void 0;if(f.name===n.name&&_optionalChain([m, 'optionalAccess', _70 => _70.isType, 'call', _71 => _71("struct")])){r=m;break e}}return[]}let c=new Set,i=[];for(let n of _optionalChain([r, 'optionalAccess', _72 => _72.args, 'access', _73 => _73.expressions])||[]){let l=n.name,f=n.args.this;if(c.has(l)||!(f instanceof _chunk2Z3O2CFMcjs.rb))return[];c.add(l);let p=f.copy(),m=[...o.map(b=>b.copy()),p],[d,...u]=m,g=_chunk2Z3O2CFMcjs._n.call(void 0, {col:d,table:a.args.table},{fields:u});i.push(_chunk2Z3O2CFMcjs.ho.call(void 0, g,p,{copy:!1}))}return i}function Pn(e){if(!(e.args.this instanceof _chunk2Z3O2CFMcjs.Ve))return[];let t=e.find(_chunk2Z3O2CFMcjs.Ic);if(!(t instanceof _chunk2Z3O2CFMcjs.Ic)||!t.isType("struct"))return[];let a=t.parent,s=t.type,r=_chunk2Z3O2CFMcjs.n.call(void 0, s,_chunk2Z3O2CFMcjs.ac)?s:void 0;for(;a!==void 0;){if(a instanceof _chunk2Z3O2CFMcjs.Ve){a=a.parent;continue}if(!(a instanceof _chunk2Z3O2CFMcjs.Ae))return[];let n=a.right;if(n instanceof _chunk2Z3O2CFMcjs._b)break;if(!(n instanceof _chunk2Z3O2CFMcjs.rb))return[];let l=!1,f=_chunk2Z3O2CFMcjs.q.call(void 0, r.args.expressions||[],_chunk2Z3O2CFMcjs.Za);for(let p of f)if(p.name===n.name){l=!0,r=p.args.kind;break}if(!l)return[];a=a.parent}let o=[],c=e.args.this,i=_chunk2Z3O2CFMcjs.q.call(void 0, r.args.expressions||[],_chunk2Z3O2CFMcjs.Za);for(let n of i){let l=n.args.this instanceof _chunk2Z3O2CFMcjs.rb?n.args.this.copy():new (0, _chunk2Z3O2CFMcjs.rb)({this:_optionalChain([n, 'access', _74 => _74.args, 'access', _75 => _75.this, 'optionalAccess', _76 => _76.toString, 'call', _77 => _77()])}),f=_chunk2Z3O2CFMcjs.Ae.build([c.copy(),l]),p=_chunk2Z3O2CFMcjs.ho.call(void 0, f,l,{copy:!1});o.push(p)}return o}function Ln(e,t,a,s,r){let o=[],c=new Map,i=new Map,n=new Map,l=new Set,f=t.dialect._constructor,p,m=new Set,d=_chunk2Z3O2CFMcjs.ca.call(void 0, e.pivots,0);if(d instanceof _chunk2Z3O2CFMcjs.Yb&&!d.aliasColumnNames.length)if(d.unpivot){p=pn(d).map(u=>u.outputName);for(let u of d.args.fields||[])if(u instanceof _chunk2Z3O2CFMcjs.Ye)for(let g of u.args.expressions)for(let b of g.findAll(_chunk2Z3O2CFMcjs.Ic))m.add(b.outputName)}else{for(let g of d.findAll(_chunk2Z3O2CFMcjs.Ic))m.add(g.outputName);p=(d.getArgKey("columns")||[]).map(g=>g.outputName),p.length||(p=d.args.expressions.map(g=>g.aliasOrName))}f.SUPPORTS_STRUCT_STAR_EXPANSION&&e.stars.some(u=>u instanceof _chunk2Z3O2CFMcjs.Ae)&&r.annotateScope(e);for(let u of e.expression.selects){let g=[];if(u instanceof _chunk2Z3O2CFMcjs._b)g.push(...Object.keys(e.selectedSources)),cn(u,g,c),fn(u,g,i),ln(u,g,n);else if(u.isStar)if(u instanceof _chunk2Z3O2CFMcjs.Ae){if(f.SUPPORTS_STRUCT_STAR_EXPANSION&&!f.REQUIRES_PARENTHESIZED_STRUCT_ACCESS){let b=Dn(u);if(0<b.length){o.push(...b);continue}}else if(f.REQUIRES_PARENTHESIZED_STRUCT_ACCESS){let b=Pn(u);if(0<b.length){o.push(...b);continue}}}else{let b=u instanceof _chunk2Z3O2CFMcjs.Ic?u.table:"";b&&g.push(b);let x=u.args.this;x instanceof _chunk2Z3O2CFMcjs.Ca&&(cn(x,g,c),fn(x,g,i),ln(x,g,n))}if(g.length===0){o.push(u);continue}for(let b of g){if(!e.sources.has(b))throw new (0, _chunk2Z3O2CFMcjs.j)(`Unknown table: ${b}`);let x=t.getSourceColumns(b,{onlyVisible:!0});if(x.length||(x=e.outerColumns),0<s.size&&f.EXCLUDES_PSEUDOCOLUMNS_FROM_STAR&&(x=x.filter(h=>!s.has(h.toUpperCase()))),!x.length||x.includes("*"))return;let E=c.get(b)||new Set,y=n.get(b)||{},S=i.get(b)||{};if(d instanceof _chunk2Z3O2CFMcjs.Yb){let h;if(p&&0<m.size?(h=x.filter(A=>!m.has(A)),h.push(...p)):h=d.aliasColumnNames,0<h.length){for(let A of h)E.has(A)||o.push(_chunk2Z3O2CFMcjs.ho.call(void 0, _chunk2Z3O2CFMcjs._n.call(void 0, {col:A,table:d.alias}),A,{copy:!1}));continue}}for(let h of x){if(E.has(h)||l.has(h))continue;let A=a.get(h);if(_optionalChain([A, 'optionalAccess', _78 => _78.includes, 'call', _79 => _79(b)])){l.add(h);let O=A.map(M=>_chunk2Z3O2CFMcjs._n.call(void 0, {col:h,table:M}));o.push(_chunk2Z3O2CFMcjs.ho.call(void 0, new (0, _chunk2Z3O2CFMcjs.Jg)({this:O[0],expressions:O.slice(1)}),h,{copy:!1}))}else{let O=_nullishCoalesce(y[h], () => (h)),M=S[h]||_chunk2Z3O2CFMcjs._n.call(void 0, {col:h,table:b});o.push(O!==h?_chunk2Z3O2CFMcjs.ho.call(void 0, M,O,{copy:!1}):M)}}}}0<o.length&&e.expression instanceof _chunk2Z3O2CFMcjs.Wd&&e.expression.setArgKey("expressions",o)}function un(e){let t;if(e instanceof _chunk2Z3O2CFMcjs.S)t=e;else{let c=_chunk2Z3O2CFMcjs.U.call(void 0, e);if(!(c instanceof _chunk2Z3O2CFMcjs.S))return;t=c}if(!(t.expression instanceof _chunk2Z3O2CFMcjs.Wd))return;let a=t.expression.selects,s=t.outerColumns,r=[],o=Math.max(a.length,s.length);for(let c=0;c<o;c++){let i=a[c],n=s[c];if(!i||i instanceof _chunk2Z3O2CFMcjs.Lb)break;i instanceof _chunk2Z3O2CFMcjs.Xd?i.outputName||i.setArgKey("alias",new (0, _chunk2Z3O2CFMcjs.Ya)({this:_chunk2Z3O2CFMcjs.eo.call(void 0, `_col_${c}`)})):!(i instanceof _chunk2Z3O2CFMcjs.hc)&&!(i instanceof _chunk2Z3O2CFMcjs.jc)&&!i.isStar&&(i=_chunk2Z3O2CFMcjs.ho.call(void 0, i,i.outputName||`_col_${c}`,{copy:!1})),n&&i.setArgKey("alias",_chunk2Z3O2CFMcjs.eo.call(void 0, n)),r.push(i)}0<r.length&&t.expression instanceof _chunk2Z3O2CFMcjs.Wd&&t.expression.setArgKey("expressions",r)}function mn(e,t){let a=Number(t.args.this)-1,s=e.expression.selects[a];if(!(s instanceof _chunk2Z3O2CFMcjs.hc))throw new (0, _chunk2Z3O2CFMcjs.j)(`Unknown output column: ${t.name}`);return s}function dn(e,t,a,s={}){let{alias:r=!1}=s,o=a._constructor,c=[],i;for(let n of t)if(n.isInteger){let l=mn(e,n);if(r){let f=l.alias;c.push(f?_chunk2Z3O2CFMcjs._n.call(void 0, {col:f}):n)}else{let f=l.args.this,p=!1;o.PROJECTION_ALIASES_SHADOW_SOURCE_NAMES&&(i===void 0&&(i=new Set(e.expression.selects.map(m=>m.aliasOrName).filter(m=>m in e.selectedSources))),p=Array.from(f.findAll(_chunk2Z3O2CFMcjs.Ic)).some(m=>_optionalChain([i, 'optionalAccess', _80 => _80.has, 'call', _81 => _81(_optionalChain([m, 'access', _82 => _82.parts, 'access', _83 => _83[0], 'optionalAccess', _84 => _84.name])||"")]))),_chunk2Z3O2CFMcjs.Ko.some(m=>f instanceof m)||f.isNumber||f.find(_chunk2Z3O2CFMcjs.yi)||f.find(_chunk2Z3O2CFMcjs.Ai)||p?c.push(n):c.push(f.copy())}}else c.push(n);return c}function Fn(e,t){let a=e.expression.args.group;if(!a)return;let s=_chunk2Z3O2CFMcjs.q.call(void 0, a.args.expressions||[],_chunk2Z3O2CFMcjs.Ca);a.setArgKey("expressions",dn(e,s,t)),e.expression.setArgKey("group",a)}function kn(e,t){for(let a of["order","distinct"]){let s=e.expression.getArgKey(a);if(s instanceof _chunk2Z3O2CFMcjs.nc&&(s=s.args.on),!(s instanceof _chunk2Z3O2CFMcjs.Ca))continue;let r=s.args.expressions;a==="order"&&(r=r.map(c=>c.args.this));let o=dn(e,r,t.dialect,{alias:!0});for(let c=0;c<r.length;c++){let i=r[c],n=o[c];for(let l of i.findAll(_chunk2Z3O2CFMcjs.he))for(let f of l.findAll(_chunk2Z3O2CFMcjs.Ic))if(!f.table){let p=t.getTable(f.name);p&&f.setArgKey("table",p)}i.replace(n)}if(e.expression.getArgKey("group")){let c=new Map(e.expression.selects.filter(i=>i instanceof _chunk2Z3O2CFMcjs.hc).map(i=>[i.args.this.sql(),_chunk2Z3O2CFMcjs._n.call(void 0, {col:i.aliasOrName})]));for(let i of r)if(i.isInteger)i.replace(_chunk2Z3O2CFMcjs.eo.call(void 0, mn(e,i).alias));else{let n=c.get(i.sql());n&&i.replace(n)}}}}function ve(e,t={}){let{dialect:a,identify:s=!0}=t,r=_chunk2Z3O2CFMcjs.op.getOrRaise(a);return e.transform(r.quoteIdentifier.bind(r),{identify:s,copy:!1})}function gn(e){for(let t of e.ctes){let a=t.aliasColumnNames;if(0<a.length&&t.args.this instanceof _chunk2Z3O2CFMcjs.Wd){let s=t.args.this,r=s.args.expressions||[],o=[];for(let c=0;c<a.length;c++){let i=a[c],n=r[c];if(!n)break;let l;n instanceof _chunk2Z3O2CFMcjs.hc?(n.setArgKey("alias",_chunk2Z3O2CFMcjs.eo.call(void 0, i)),l=n):l=_chunk2Z3O2CFMcjs.ho.call(void 0, n,i),o.push(l)}s.setArgKey("expressions",o)}}}function ds(e,t={}){let{db:a,catalog:s,onQualify:r,dialect:o,canonicalizeTableAliases:c=!1}=t,i=_chunk2Z3O2CFMcjs.op.getOrRaise(o),n=_chunk2Z3O2CFMcjs.ga.call(void 0, "_"),l;a&&(l=_chunk2Z3O2CFMcjs.fo.call(void 0, a,{dialect:i}),l.meta.isTable=!0,l=_chunk2Z3O2CFMcjs.oa.call(void 0, l,{dialect:i}));let f;s&&(f=_chunk2Z3O2CFMcjs.fo.call(void 0, s,{dialect:i}),f.meta.isTable=!0,f=_chunk2Z3O2CFMcjs.oa.call(void 0, f,{dialect:i}));let p=d=>{d.args.this instanceof _chunk2Z3O2CFMcjs.rb&&(l&&!d.args.db&&d.setArgKey("db",l.copy()),f&&!d.args.catalog&&d.args.db&&d.setArgKey("catalog",f.copy()))};if((l||f)&&!(e instanceof _chunk2Z3O2CFMcjs.Fa)){let u=e.getArgKey("with")||new (0, _chunk2Z3O2CFMcjs.Va)({expressions:[]}),g=new Set((u.args.expressions||[]).map(b=>b.aliasOrName));for(let b of e.walk({prune:x=>x instanceof _chunk2Z3O2CFMcjs.Fa}))b instanceof _chunk2Z3O2CFMcjs.Tb&&(g.has(b.name)||p(b))}let m=(d,u,g={})=>{let{targetAlias:b,scope:x,normalize:E=!1,columns:y}=g,S=d.getArgKey("alias");S||(S=new (0, _chunk2Z3O2CFMcjs.Ya)({}));let h;if(c)h=n(),u.set(S.name||b||"",h);else if(!S.name)h=b||n(),E&&b&&(h=_chunk2Z3O2CFMcjs.oa.call(void 0, h,{dialect:i}).name);else return;S.setArgKey("this",_chunk2Z3O2CFMcjs.eo.call(void 0, h)),y&&S.setArgKey("columns",y.map(A=>_chunk2Z3O2CFMcjs.eo.call(void 0, A))),d.setArgKey("alias",S),x&&x.renameSource("",h)};for(let d of _chunk2Z3O2CFMcjs.T.call(void 0, e)){let u=d.localColumns,g=new Map;for(let x of d.subqueries){let E=x.parent;E&&E instanceof _chunk2Z3O2CFMcjs.Xd&&E.unwrap().replace(E)}for(let x of d.derivedTables){let E=x.unnest();if(E instanceof _chunk2Z3O2CFMcjs.Tb){let S=E.args.joins;E.setArgKey("joins",void 0);let h=x.args.this;if(h instanceof _chunk2Z3O2CFMcjs.Ca){let A=_chunk2Z3O2CFMcjs.jo.call(void 0, "*").from(E.copy(),{copy:!1});h.replace(A),A.setArgKey("joins",S)}}m(x,g,{scope:d});let y=_chunk2Z3O2CFMcjs.ca.call(void 0, x.getArgKey("pivots")||[],0);y&&m(y,g)}let b=new Map;for(let[x,E]of d.sources)if(E instanceof _chunk2Z3O2CFMcjs.Tb){let y=!!x,S=E.args.pivots,h=S?_chunk2Z3O2CFMcjs.ca.call(void 0, S,0):void 0,A=x;h&&(A=E.name);let O=E.args.this,M=E.args.alias,F=[];if(O&&O instanceof _chunk2Z3O2CFMcjs.ge){let Ss=O.constructor.name;if(M)M instanceof _chunk2Z3O2CFMcjs.Ya&&_optionalChain([M, 'access', _85 => _85.args, 'access', _86 => _86.columns, 'optionalAccess', _87 => _87.length])?F=M.columns:i._constructor.DEFAULT_FUNCTIONS_COLUMN_NAMES.has(Ss)&&(F=Array.from(_chunk2Z3O2CFMcjs.da.call(void 0, E.aliasOrName)),E.setArgKey("alias",void 0),A="");else{let ys=i._constructor.DEFAULT_FUNCTIONS_COLUMN_NAMES.get(Ss);F=ys?Array.from(_chunk2Z3O2CFMcjs.da.call(void 0, ys)):[]}}m(E,g,{targetAlias:A||E.name||void 0,normalize:!0,columns:F});let Ie=_optionalChain([E, 'access', _88 => _88.parts, 'optionalAccess', _89 => _89.map, 'call', _90 => _90(qe=>qe.name), 'access', _91 => _91.join, 'call', _92 => _92(".")]),hs=_optionalChain([E, 'access', _93 => _93.args, 'access', _94 => _94.alias, 'optionalAccess', _95 => _95.args, 'access', _96 => _96.this]);if(hs instanceof _chunk2Z3O2CFMcjs.rb&&b.set(Ie,hs.copy()),h){let qe=h.getArgKey("unpivot")?E.alias:void 0;if(m(h,g,{targetAlias:qe,normalize:!0}),d.sources.get(E.aliasOrName)instanceof _chunk2Z3O2CFMcjs.S)continue}y&&(p(E),r&&r(E))}else if(E instanceof _chunk2Z3O2CFMcjs.S&&E.isUdtf){let y=E.expression;if(m(y,g),y instanceof _chunk2Z3O2CFMcjs.se){let S=y.getArgKey("alias");S instanceof _chunk2Z3O2CFMcjs.Ya&&!_optionalChain([S, 'access', _97 => _97.args, 'access', _98 => _98.columns, 'optionalAccess', _99 => _99.length])&&S.setArgKey("columns",i.generateValuesAliases(y).map(h=>_chunk2Z3O2CFMcjs.oa.call(void 0, h,{dialect:i})))}}for(let x of d.tables)if(!x.alias&&x.parent){let E=x.parent;(E instanceof _chunk2Z3O2CFMcjs.pb||E instanceof _chunk2Z3O2CFMcjs.Bb)&&m(x,g,{targetAlias:x.name})}for(let x of u){let E=x.table;if(x.args.db){let y=x.parts.slice(0,-1).map(h=>h.name).join("."),S=b.get(y);S&&(x.setArgKey("table",void 0),x.setArgKey("db",void 0),x.setArgKey("catalog",void 0),x.setArgKey("table",S.copy()))}else if(0<g.size&&E){let y=g.get(E);y&&y!==x.table&&x.setArgKey("table",_chunk2Z3O2CFMcjs.eo.call(void 0, y))}}}return e}function gs(e,t={}){let{dialect:a,db:s,catalog:r,schema:o,expandAliasRefs:c=!0,expandStars:i=!0,inferSchema:n,isolateTables:l=!1,qualifyColumns:f=!0,allowPartialQualification:p=!1,validateQualifyColumns:m=!0,quoteIdentifiers:d=!0,identify:u=!0,canonicalizeTableAliases:g=!1,onQualify:b,sql:x}=t,E=_chunk2Z3O2CFMcjs.R.call(void 0, o,{dialect:a}),y=_chunk2Z3O2CFMcjs.op.getOrRaise(a);return e=_chunk2Z3O2CFMcjs.oa.call(void 0, e,{dialect:y,storeOriginalColumnIdentifiers:!0}),e=ds(e,{db:s,catalog:r,dialect:y,onQualify:b,canonicalizeTableAliases:g}),l&&(e=ps(e,{schema:E,dialect:y})),f&&(e=us(e,{schema:E,expandAliasRefs:c,expandStars:i,inferSchema:n,allowPartialQualification:p})),d&&(e=ve(e,{dialect:y,identify:u})),m&&ms(e,x),e}function xs(e){let t=_chunk2Z3O2CFMcjs.ga.call(void 0, "_u_");for(let a of _chunk2Z3O2CFMcjs.T.call(void 0, e)){let s=a.expression,r=s.parentSelect;if(!r||!_chunk2Z3O2CFMcjs.n.call(void 0, r,_chunk2Z3O2CFMcjs.Wd)||!_chunk2Z3O2CFMcjs.n.call(void 0, s,_chunk2Z3O2CFMcjs.Wd))continue;let o=s;0<a.externalColumns.length?$n(o,r,a.externalColumns,t):a.scopeType==="subquery"&&zn(o,r,t)}return e}function zn(e,t,a){if(1<e.selects.length)return;let s=e.findAncestor(_chunk2Z3O2CFMcjs.Da);if(!s||s instanceof _chunk2Z3O2CFMcjs.ge&&(s.parent instanceof _chunk2Z3O2CFMcjs.Tb||s.parent instanceof _chunk2Z3O2CFMcjs.pb||s.parent instanceof _chunk2Z3O2CFMcjs.Bb)||t!==s.parentSelect||!t.args.from)return;let r=e;e instanceof _chunk2Z3O2CFMcjs.Ud&&(r=_chunk2Z3O2CFMcjs.jo.call(void 0, e.selects).from(e.subquery(a()),{copy:!1}));let o=a(),c=s.findAncestor(_chunk2Z3O2CFMcjs.qb,_chunk2Z3O2CFMcjs.Zb,_chunk2Z3O2CFMcjs.Bb);if(!(s instanceof _chunk2Z3O2CFMcjs.Ye||s instanceof _chunk2Z3O2CFMcjs.nm)){let u=_chunk2Z3O2CFMcjs._n.call(void 0, {col:r.selects[0].aliasOrName,table:o}),g=_optionalChain([c, 'optionalAccess', _100 => _100.parentSelect]);if(c instanceof _chunk2Z3O2CFMcjs.qb&&g===t||(!c||g!==t)&&(t.args.group||t.selects.some(E=>_chunk2Z3O2CFMcjs.X.call(void 0, E,_chunk2Z3O2CFMcjs.he))))u=new (0, _chunk2Z3O2CFMcjs.sn)({this:u});else if(!(e.parent instanceof _chunk2Z3O2CFMcjs.Xd))return;let b="cross",x;s instanceof _chunk2Z3O2CFMcjs.Xh&&(u=u.is(_chunk2Z3O2CFMcjs.Bo.call(void 0, )).not(),b="left",x=_chunk2Z3O2CFMcjs.Co.call(void 0, )),Q(e.parent,u),t.join(r,{on:x,joinType:b,joinAlias:o,copy:!1});return}if(r.find([_chunk2Z3O2CFMcjs.Ab,_chunk2Z3O2CFMcjs.Eb]))return;let i=s;if(s instanceof _chunk2Z3O2CFMcjs.nm){let u=s.findAncestor(_chunk2Z3O2CFMcjs.Ce);if(!u||t!==u.parentSelect)return;i=u}let n=Es(i),l=r.selects[0],f=l.args.this;if(!(f instanceof _chunk2Z3O2CFMcjs.Ca))return;let p=_chunk2Z3O2CFMcjs._n.call(void 0, {col:l.alias,table:o}),m=p.is(_chunk2Z3O2CFMcjs.Bo.call(void 0, )).not();c instanceof _chunk2Z3O2CFMcjs.Bb?(Q(i,_chunk2Z3O2CFMcjs.Co.call(void 0, )),t.where(m,{copy:!1})):Q(i,m);let d=r.args.group;if(d){let u=new Set((_nullishCoalesce(d.args.expressions, () => ([]))).map(g=>g instanceof _chunk2Z3O2CFMcjs.Ca?g.sql():String(g)));(u.size!==1||!u.has(l.args.this.sql()))&&(r=_chunk2Z3O2CFMcjs.jo.call(void 0, _chunk2Z3O2CFMcjs.ho.call(void 0, _chunk2Z3O2CFMcjs._n.call(void 0, {col:l.alias,table:"_q"}),l.alias,{copy:!1})).from(r.subquery("_q",{copy:!1}),{copy:!1}).groupBy(_chunk2Z3O2CFMcjs._n.call(void 0, {col:l.alias,table:"_q"}),{copy:!1}))}else _chunk2Z3O2CFMcjs.X.call(void 0, f,_chunk2Z3O2CFMcjs.he)||(r=r.groupBy(f,{copy:!1}));n&&t.join(r,{on:n.eq(p),joinType:"left",joinAlias:o,copy:!1})}function $n(e,t,a,s){let r=e.args.where;if(!r||r.find(_chunk2Z3O2CFMcjs.ln)||e.find([_chunk2Z3O2CFMcjs.Ab,_chunk2Z3O2CFMcjs.Eb]))return;let o=s(),c=[];for(let S of a){if(S.findAncestor(_chunk2Z3O2CFMcjs.Zb)!==r)return;let h=S.findAncestor(_chunk2Z3O2CFMcjs.Ea);if(!h||h.findAncestor(_chunk2Z3O2CFMcjs.Zb)!==r)return;let A;if(h instanceof _chunk2Z3O2CFMcjs.be)A=Array.from(_optionalChain([h, 'access', _101 => _101.left, 'optionalAccess', _102 => _102.walk, 'call', _103 => _103()])||[]).some(O=>O===S)?h.right:h.left;else return;if(!A)return;c.push([A,S,h])}if(!c.some(([,,S])=>S instanceof _chunk2Z3O2CFMcjs.Ce))return;let i=t.selects.map(S=>S.unalias()).some(S=>S instanceof _chunk2Z3O2CFMcjs.Xd&&S===e.parent),n=e.selects[0],l=n.args.this;if(!(l instanceof _chunk2Z3O2CFMcjs.Ca))return;let f=new Map,p=new Map,m=new Set,d=[],u=S=>m.has(S.sql());for(let[S,,h]of c){let A=S.sql();A===l.sql()?(f.set(A,n.alias),p.set(A,S),m.has(A)||(m.add(A),d.push(S))):(f.has(A)||(f.set(A,s()),p.set(A,S)),h instanceof _chunk2Z3O2CFMcjs.Ce&&!m.has(A)&&(m.add(A),d.push(S)))}let g=e.findAncestor(_chunk2Z3O2CFMcjs.Ea),b=i?_chunk2Z3O2CFMcjs.sn:_chunk2Z3O2CFMcjs.Nm;!n.find(_chunk2Z3O2CFMcjs.he)&&!u(l)&&e.select(_chunk2Z3O2CFMcjs.ho.call(void 0, new b({this:l}),n.alias,{quoted:!1}),{append:!1,copy:!1}),g instanceof _chunk2Z3O2CFMcjs.Xh&&e.setArgKey("expressions",[]);for(let[S,h]of f){let A=p.get(S);m.has(S)?(g instanceof _chunk2Z3O2CFMcjs.Xh||S!==n.args.this.sql())&&e.select(`${A} AS ${h}`,{copy:!1}):e.select(_chunk2Z3O2CFMcjs.ho.call(void 0, new b({this:A.copy()}),h,{quoted:!1}),{copy:!1})}let x=_chunk2Z3O2CFMcjs._n.call(void 0, {col:n.alias,table:o}),E=Es(g),y=_optionalChain([g, 'optionalAccess', _104 => _104.parent, 'optionalAccess', _105 => _105._constructor]);if(g instanceof _chunk2Z3O2CFMcjs.Xh)x=_chunk2Z3O2CFMcjs._n.call(void 0, {col:Array.from(f.values())[0],table:o}),g=Q(g,`NOT ${x} IS NULL`);else if(g instanceof _chunk2Z3O2CFMcjs.mm){if(!y||!(y.prototype instanceof _chunk2Z3O2CFMcjs.be||y===_chunk2Z3O2CFMcjs.be))return;let S=new y({this:E,expression:_chunk2Z3O2CFMcjs._n.call(void 0, {col:"_x"})});g.parent&&(g=Q(g.parent,`ARRAY_ALL(${x}, _x -> ${S})`))}else if(g instanceof _chunk2Z3O2CFMcjs.nm){if(!y||!(y.prototype instanceof _chunk2Z3O2CFMcjs.be||y===_chunk2Z3O2CFMcjs.be))return;if(u(n.args.this)){let S=new y({this:E,expression:x});g.parent&&(g=Q(g.parent,S))}else{let S=new y({this:E,expression:_chunk2Z3O2CFMcjs._n.call(void 0, {col:"_x"})});g=Q(g,`ARRAY_ANY(${x}, _x -> ${S})`)}}else if(g instanceof _chunk2Z3O2CFMcjs.Ye)u(n.args.this)?g=Q(g,`${E} = ${x}`):g=Q(g,`ARRAY_ANY(${x}, _x -> _x = ${g.args.this})`);else{if(i&&_optionalChain([e, 'access', _106 => _106.parent, 'optionalAccess', _107 => _107.alias])&&(x=_chunk2Z3O2CFMcjs.ho.call(void 0, x,e.parent.alias,{copy:!1})),n.find(_chunk2Z3O2CFMcjs.en)){let S=h=>h instanceof _chunk2Z3O2CFMcjs.en?_chunk2Z3O2CFMcjs.$c.number(0):h instanceof _chunk2Z3O2CFMcjs.he?_chunk2Z3O2CFMcjs.Bo.call(void 0, ):h;x=new (0, _chunk2Z3O2CFMcjs.Jg)({this:x,expressions:[n.args.this.transform(S)]})}_optionalChain([e, 'access', _108 => _108.parent, 'optionalAccess', _109 => _109.replace, 'call', _110 => _110(x)])}for(let[S,h,A]of c){A.replace(_chunk2Z3O2CFMcjs.Co.call(void 0, ));let O=f.get(S.sql());if(!O)continue;let M=_chunk2Z3O2CFMcjs._n.call(void 0, {col:O,table:o});if(i){S.replace(M),A instanceof _chunk2Z3O2CFMcjs.Ce||t.where(A,{copy:!1});continue}u(S)?S.replace(M):A instanceof _chunk2Z3O2CFMcjs.Ce?g&&(g=Q(g,`(${g} AND ARRAY_CONTAINS(${M}, ${h}))`)):(S.replace(_chunk2Z3O2CFMcjs.eo.call(void 0, "_x")),g&&(g=Q(g,`(${g} AND ARRAY_ANY(${M}, _x -> ${A}))`)))}t.join(e.groupBy(d,{copy:!1}),{on:c.filter(([,,S])=>S instanceof _chunk2Z3O2CFMcjs.Ce).map(([,,S])=>S),joinType:"left",joinAlias:o,copy:!1})}function Q(e,t){return e.replace(_chunk2Z3O2CFMcjs.uo.call(void 0, t))}function Es(e){if(e instanceof _chunk2Z3O2CFMcjs.Ye)return e.args.this;if(e instanceof _chunk2Z3O2CFMcjs.nm||e instanceof _chunk2Z3O2CFMcjs.mm)return Es(e.parent);if(e instanceof _chunk2Z3O2CFMcjs.be)return e.left instanceof _chunk2Z3O2CFMcjs.Xd||e.left instanceof _chunk2Z3O2CFMcjs.nm||e.left instanceof _chunk2Z3O2CFMcjs.Xh||e.left instanceof _chunk2Z3O2CFMcjs.mm?e.right:e.left}var xn=[gs,fs,_chunk2Z3O2CFMcjs._,xs,ls,_chunk2Z3O2CFMcjs.Oo,$e,cs,as,is,ve,_chunk2Z3O2CFMcjs.Y,_chunk2Z3O2CFMcjs.No,_chunk2Z3O2CFMcjs.aa];function vo(e,t={}){let{schema:a,db:s,catalog:r,dialect:o,rules:c=xn,sql:i,isolateTables:n=!0,quoteIdentifiers:l=!1,...f}=t,p=_chunk2Z3O2CFMcjs.R.call(void 0, a,{dialect:o}),m={db:s,catalog:r,schema:p,dialect:o,sql:i,isolateTables:n,quoteIdentifiers:l,...f},d=_chunk2Z3O2CFMcjs.vo.call(void 0, e,{dialect:o,copy:!0});for(let u of c)d=u(d,m);return d}exports.a = gs; exports.b = Ws; exports.c = vo;
4
+ //# sourceMappingURL=chunk-DOKMTZYO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/huydna/projects/sqlingo.js/dist/chunk-DOKMTZYO.cjs","../src/optimizer/eliminate_ctes.ts","../src/optimizer/eliminate_joins.ts","../src/optimizer/eliminate_subqueries.ts","../src/optimizer/merge_subqueries.ts","../src/optimizer/pushdown_predicates.ts","../src/optimizer/resolver.ts","../src/optimizer/qualify_columns.ts","../src/optimizer/qualify.ts"],"names":["eliminateCtes","expression","root","buildScope","refCount","scopes","scope","i","scopeId","cteNode","withNode","withExpressions","source","sourceScope","Scope","currentCount","eliminateJoins","traverseScope","joins","join","assertIsInstanceOf","JoinExpr","alias","shouldEliminateJoin","innerSource","joinIsUsed","side","onClause","isJoinedOnAllUniqueOutputs","hasSingleOutputRow","onClauseColumns","column","ColumnExpr","uniqueOutputs_","uniqueOutputs","joinKeys","joinCondition","joinKeyNames","k","output","SelectExpr","select","group","groupedSqls","e","Expression","groupedOutputSqls","selectExpr","outputSql","s","AggFuncExpr","isLimit1","limit","LimitExpr","name","on","true_","sourceKeys","extractCondition","condition","left","right","leftTables","columnTableNames","rightTables","normalized","andOn","AndExpr","and","EqExpr","conditions","orBranch","parts","p","temp","cs","c","tables","eliminateSubqueries","SubqueryExpr","taken","parent","TableExpr","existingCtes","withClause","recursive","WithExpr","cte","isInstanceOf","CteExpr","newCtes","cteScope","newCte","eliminate","cteParent","restScopes","childScope","DdlExpr","eliminateDerivedTable","eliminateCte","LateralExpr","toReplace","tableExpr","table","newTable","duplicateCteAlias","findNewName","TableAliasExpr","toIdentifier","mergeSubqueries","options","leaveTablesIsolated","mergeCtes","mergeDerivedTables","SAFE_TO_REPLACE_UNWRAPPED","FuncExpr","NeqExpr","ParenExpr","cteSelections","outerScope","sourceEntry","scopeList","singularCteSelections","selections","innerScope","fromOrJoin","FromExpr","mergeable","renameInnerSources","mergeFrom","mergeExpressions","mergeOrder","mergeJoins","mergeWhere","mergeHints","popCte","subquery","innerSelect","isWindowExpressionInUnmergableOperation","windowAliases","innerSelectExpr","WindowExpr","innerSelectName","unmergableWindowColumns","WhereExpr","GroupExpr","OrderExpr","HavingExpr","outerSelectJoinsOnInnerSelectJoin","innerFrom","innerFromTable","innerProjections","selection","projection","col","isRecursive","node","outerSelectExpr","arg","Dialect","ExplodeExpr","joinSide","outerJoins","j","seqGet","QueryTransformExpr","innerTaken","outerTaken","conflicts","x","conflict","newName","newAlias","nodeToReplace","newSubquery","joinHint","newSubquerySource","newJoins","joinSource","position","outerColumns","columnList","expr","projectionName","columnsToReplace","unaliasedExpr","mustWrapExpression","cls","isNumber","replacementExpr","UnaryExpr","BinaryExpr","paren","where","whereThis","outerExpression","from","sources","whereTables","t","innerScopeHint","outerScopeHint","innerHintExpressions","hintExpression","with_","pushdownPredicates","dialectArg","dialect","unnestRequiresCrossJoin","scopeRefCount","whereClause","selectedSources","joinIndex","pushdownAllowed","UnnestExpr","pushdown","simplified","simplify","cnfLike","predicates","OrExpr","pushdownCnf","pushdownDnf","joinIndexMap","predicate","nodes","nodesForPredicate","predicateTables","thisIndex","innerPredicate","replaceAliases","findInScope","pushdownTables","a","aTables","b","bTables","existing","or","whereCondition","narrowInstanceOf","hasWindowExpression","sel","hasGroup","aliases","AliasExpr","aliasThis","replaceAlias","replacement","Resolver","_Resolver","schema","inferSchema","MapBinaryTuple","columnName","tableName","joinContext","availableSources","OptimizeError","allSourceColumns","sourcesWithoutSchema","columns","selectedSource","currentNode","QueryExpr","nodeAlias","IdentifierExpr","subqueryThis","SetOperationExpr","canonicalizeTableAliases"],"mappings":"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","file":"/home/huydna/projects/sqlingo.js/dist/chunk-DOKMTZYO.cjs","sourcesContent":[null,"// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/eliminate_ctes.py\n\nimport type {\n Expression,\n} from '../expressions';\nimport {\n buildScope, Scope,\n} from './scope';\n\n/**\n * Remove unused CTEs from an expression.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { eliminateCtes } from 'sqlglot/optimizer';\n *\n * const sql = \"WITH y AS (SELECT a FROM x) SELECT a FROM z\";\n * const expression = parseOne(sql);\n * eliminateCtes(expression).sql();\n * // 'SELECT a FROM z'\n * ```\n *\n * @param expression - Expression to optimize\n * @returns The optimized expression\n */\nexport function eliminateCtes<E extends Expression> (expression: E): E {\n const root = buildScope(expression);\n\n if (root) {\n const refCount = root.refCount();\n\n // Traverse the scope tree in reverse so we can remove chains of unused CTEs\n const scopes: Scope[] = [\n ];\n for (const scope of root.traverse()) {\n scopes.push(scope);\n }\n\n for (let i = scopes.length - 1; 0 <= i; i--) {\n const scope = scopes[i];\n if (scope.isCte) {\n const scopeId = scope;\n const count = refCount.get(scopeId) || 0;\n\n if (count <= 0) {\n const cteNode = scope.expression.parent;\n if (!cteNode) {\n continue;\n }\n\n const withNode = cteNode.parent;\n cteNode.pop();\n\n // Pop the entire WITH clause if this is the last CTE\n if (withNode) {\n const withExpressions = withNode.args.expressions;\n if (!withExpressions || withExpressions.length === 0) {\n withNode.pop();\n }\n }\n\n // Decrement the ref count for all sources this CTE selects from\n for (const [\n , source,\n ] of Object.entries(scope.selectedSources)) {\n const [\n , sourceScope,\n ] = source;\n if (sourceScope instanceof Scope) {\n const currentCount = refCount.get(sourceScope) || 0;\n refCount.set(sourceScope, currentCount - 1);\n }\n }\n }\n }\n }\n }\n\n return expression;\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/eliminate_joins.py\n\nimport {\n AggFuncExpr,\n and,\n AndExpr,\n ColumnExpr,\n EqExpr,\n Expression,\n JoinExpr,\n JoinExprKind,\n LimitExpr,\n SelectExpr,\n true_,\n} from '../expressions';\nimport {\n assertIsInstanceOf,\n} from '../port_internals';\nimport {\n normalized,\n} from './normalize';\nimport {\n Scope, traverseScope,\n} from './scope';\n\n/**\n * Remove unused joins from an expression.\n *\n * This only removes joins when we know that the join condition doesn't produce duplicate rows.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { eliminateJoins } from 'sqlglot/optimizer';\n *\n * const sql = \"SELECT x.a FROM x LEFT JOIN (SELECT DISTINCT y.b FROM y) AS y ON x.b = y.b\";\n * const expression = parseOne(sql);\n * eliminateJoins(expression).sql();\n * // 'SELECT x.a FROM x'\n * ```\n *\n * @param expression - Expression to optimize\n * @returns The optimized expression\n */\nexport function eliminateJoins<E extends Expression> (expression: E): E {\n for (const scope of traverseScope(expression)) {\n // If any columns in this scope aren't qualified, it's hard to determine if a join isn't used.\n // It's probably possible to infer this from the outputs of derived tables.\n // But for now, let's just skip this rule.\n if (0 < scope.unqualifiedColumns.length) {\n continue;\n }\n\n const joins = scope.expression.args.joins;\n if (!joins) {\n continue;\n }\n\n // Reverse the joins so we can remove chains of unused joins\n for (let i = joins.length - 1; 0 <= i; i--) {\n const join: Expression = joins[i];\n assertIsInstanceOf(join, JoinExpr);\n if (join.isSemiOrAntiJoin) {\n continue;\n }\n\n const alias = join.aliasOrName;\n if (alias && shouldEliminateJoin(scope, join, alias)) {\n join.pop();\n scope.removeSource(alias);\n }\n }\n }\n\n return expression;\n}\n\nfunction shouldEliminateJoin (scope: Scope, join: JoinExpr, alias: string): boolean {\n const innerSource = scope.sources.get(alias);\n if (!(innerSource instanceof Scope)) {\n return false;\n }\n\n if (joinIsUsed(scope, join, alias)) {\n return false;\n }\n\n const side = join.args.side;\n const onClause = join.args.on;\n\n return (\n (side === JoinExprKind.LEFT && isJoinedOnAllUniqueOutputs(innerSource, join))\n || (!onClause && hasSingleOutputRow(innerSource))\n );\n}\n\nfunction joinIsUsed (scope: Scope, join: JoinExpr, alias: string): boolean {\n // We need to find all columns that reference this join.\n // But columns in the ON clause shouldn't count.\n const onClause = join.args.on;\n\n const onClauseColumns = new Set<Expression>();\n if (onClause) {\n for (const column of onClause.findAll(ColumnExpr)) {\n onClauseColumns.add(column);\n }\n }\n\n const sourceColumns = scope.sourceColumns(alias);\n return sourceColumns.some((column) => !onClauseColumns.has(column));\n}\n\nfunction isJoinedOnAllUniqueOutputs (scope: Scope, join: JoinExpr): boolean {\n const uniqueOutputs_ = uniqueOutputs(scope);\n if (!uniqueOutputs_ || uniqueOutputs_.size === 0) {\n return false;\n }\n\n const {\n joinKeys,\n } = joinCondition(join);\n const joinKeyNames = new Set(joinKeys.map((k) => k.name));\n\n for (const output of uniqueOutputs_) {\n if (!joinKeyNames.has(output)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction uniqueOutputs (scope: Scope): Set<string> | undefined {\n const expression = scope.expression;\n if (!(expression instanceof SelectExpr)) {\n return undefined;\n }\n\n const select = expression;\n\n // DISTINCT makes all outputs unique\n if (select.args.distinct) {\n return new Set(select.namedSelects);\n }\n\n // GROUP BY makes grouped columns unique\n const group = select.args.group;\n if (group) {\n const groupedSqls = new Set(\n (group.args.expressions ?? [\n ])\n .filter((e): e is Expression => e instanceof Expression)\n .map((e) => e.sql()),\n );\n const groupedOutputSqls = new Set<string>();\n const uniqueOutputs = new Set<string>();\n\n for (const selectExpr of select.selects) {\n if (!(selectExpr instanceof Expression)) {\n continue;\n }\n\n const outputSql = selectExpr.unalias().sql();\n if (groupedSqls.has(outputSql)) {\n groupedOutputSqls.add(outputSql);\n uniqueOutputs.add(selectExpr.aliasOrName);\n }\n }\n\n // All the grouped expressions must be in the output\n const allGroupedInOutput = [\n ...groupedSqls,\n ].every((s) => groupedOutputSqls.has(s));\n\n return allGroupedInOutput ? uniqueOutputs : new Set();\n }\n\n // Single row output makes all outputs unique\n if (hasSingleOutputRow(scope)) {\n return new Set(select.namedSelects);\n }\n\n return new Set();\n}\n\nfunction hasSingleOutputRow (scope: Scope): boolean {\n const expression = scope.expression;\n if (!(expression instanceof SelectExpr)) {\n return false;\n }\n\n const select = expression;\n\n // No FROM clause means single row\n if (!select.args.from) {\n return true;\n }\n\n // All aggregates without GROUP BY means single row\n const allAggregates = select.selects.every((e) => {\n if (!(e instanceof Expression)) {\n return false;\n }\n const unaliased = e.unalias();\n return unaliased instanceof AggFuncExpr;\n });\n\n if (allAggregates) {\n return true;\n }\n\n // LIMIT 1 means single row\n if (isLimit1(scope)) {\n return true;\n }\n\n return false;\n}\n\nfunction isLimit1 (scope: Scope): boolean {\n const limit = scope.expression.getArgKey('limit');\n if (!(limit instanceof LimitExpr)) {\n return false;\n }\n return limit.args.expression?.args.this === '1';\n}\n\n/**\n * Extract the join condition from a join expression.\n *\n * @param join - The join expression\n * @returns Tuple of (source key, join key, remaining predicate)\n */\nexport function joinCondition (\n join: JoinExpr,\n): {\n sourceKeys: Expression[];\n joinKeys: Expression[];\n on: Expression;\n} {\n const name = join.aliasOrName;\n const onClause = join.args.on;\n const on = (onClause || true_()).copy();\n\n const sourceKeys: Expression[] = [\n ];\n const joinKeys: Expression[] = [\n ];\n\n function extractCondition (condition: Expression): void {\n const [\n left,\n right,\n ] = condition.unnestOperands();\n if (!left || !right) {\n return;\n }\n\n const leftTables = columnTableNames(left);\n const rightTables = columnTableNames(right);\n\n if (name && leftTables.has(name) && !rightTables.has(name)) {\n joinKeys.push(left);\n sourceKeys.push(right);\n condition.replace(true_());\n } else if (name && rightTables.has(name) && !leftTables.has(name)) {\n joinKeys.push(right);\n sourceKeys.push(left);\n condition.replace(true_());\n }\n }\n\n if (normalized(on)) {\n // CNF form: AND of EQ conditions\n const andOn = on instanceof AndExpr\n ? on\n : and([\n on,\n true_(),\n ], {\n copy: false,\n });\n for (const condition of andOn.flatten()) {\n if (condition instanceof EqExpr) {\n extractCondition(condition);\n }\n }\n } else if (normalized(on, {\n dnf: true,\n })) {\n // DNF form: OR of ANDs — find EQ conditions present in every OR branch\n let conditions: EqExpr[] | undefined;\n\n for (const orBranch of on.flatten()) {\n const parts = Array.from(orBranch.flatten())\n .filter((p): p is EqExpr => p instanceof EqExpr);\n\n if (conditions === undefined) {\n conditions = parts;\n } else {\n const temp: EqExpr[] = [\n ];\n for (const p of parts) {\n const cs = conditions.filter((c) => p.sql() === c.sql());\n if (0 < cs.length) {\n temp.push(p);\n temp.push(...cs);\n }\n }\n conditions = temp;\n }\n }\n\n if (conditions) {\n for (const condition of conditions) {\n extractCondition(condition);\n }\n }\n }\n\n return {\n sourceKeys,\n joinKeys,\n on,\n };\n}\n\nfunction columnTableNames (expression: Expression): Set<string> {\n const tables = new Set<string>();\n for (const column of expression.findAll(ColumnExpr)) {\n if (column.table) {\n tables.add(column.table);\n }\n }\n return tables;\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/eliminate_subqueries.py\n\nimport type {\n Expression, ExpressionHash,\n} from '../expressions';\nimport {\n alias,\n CteExpr,\n DdlExpr,\n LateralExpr,\n SubqueryExpr,\n table,\n TableAliasExpr,\n TableExpr,\n toIdentifier,\n WithExpr,\n} from '../expressions';\nimport {\n assertIsInstanceOf, isInstanceOf,\n} from '../port_internals';\nimport {\n findNewName,\n} from '../helper';\nimport type {\n Scope,\n} from './scope';\nimport {\n buildScope,\n} from './scope';\n\ntype ExistingCTEsMapping = Map<ExpressionHash, string>;\ntype TakenNameMapping = Map<string, Scope | TableExpr>;\n\n/**\n * Rewrite derived tables as CTEs, deduplicating if possible.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { eliminateSubqueries } from 'sqlglot/optimizer';\n *\n * const expression = parseOne(\"SELECT a FROM (SELECT * FROM x) AS y\");\n * eliminateSubqueries(expression).sql();\n * // 'WITH y AS (SELECT * FROM x) SELECT a FROM y AS y'\n * ```\n *\n * This also deduplicates common subqueries:\n * ```ts\n * const expression = parseOne(\"SELECT a FROM (SELECT * FROM x) AS y CROSS JOIN (SELECT * FROM x) AS z\");\n * eliminateSubqueries(expression).sql();\n * // 'WITH y AS (SELECT * FROM x) SELECT a FROM y AS y CROSS JOIN y AS z'\n * ```\n *\n * @param expression - Expression to optimize\n * @returns The optimized expression\n */\nexport function eliminateSubqueries<E extends Expression> (expression: E): E {\n if (expression instanceof SubqueryExpr && expression.args.this) {\n eliminateSubqueries(expression.args.this);\n return expression;\n }\n\n const root = buildScope(expression);\n\n if (!root) {\n return expression;\n }\n\n const taken: TakenNameMapping = new Map();\n\n // All CTE aliases in the root scope are taken\n for (const scope of root.cteScopes) {\n const parent = scope.expression.parent;\n if (parent) {\n taken.set(parent.alias, scope);\n }\n }\n\n // All table names are taken\n for (const scope of root.traverse()) {\n for (const [\n , source,\n ] of scope.sources) {\n if (source instanceof TableExpr) {\n taken.set(source.name, source);\n }\n }\n }\n\n const existingCtes: ExistingCTEsMapping = new Map();\n\n const withClause = root.expression.args.with;\n let recursive = false;\n\n if (withClause) {\n assertIsInstanceOf(withClause, WithExpr);\n recursive = Boolean(withClause.args.recursive);\n for (const cte of withClause.args.expressions ?? [\n ]) {\n if (isInstanceOf(cte, CteExpr) && cte.args.this) {\n if (cte.args.this) existingCtes.set(cte.args.this.sqlKey, cte.alias);\n }\n }\n }\n\n const newCtes: Expression[] = [\n ];\n\n // We're adding more CTEs, but we want to maintain the DAG order.\n // Derived tables within an existing CTE need to come before the existing CTE.\n for (const cteScope of root.cteScopes) {\n // Append all the new CTEs from this existing CTE\n for (const scope of cteScope.traverse()) {\n if (scope === cteScope) {\n // Don't try to eliminate this CTE itself\n continue;\n }\n const newCte = eliminate(scope, existingCtes, taken);\n if (newCte) {\n newCtes.push(newCte);\n }\n }\n\n // Append the existing CTE itself\n const cteParent = cteScope.expression.parent;\n if (cteParent) {\n newCtes.push(cteParent);\n }\n }\n\n // Now append the rest\n const restScopes = [\n ...root.unionScopes,\n ...root.subqueryScopes,\n ...root.tableScopes,\n ];\n for (const scope of restScopes) {\n for (const childScope of scope.traverse()) {\n const newCte = eliminate(childScope, existingCtes, taken);\n if (newCte) {\n newCtes.push(newCte);\n }\n }\n }\n\n if (0 < newCtes.length) {\n const query = expression instanceof DdlExpr\n ? expression.args.expression\n : expression;\n\n query?.setArgKey('with', new WithExpr({\n expressions: newCtes as CteExpr[],\n recursive,\n }));\n }\n\n return expression;\n}\n\nfunction eliminate (\n scope: Scope,\n existingCtes: ExistingCTEsMapping,\n taken: TakenNameMapping,\n): Expression | undefined {\n if (scope.isDerivedTable) {\n return eliminateDerivedTable(scope, existingCtes, taken);\n }\n\n if (scope.isCte) {\n return eliminateCte(scope, existingCtes, taken);\n }\n\n return undefined;\n}\n\nfunction eliminateDerivedTable (\n scope: Scope,\n existingCtes: ExistingCTEsMapping,\n taken: TakenNameMapping,\n): Expression | undefined {\n // This makes sure that we don't:\n // - drop the \"pivot\" arg from a pivoted subquery\n // - eliminate a lateral correlated subquery\n if (scope.parent && (0 < scope.parent.pivots.length || scope.parent.expression instanceof LateralExpr)) {\n return undefined;\n }\n\n // Get rid of redundant exp.Subquery expressions, i.e. those that are just used as wrappers\n let toReplace = scope.expression.parent;\n if (!toReplace) {\n return undefined;\n }\n\n // Unwrap nested subqueries\n if (toReplace instanceof SubqueryExpr) {\n toReplace = (toReplace as SubqueryExpr).unwrap();\n }\n\n const [\n name,\n cte,\n ] = newCte(scope, existingCtes, taken);\n\n const tableExpr = alias(table(name), toReplace.alias || name, {\n copy: false,\n });\n const toReplaceArgs = toReplace.args as Record<string, unknown>;\n const joins = toReplaceArgs.joins;\n if (joins && Array.isArray(joins)) {\n (tableExpr as TableExpr).setArgKey('joins', joins);\n }\n\n toReplace.replace(tableExpr);\n\n return cte;\n}\n\nfunction eliminateCte (\n scope: Scope,\n existingCtes: ExistingCTEsMapping,\n taken: TakenNameMapping,\n): Expression | undefined {\n const parent = scope.expression.parent;\n if (!parent) {\n return undefined;\n }\n\n const [\n name,\n cte,\n ] = newCte(scope, existingCtes, taken);\n\n const withClause = parent.parent;\n parent.pop();\n\n if (withClause) {\n const withExpressions = withClause.args.expressions;\n if (!withExpressions || withExpressions.length === 0) {\n withClause.pop();\n }\n }\n\n // Rename references to this CTE\n if (scope.parent) {\n for (const childScope of scope.parent.traverse()) {\n for (const [\n , source,\n ] of Object.entries(childScope.selectedSources)) {\n const [\n tableExpr,\n sourceScope,\n ] = source;\n if (sourceScope === scope) {\n const newTable = alias(\n table(name),\n (tableExpr as Expression).aliasOrName,\n {\n copy: false,\n },\n );\n tableExpr.replace(newTable);\n }\n }\n }\n }\n\n return cte;\n}\n\nfunction newCte (\n scope: Scope,\n existingCtes: ExistingCTEsMapping,\n taken: TakenNameMapping,\n): [string, Expression | undefined] {\n /**\n * Returns:\n * tuple of (name, cte)\n * where `name` is a new name for this CTE in the root scope and `cte` is a new CTE instance.\n * If this CTE duplicates an existing CTE, `cte` will be undefined.\n */\n const duplicateCteAlias = existingCtes.get(scope.expression.sqlKey);\n const parent = scope.expression.parent;\n let name = parent?.alias || '';\n\n if (!name) {\n name = findNewName(Array.from(taken.keys()), 'cte');\n }\n\n if (duplicateCteAlias) {\n name = duplicateCteAlias;\n } else if (taken.has(name)) {\n name = findNewName(Array.from(taken.keys()), name);\n }\n\n taken.set(name, scope);\n\n let cte: Expression | undefined;\n if (!duplicateCteAlias) {\n existingCtes.set(scope.expression.sqlKey, name);\n cte = new CteExpr({\n this: scope.expression,\n alias: new TableAliasExpr({\n this: toIdentifier(name),\n }),\n });\n }\n\n return [\n name,\n cte,\n ];\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/merge_subqueries.py\n\nimport {\n isInstanceOf,\n} from '../port_internals';\nimport {\n AggFuncExpr,\n alias as aliasExpr,\n BinaryExpr,\n ColumnExpr,\n columnTableNames,\n EqExpr,\n ExplodeExpr,\n Expression,\n FromExpr,\n FuncExpr,\n GroupExpr,\n HavingExpr,\n JoinExpr,\n JoinExprKind,\n NeqExpr,\n OrderExpr,\n ParenExpr,\n paren as parenExpr,\n QueryTransformExpr,\n SelectExpr,\n SubqueryExpr,\n TableAliasExpr,\n TableExpr,\n toIdentifier,\n UnaryExpr,\n WhereExpr,\n WindowExpr,\n} from '../expressions';\nimport {\n findNewName, seqGet,\n} from '../helper';\nimport {\n Dialect,\n} from '../dialects/dialect';\nimport {\n Scope, traverseScope,\n} from './scope';\n\n/**\n * Rewrite sqlglot AST to merge derived tables into the outer query.\n *\n * This also merges CTEs if they are selected from only once.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { mergeSubqueries } from 'sqlglot/optimizer';\n *\n * const expression = parseOne(\"SELECT a FROM (SELECT x.a FROM x) CROSS JOIN y\");\n * mergeSubqueries(expression).sql();\n * // 'SELECT x.a FROM x CROSS JOIN y'\n * ```\n *\n * If `leaveTablesIsolated` is True, this will not merge inner queries into outer\n * queries if it would result in multiple table selects in a single query.\n *\n * Inspired by https://dev.mysql.com/doc/refman/8.0/en/derived-table-optimization.html\n *\n * @param expression - Expression to optimize\n * @param options - Optimization options\n * @param options.leaveTablesIsolated - Don't merge if it creates multiple table selects (default: false)\n * @returns The optimized expression\n */\nexport function mergeSubqueries<E extends Expression> (\n expression: E,\n options: {\n leaveTablesIsolated?: boolean;\n } = {},\n): E {\n const {\n leaveTablesIsolated = false,\n } = options;\n\n expression = mergeCtes(expression, {\n leaveTablesIsolated,\n }) as E;\n expression = mergeDerivedTables(expression, {\n leaveTablesIsolated,\n }) as E;\n\n return expression;\n}\n\nconst SAFE_TO_REPLACE_UNWRAPPED = [\n ColumnExpr,\n EqExpr,\n FuncExpr,\n NeqExpr,\n ParenExpr,\n] as const;\n\ntype FromOrJoin = FromExpr | JoinExpr;\n\nfunction mergeCtes<E extends Expression> (\n expression: E,\n options: {leaveTablesIsolated: boolean},\n): E {\n const {\n leaveTablesIsolated,\n } = options;\n const scopes = Array.from(traverseScope(expression));\n\n // All places where we select from CTEs\n // Key on CTE scope ID to detect CTEs selected from multiple times\n const cteSelections = new Map<Scope, [Scope, Scope, Expression][]>();\n\n for (const outerScope of scopes) {\n for (const [\n , sourceEntry,\n ] of Object.entries(outerScope.selectedSources)) {\n const [\n table,\n innerSource,\n ] = sourceEntry;\n if (innerSource instanceof Scope && innerSource.isCte) {\n let scopeList = cteSelections.get(innerSource);\n if (!scopeList) {\n scopeList = [\n ];\n cteSelections.set(innerSource, scopeList);\n }\n scopeList.push([\n outerScope,\n innerSource,\n table,\n ]);\n }\n }\n }\n\n // Only merge CTEs that are selected from exactly once\n const singularCteSelections: [Scope, Scope, Expression][] = [\n ];\n for (const [\n , selections,\n ] of cteSelections) {\n if (selections.length === 1) {\n singularCteSelections.push(selections[0]);\n }\n }\n\n for (const [\n outerScope,\n innerScope,\n table,\n ] of singularCteSelections) {\n // Find FromExpr or JoinExpr ancestor\n const fromOrJoin = table.findAncestor<FromExpr | JoinExpr>(FromExpr, JoinExpr);\n if (fromOrJoin && mergeable(outerScope, innerScope, {\n leaveTablesIsolated,\n }, fromOrJoin)) {\n const alias = table.aliasOrName;\n renameInnerSources(outerScope, innerScope, alias);\n mergeFrom(outerScope, innerScope, table as SubqueryExpr | TableExpr, alias);\n mergeExpressions(outerScope, innerScope, alias);\n mergeOrder(outerScope, innerScope);\n mergeJoins(outerScope, innerScope, fromOrJoin);\n mergeWhere(outerScope, innerScope, fromOrJoin);\n mergeHints(outerScope, innerScope);\n popCte(innerScope);\n outerScope.clearCache();\n }\n }\n\n return expression;\n}\n\nfunction mergeDerivedTables<E extends Expression> (\n expression: E,\n options: {leaveTablesIsolated: boolean},\n): E {\n const {\n leaveTablesIsolated,\n } = options;\n for (const outerScope of traverseScope(expression)) {\n for (const subquery of outerScope.derivedTables) {\n // Find FromExpr or JoinExpr ancestor\n const fromOrJoin = subquery.findAncestor<FromExpr | JoinExpr>(FromExpr, JoinExpr);\n\n const alias = subquery.aliasOrName;\n const innerScope = outerScope.sources.get(alias);\n\n if (\n innerScope instanceof Scope\n && fromOrJoin\n && mergeable(outerScope, innerScope, {\n leaveTablesIsolated,\n }, fromOrJoin)\n ) {\n renameInnerSources(outerScope, innerScope, alias);\n mergeFrom(outerScope, innerScope, subquery, alias);\n mergeExpressions(outerScope, innerScope, alias);\n mergeOrder(outerScope, innerScope);\n mergeJoins(outerScope, innerScope, fromOrJoin);\n mergeWhere(outerScope, innerScope, fromOrJoin);\n mergeHints(outerScope, innerScope);\n outerScope.clearCache();\n }\n }\n }\n\n return expression;\n}\n\nfunction mergeable (\n outerScope: Scope,\n innerScope: Scope,\n options: {leaveTablesIsolated: boolean},\n fromOrJoin: FromOrJoin,\n): boolean {\n const {\n leaveTablesIsolated,\n } = options;\n const innerSelect = innerScope.expression.unnest();\n\n // Check if window expressions are in unmergable operations\n function isWindowExpressionInUnmergableOperation (): boolean {\n const windowAliases = new Set<string>();\n if (!(innerSelect instanceof SelectExpr)) {\n return false;\n }\n const innerSelectExpr = innerSelect;\n\n for (const s of innerSelectExpr.selects) {\n if (!(s instanceof Expression)) {\n continue;\n }\n if (s.find(WindowExpr)) {\n windowAliases.add(s.aliasOrName);\n }\n }\n\n const innerSelectName = fromOrJoin.aliasOrName;\n const unmergableWindowColumns: ColumnExpr[] = [\n ];\n\n for (const column of outerScope.columns) {\n // Check if column has unmergable ancestor\n const hasUnmergableAncestor = column.findAncestor(\n WhereExpr,\n GroupExpr,\n OrderExpr,\n JoinExpr,\n HavingExpr,\n AggFuncExpr,\n ) !== undefined;\n\n if (hasUnmergableAncestor) {\n unmergableWindowColumns.push(column);\n }\n }\n\n const windowExpressionsInUnmergable = unmergableWindowColumns.filter(\n (column) => column.table === innerSelectName && windowAliases.has(column.name),\n );\n\n return 0 < windowExpressionsInUnmergable.length;\n }\n\n // Check if outer select joins on inner select's join\n function outerSelectJoinsOnInnerSelectJoin (): boolean {\n if (!(fromOrJoin instanceof JoinExpr)) {\n return false;\n }\n\n const alias = fromOrJoin.aliasOrName;\n const on = fromOrJoin.args.on;\n\n if (!on) {\n return false;\n }\n\n const selections = Array.from(on.findAll(ColumnExpr))\n .filter((c) => c.table === alias)\n .map((c) => c.name);\n\n const innerFrom = innerScope.expression.getArgKey('from') as FromExpr | undefined;\n\n if (!innerFrom) {\n return false;\n }\n\n const innerFromTable = innerFrom.aliasOrName;\n\n if (!(innerScope.expression instanceof SelectExpr)) {\n return false;\n }\n\n const innerSelectExpr = innerScope.expression;\n const innerProjections = new Map<string, Expression>();\n\n for (const s of innerSelectExpr.selects) {\n if (!(s instanceof Expression)) {\n continue;\n }\n innerProjections.set(s.aliasOrName, s);\n }\n\n return selections.some((selection) => {\n const projection = innerProjections.get(selection);\n if (!projection) {\n return false;\n }\n const columns = Array.from(projection.findAll(ColumnExpr));\n return columns.some((col) => col.table !== innerFromTable);\n });\n }\n\n // Check if this is a recursive CTE\n function isRecursive (): boolean {\n const cte = innerScope.expression.parent;\n let node: Expression | undefined = outerScope.expression.parent;\n\n while (node) {\n if (node === cte) {\n return true;\n }\n node = node.parent;\n }\n return false;\n }\n\n // Main mergeability checks\n if (!(outerScope.expression instanceof SelectExpr)) {\n return false;\n }\n\n const outerSelectExpr = outerScope.expression;\n\n if (outerSelectExpr.isStar) {\n return false;\n }\n\n if (!(innerSelect instanceof SelectExpr)) {\n return false;\n }\n\n const innerSelectExpr = innerSelect;\n\n // Check for unmergable args\n for (const arg of Dialect.UNMERGABLE_ARGS) {\n if (innerSelectExpr.getArgKey(arg)) {\n return false;\n }\n }\n\n if (!innerSelectExpr.args.from) {\n return false;\n }\n\n if (0 < outerScope.pivots.length) {\n return false;\n }\n\n // Check for AggFunc, Select, or Explode in inner expressions\n for (const e of innerSelectExpr.args.expressions ?? [\n ]) {\n if (!(e instanceof Expression)) {\n continue;\n }\n if (e.find(AggFuncExpr) || e.find(SelectExpr) || e.find(ExplodeExpr)) {\n return false;\n }\n }\n\n if (leaveTablesIsolated && 1 < Object.keys(outerScope.selectedSources).length) {\n return false;\n }\n\n if (fromOrJoin instanceof JoinExpr && innerSelectExpr.args.joins && 0 < innerSelectExpr.args.joins.length) {\n return false;\n }\n\n const joinSide = fromOrJoin instanceof JoinExpr ? fromOrJoin.args.side : undefined;\n\n if (\n fromOrJoin instanceof JoinExpr\n && innerSelectExpr.args.where\n && (joinSide === JoinExprKind.FULL || joinSide === JoinExprKind.LEFT || joinSide === JoinExprKind.RIGHT)\n ) {\n return false;\n }\n\n const outerJoins = outerSelectExpr.args.joins;\n\n if (\n fromOrJoin instanceof FromExpr\n && innerSelectExpr.args.where\n && outerJoins\n && outerJoins.some((j) => isInstanceOf(j, JoinExpr) && (j.args.side === JoinExprKind.FULL || j.args.side === JoinExprKind.RIGHT))\n ) {\n return false;\n }\n\n if (outerSelectJoinsOnInnerSelectJoin()) {\n return false;\n }\n\n if (isWindowExpressionInUnmergableOperation()) {\n return false;\n }\n\n if (isRecursive()) {\n return false;\n }\n\n if (innerSelectExpr.args.order && outerScope.isUnion) {\n return false;\n }\n\n const firstExpr = seqGet(innerSelectExpr.args.expressions ?? [\n ], 0);\n if (firstExpr instanceof QueryTransformExpr) {\n return false;\n }\n\n return true;\n}\n\nfunction renameInnerSources (outerScope: Scope, innerScope: Scope, alias: string): void {\n const innerTaken = new Set(Object.keys(innerScope.selectedSources));\n const outerTaken = new Set(Object.keys(outerScope.selectedSources));\n const conflicts = new Set(Array.from(innerTaken).filter((x) => outerTaken.has(x)));\n conflicts.delete(alias);\n\n const taken = new Set([\n ...outerTaken,\n ...innerTaken,\n ]);\n\n for (const conflict of conflicts) {\n const newName = findNewName(Array.from(taken), conflict);\n\n const sourceEntry = innerScope.selectedSources[conflict];\n if (!sourceEntry) {\n continue;\n }\n\n const [\n source,\n ] = sourceEntry;\n const newAlias = toIdentifier(newName);\n\n if (source instanceof TableExpr) {\n if (source.alias) {\n source.setArgKey('alias', newAlias);\n } else {\n source.replace(aliasExpr(source, newAlias, {\n copy: false,\n }));\n }\n } else if (source?.parent instanceof SubqueryExpr) {\n source.parent.setArgKey('alias', new TableAliasExpr({\n this: newAlias,\n }));\n }\n\n for (const column of innerScope.sourceColumns(conflict)) {\n column.setArgKey('table', toIdentifier(newName));\n }\n\n innerScope.renameSource(conflict, newName);\n taken.add(newName);\n }\n}\n\nfunction mergeFrom (\n outerScope: Scope,\n innerScope: Scope,\n nodeToReplace: SubqueryExpr | TableExpr,\n alias: string,\n): void {\n const from = innerScope.expression.getArgKey('from') as FromExpr;\n const newSubquery = from.args.this as Expression;\n\n newSubquery.setArgKey('joins', nodeToReplace.args.joins);\n nodeToReplace.replace(newSubquery);\n\n // Update join hints\n for (const joinHint of outerScope.joinHints) {\n const tables = Array.from(joinHint.findAll(TableExpr));\n for (const table of tables) {\n if (table.aliasOrName === nodeToReplace.aliasOrName) {\n table.setArgKey('this', toIdentifier(newSubquery.aliasOrName));\n }\n }\n }\n\n outerScope.removeSource(alias);\n const newSubquerySource = innerScope.sources.get(newSubquery.aliasOrName);\n if (newSubquerySource !== undefined) {\n outerScope.addSource(newSubquery.aliasOrName, newSubquerySource);\n }\n}\n\nfunction mergeJoins (outerScope: Scope, innerScope: Scope, fromOrJoin: FromOrJoin): void {\n const newJoins: JoinExpr[] = [\n ];\n\n const joins = innerScope.expression.getArgKey('joins') as JoinExpr[] | undefined;\n\n if (joins) {\n for (const join of joins) {\n newJoins.push(join);\n const joinSource = innerScope.sources.get(join.aliasOrName);\n if (joinSource) {\n outerScope.addSource(join.aliasOrName, joinSource);\n }\n }\n }\n\n if (0 < newJoins.length) {\n const outerJoins = (outerScope.expression.getArgKey('joins') as JoinExpr[] | undefined) || [\n ];\n\n // Maintain join order\n let position: number;\n if (fromOrJoin instanceof FromExpr) {\n position = 0;\n } else {\n position = outerJoins.indexOf(fromOrJoin) + 1;\n }\n\n outerJoins.splice(position, 0, ...newJoins);\n (outerScope.expression as SelectExpr).setArgKey('joins', outerJoins);\n }\n}\n\nfunction mergeExpressions (outerScope: Scope, innerScope: Scope, alias: string): void {\n // Collect all columns that reference the alias of the inner query\n const outerColumns = new Map<string, ColumnExpr[]>();\n\n for (const column of outerScope.columns) {\n if (column.table === alias) {\n const name = column.name;\n let columnList = outerColumns.get(name);\n if (!columnList) {\n columnList = [\n ];\n outerColumns.set(name, columnList);\n }\n columnList.push(column);\n }\n }\n\n // Replace columns with the projection expression in the inner query\n if (!(innerScope.expression instanceof SelectExpr)) {\n return;\n }\n\n const innerSelectExpr = innerScope.expression;\n\n for (const expr of innerSelectExpr.args.expressions ?? [\n ]) {\n if (!(expr instanceof Expression)) {\n continue;\n }\n\n const projectionName = expr.aliasOrName;\n\n if (!projectionName) {\n continue;\n }\n\n const columnsToReplace = outerColumns.get(projectionName) || [\n ];\n\n const unaliasedExpr = expr.unalias();\n const mustWrapExpression = !SAFE_TO_REPLACE_UNWRAPPED.some((cls) => unaliasedExpr instanceof cls);\n const isNumber = unaliasedExpr.isNumber;\n\n for (const column of columnsToReplace) {\n const parent = column.parent;\n\n // Don't merge literal numbers in GROUP BY (positional context)\n if (isNumber && parent instanceof GroupExpr) {\n column.replace(toIdentifier(column.name));\n continue;\n }\n\n let replacementExpr = unaliasedExpr;\n\n // Wrap in parens if needed to preserve precedence\n if (\n parent\n && (parent instanceof UnaryExpr || parent instanceof BinaryExpr)\n && mustWrapExpression\n ) {\n replacementExpr = parenExpr(replacementExpr, {\n copy: false,\n });\n }\n\n // Make sure we don't change the column name\n if (parent instanceof SelectExpr && column.name !== replacementExpr.name) {\n replacementExpr = aliasExpr(replacementExpr, column.name, {\n copy: false,\n });\n }\n\n column.replace(replacementExpr.copy());\n }\n }\n}\n\nfunction mergeWhere (outerScope: Scope, innerScope: Scope, fromOrJoin: FromOrJoin): void {\n const where = innerScope.expression.getArgKey('where') as WhereExpr | undefined;\n\n if (!where) {\n return;\n }\n\n const whereThis = where.args.this;\n if (!(whereThis instanceof Expression)) {\n return;\n }\n\n const outerExpression = outerScope.expression as SelectExpr;\n\n if (fromOrJoin instanceof JoinExpr) {\n // Merge predicates from outer join to ON clause if columns are already joined\n const from = outerExpression.args.from;\n const sources = new Set<string>();\n\n if (from) {\n sources.add(from.aliasOrName);\n }\n\n const joins = outerExpression.args.joins;\n if (joins) {\n for (const join of joins) {\n const source = join.aliasOrName;\n sources.add(source);\n if (source === fromOrJoin.aliasOrName) {\n break;\n }\n }\n }\n\n const whereTables = columnTableNames(whereThis);\n const allTablesInSources = Array.from(whereTables).every((t) => sources.has(t));\n\n if (allTablesInSources) {\n fromOrJoin.on(whereThis, {\n copy: false,\n });\n return;\n }\n }\n\n outerExpression.where(whereThis, {\n copy: false,\n });\n}\n\nfunction mergeOrder (outerScope: Scope, innerScope: Scope): void {\n const outerSelectExpr = outerScope.expression as SelectExpr;\n\n if (\n outerSelectExpr.args.group\n || outerSelectExpr.args.distinct\n || outerSelectExpr.args.having\n || outerSelectExpr.args.order\n || Object.keys(outerScope.selectedSources).length !== 1\n ) {\n return;\n }\n\n const hasAgg = outerSelectExpr.args.expressions?.some((expr) => {\n if (!(expr instanceof Expression)) {\n return false;\n }\n return expr.find(AggFuncExpr) !== undefined;\n });\n\n if (hasAgg) {\n return;\n }\n\n outerSelectExpr.setArgKey('order', innerScope.expression.getArgKey('order'));\n}\n\nfunction mergeHints (outerScope: Scope, innerScope: Scope): void {\n const innerScopeHint = innerScope.expression.getArgKey('hint') as Expression | undefined;\n\n if (!innerScopeHint) {\n return;\n }\n\n const outerSelectExpr = outerScope.expression as SelectExpr;\n const outerScopeHint = outerSelectExpr.args.hint;\n\n if (outerScopeHint) {\n const innerHintExpressions = innerScopeHint.args.expressions;\n for (const hintExpression of innerHintExpressions ?? [\n ]) {\n if (hintExpression instanceof Expression) {\n outerScopeHint.append('expressions', hintExpression);\n }\n }\n } else {\n outerSelectExpr.setArgKey('hint', innerScopeHint);\n }\n}\n\nfunction popCte (innerScope: Scope): void {\n const cte = innerScope.expression.parent;\n if (!cte) {\n return;\n }\n\n const with_ = cte.parent;\n if (!with_) {\n return;\n }\n\n const withExpressions = with_.args.expressions;\n if (withExpressions?.length === 1) {\n with_.pop();\n } else {\n cte.pop();\n }\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/pushdown_predicates.py\n\nimport {\n AggFuncExpr,\n AliasExpr,\n Expression,\n AndExpr,\n ColumnExpr,\n FromExpr,\n JoinExpr,\n JoinExprKind,\n or as orExpr,\n OrExpr,\n SelectExpr,\n TableExpr,\n true_ as trueExpr,\n UnnestExpr,\n WhereExpr,\n WindowExpr,\n columnTableNames,\n WithExpr,\n} from '../expressions';\nimport {\n Dialect, type DialectType,\n} from '../dialects/dialect';\nimport {\n narrowInstanceOf,\n} from '../port_internals';\nimport {\n normalized,\n} from './normalize';\nimport {\n buildScope, findInScope, Scope,\n} from './scope';\nimport {\n simplify,\n} from './simplify';\n\n/**\n * Rewrite sqlglot AST to pushdown predicates in FROMs and JOINs.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { pushdownPredicates } from 'sqlglot/optimizer';\n *\n * const sql = \"SELECT y.a AS a FROM (SELECT x.a AS a FROM x AS x) AS y WHERE y.a = 1\";\n * const expression = parseOne(sql);\n * pushdownPredicates(expression).sql();\n * // 'SELECT y.a AS a FROM (SELECT x.a AS a FROM x AS x WHERE x.a = 1) AS y WHERE TRUE'\n * ```\n *\n * @param expression - Expression to optimize\n * @param options - Optimization options\n * @param options.dialect - SQL dialect\n * @returns The optimized expression\n */\nexport function pushdownPredicates<E extends Expression> (\n expression: E,\n options: {\n dialect?: DialectType;\n } = {},\n): E {\n const {\n dialect: dialectArg,\n } = options;\n const root = buildScope(expression);\n\n const dialect = Dialect.getOrRaise(dialectArg);\n\n const unnestRequiresCrossJoin = (dialect.constructor as typeof Dialect).UNNEST_REQUIRES_CROSS_JOIN;\n\n if (root) {\n const scopeRefCount = root.refCount();\n\n for (const scope of Array.from(root.traverse()).reverse()) {\n const select = scope.expression;\n const whereClause = select.getArgKey('where') as WhereExpr | undefined;\n\n if (whereClause) {\n let selectedSources = scope.selectedSources;\n const joins = select.getArgKey('joins') as JoinExpr[] | undefined;\n const joinIndex = new Map<string, number>();\n\n if (joins) {\n joins.forEach((join, i) => {\n const name = join.aliasOrName;\n if (name) {\n joinIndex.set(name, i);\n }\n });\n }\n\n // A right join can only push down to itself and not the source FROM table\n // Presto, Trino and Athena don't support inner joins where the RHS is an UNNEST expression\n let pushdownAllowed = true;\n for (const [\n k,\n source,\n ] of Object.entries(selectedSources)) {\n const [\n node,\n ] = source;\n if (!node) continue;\n\n const parent = node.findAncestor<JoinExpr | FromExpr>(JoinExpr, FromExpr);\n\n if (parent instanceof JoinExpr) {\n const joinParent = parent as JoinExpr;\n if (joinParent.args.side === JoinExprKind.RIGHT) {\n selectedSources = {\n [k]: source,\n };\n break;\n }\n if (node instanceof UnnestExpr && unnestRequiresCrossJoin) {\n pushdownAllowed = false;\n break;\n }\n }\n }\n\n if (pushdownAllowed) {\n const whereThis = whereClause.args.this;\n if (whereThis instanceof Expression) {\n pushdown(whereThis, selectedSources, scopeRefCount, dialect, joinIndex);\n }\n }\n }\n\n // Joins should only pushdown into itself, not to other joins\n // So we limit the selected sources to only itself\n const joins = select.getArgKey('joins') as JoinExpr[] | undefined;\n if (joins) {\n for (const join of joins) {\n const name = join.aliasOrName;\n if (name && name in scope.selectedSources) {\n const onClause = join.args.on;\n pushdown(\n onClause,\n {\n [name]: scope.selectedSources[name],\n },\n scopeRefCount,\n dialect,\n );\n }\n }\n }\n }\n }\n\n return expression;\n}\n\nfunction pushdown (\n condition: Expression | undefined,\n sources: Record<string, [Expression, Scope | Expression]>,\n scopeRefCount: Map<Scope | Expression, number>,\n dialect: Dialect,\n joinIndex?: Map<string, number>,\n): void {\n if (!condition) {\n return;\n }\n\n const simplified = simplify(condition, {\n dialect,\n });\n condition = condition.replace(simplified);\n const cnfLike = normalized(condition) || !normalized(condition, {\n dnf: true,\n });\n\n const predicates = (cnfLike ? condition instanceof AndExpr : condition instanceof OrExpr)\n ? Array.from(condition.flatten())\n : [\n condition,\n ];\n\n if (cnfLike) {\n pushdownCnf(predicates, sources, scopeRefCount, joinIndex);\n } else {\n pushdownDnf(predicates, sources, scopeRefCount);\n }\n}\n\nfunction pushdownCnf (\n predicates: Iterable<Expression>,\n sources: Record<string, [Expression, Scope | Expression]>,\n scopeRefCount: Map<Scope | Expression, number>,\n joinIndex?: Map<string, number>,\n): void {\n /**\n * If the predicates are in CNF like form, we can simply replace each block in the parent.\n */\n const joinIndexMap = joinIndex || new Map();\n\n for (const predicate of predicates) {\n const nodes = nodesForPredicate(predicate, sources, scopeRefCount);\n\n for (const [\n name,\n node,\n ] of Object.entries(nodes)) {\n if (node instanceof JoinExpr) {\n const predicateTables = columnTableNames(predicate, {\n exclude: name,\n });\n\n // Don't push the predicate if it references tables that appear in later joins\n const thisIndex = joinIndexMap.get(name) ?? -1;\n const canPush = Array.from(predicateTables).every((table) => {\n const tableIndex = joinIndexMap.get(table) ?? -1;\n return tableIndex < thisIndex;\n });\n\n if (canPush) {\n predicate.replace(trueExpr());\n node.on(predicate, {\n copy: false,\n });\n break;\n }\n } else if (node instanceof SelectExpr) {\n predicate.replace(trueExpr());\n const innerPredicate = replaceAliases(node, predicate);\n\n if (findInScope(innerPredicate, AggFuncExpr)) {\n // Add to HAVING clause\n node.having(innerPredicate, {\n copy: false,\n });\n } else {\n node.where(innerPredicate, {\n copy: false,\n });\n }\n }\n }\n }\n}\n\nfunction pushdownDnf (\n predicates: Iterable<Expression>,\n sources: Record<string, [Expression, Scope | Expression]>,\n scopeRefCount: Map<Scope | Expression, number>,\n): void {\n /**\n * If the predicates are in DNF form, we can only push down conditions that are in all blocks.\n * Additionally, we can't remove predicates from their original form.\n */\n // Find all the tables that can be pushed down to\n // These are tables that are referenced in all blocks of a DNF\n const pushdownTables = new Set<string>();\n\n for (const a of predicates) {\n let aTables = columnTableNames(a);\n\n for (const b of predicates) {\n const bTables = columnTableNames(b);\n aTables = new Set(Array.from(aTables).filter((t) => bTables.has(t)));\n }\n\n for (const table of aTables) {\n pushdownTables.add(table);\n }\n }\n\n const conditions = new Map<string, Expression>();\n\n let nodes = {};\n\n // Pushdown all predicates to their respective nodes\n for (const table of Array.from(pushdownTables).sort()) {\n for (const predicate of predicates) {\n nodes = nodesForPredicate(predicate, sources, scopeRefCount);\n\n if (!(table in nodes)) {\n continue;\n }\n\n const existing = conditions.get(table);\n conditions.set(table, existing\n ? orExpr([\n existing,\n predicate,\n ])\n : predicate);\n }\n\n for (const [\n name,\n node,\n ] of Object.entries(nodes)) {\n const condition = conditions.get(name);\n if (!condition) {\n continue;\n }\n\n if (node instanceof JoinExpr) {\n node.on(condition, {\n copy: false,\n });\n } else if (node instanceof SelectExpr) {\n const innerPredicate = replaceAliases(node, condition);\n\n if (findInScope(innerPredicate, AggFuncExpr)) {\n // Add to HAVING clause\n node.having(innerPredicate, {\n copy: false,\n });\n } else {\n node.where(innerPredicate, {\n copy: false,\n });\n }\n }\n }\n }\n}\n\nfunction nodesForPredicate (\n predicate: Expression,\n sources: Record<string, [Expression, Scope | Expression]>,\n scopeRefCount: Map<Expression | Scope, number>,\n): Record<string, Expression> {\n const nodes: Record<string, Expression> = {};\n const tables = columnTableNames(predicate);\n const whereCondition = predicate.findAncestor<JoinExpr | WhereExpr>(JoinExpr, WhereExpr) instanceof WhereExpr;\n\n for (const table of Array.from(tables).sort()) {\n const sourceEntry = sources[table];\n if (!sourceEntry) {\n continue;\n }\n\n let node = sourceEntry[0] as Expression | undefined;\n const [\n , source,\n ] = sourceEntry;\n\n // If the predicate is in a where statement we can try to push it down\n // We want to find the root join or from statement\n if (node && whereCondition) {\n node = node.findAncestor<JoinExpr | FromExpr>(JoinExpr, FromExpr);\n }\n\n // A node can reference a CTE which should be pushed down\n if (node instanceof FromExpr && !(source instanceof TableExpr)) {\n const with_ = narrowInstanceOf((source instanceof Scope ? source.parent : (source as Expression).parent?.args)?.expression, Expression)?.getArgKey('with');\n if (with_ instanceof WithExpr && with_?.recursive) {\n return {};\n }\n node = source instanceof Scope ? source.expression : (source as Expression).args.expression as Expression | undefined;\n }\n\n if (node instanceof JoinExpr) {\n const side = node.side;\n if (side && side !== JoinExprKind.RIGHT) {\n return {};\n }\n nodes[table] = node;\n } else if (node instanceof SelectExpr && tables.size === 1) {\n // We can't push down window expressions\n const hasWindowExpression = node.selects.some((sel) => {\n if (!(sel instanceof Expression)) {\n return false;\n }\n return sel.find(WindowExpr) !== undefined;\n });\n\n const hasGroup = Boolean(node.args.group);\n\n // We can't push down predicates to select statements if they are referenced multiple times\n const refCount = scopeRefCount.get(source) || 0;\n\n if (!hasGroup && refCount < 2 && !hasWindowExpression) {\n nodes[table] = node;\n }\n }\n }\n\n return nodes;\n}\n\nfunction replaceAliases (source: SelectExpr, predicate: Expression): Expression {\n const aliases = new Map<string, Expression>();\n\n for (const select of source.selects) {\n if (!(select instanceof Expression)) {\n continue;\n }\n\n if (select instanceof AliasExpr) {\n const aliasThis = select.args.this;\n if (aliasThis instanceof Expression) {\n aliases.set(select.alias, aliasThis);\n }\n } else {\n aliases.set(select.name, select);\n }\n }\n\n function replaceAlias (column: Expression): Expression {\n if (column instanceof ColumnExpr) {\n const replacement = aliases.get(column.name);\n if (replacement) {\n return replacement.copy();\n }\n }\n return column;\n }\n\n return predicate.transform(replaceAlias);\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/resolver.py\n\nimport type {\n DataTypeExpr,\n} from '../expressions';\nimport {\n Expression,\n IdentifierExpr,\n JoinExprKind,\n SetOperationExprKind,\n ColumnExpr,\n DataTypeExprKind,\n JoinExpr,\n QueryExpr,\n SelectExpr,\n SetOperationExpr,\n SubqueryExpr,\n TableAliasExpr,\n TableExpr,\n toIdentifier,\n UnnestExpr,\n ValuesExpr,\n QueryTransformExpr,\n isType,\n} from '../expressions';\nimport {\n Dialect,\n} from '../dialects/dialect';\nimport {\n seqGet, SingleValuedMapping,\n} from '../helper';\nimport type {\n Schema,\n} from '../schema';\nimport {\n MapBinaryTuple,\n} from '../port_internals/binary_tuple_map';\nimport {\n isInstanceOf,\n} from '../port_internals';\nimport {\n OptimizeError,\n} from '../errors';\nimport {\n Scope,\n} from './scope';\n\n/**\n * Helper class for resolving columns to their source tables.\n *\n * This class provides methods to determine which table a column belongs to,\n * handling ambiguous column names, join contexts, and schema inference.\n *\n * Example:\n * ```ts\n * import { buildScope } from 'sqlglot/optimizer';\n * import { Resolver } from 'sqlglot/optimizer';\n *\n * const scope = buildScope(expression);\n * const resolver = new Resolver(scope, schema);\n * const table = resolver.getTable('column_name');\n * ```\n */\nexport class Resolver {\n scope: Scope;\n schema: Schema;\n dialect: Dialect;\n private inferSchema: boolean;\n private sourceColumns?: Map<string, string[]>;\n private unambiguousColumns?: Map<string, string>;\n private allColumnsCache?: Set<string>;\n private getSourceColumnsCache: MapBinaryTuple<[string, boolean], string[]>;\n\n constructor (scope: Scope, schema: Schema, options: {inferSchema?: boolean} = {}) {\n const {\n inferSchema = true,\n } = options;\n this.scope = scope;\n this.schema = schema;\n this.dialect = schema.dialect || new Dialect();\n this.inferSchema = inferSchema;\n this.getSourceColumnsCache = new MapBinaryTuple();\n }\n\n /**\n * Get the table for a column name.\n *\n * @param column - The column expression or column name to find the table for\n * @returns The table identifier if it can be found/inferred\n */\n getTable (column: string | ColumnExpr): Expression | undefined {\n const columnName = typeof column === 'string' ? column : column.name;\n\n let tableName = this.getTableNameFromSources(columnName);\n\n if (!tableName && typeof column !== 'string') {\n const joinContext = this.getColumnJoinContext(column);\n if (joinContext) {\n try {\n const availableSources = this.getAvailableSourceColumns(joinContext);\n tableName = this.getTableNameFromSources(columnName, availableSources);\n } catch (e) {\n if (!(e instanceof OptimizeError)) throw e;\n // Column is still ambiguous, try schema inference below\n }\n }\n }\n\n if (!tableName && this.inferSchema) {\n const allSourceColumns = this.getAllSourceColumns();\n const sourcesWithoutSchema: string[] = [\n ];\n for (const [\n source,\n columns,\n ] of allSourceColumns) {\n if (!columns || columns.length === 0 || columns.includes('*')) {\n sourcesWithoutSchema.push(source);\n }\n }\n if (sourcesWithoutSchema.length === 1) {\n tableName = sourcesWithoutSchema[0];\n }\n }\n\n if (!tableName) {\n return undefined;\n }\n\n const selectedSource = this.scope.selectedSources[tableName];\n if (!selectedSource) {\n return toIdentifier(tableName);\n }\n\n const [\n node,\n ] = selectedSource;\n\n let currentNode: Expression | undefined = node;\n if (currentNode instanceof QueryExpr) {\n while (currentNode && currentNode.alias !== tableName) {\n currentNode = currentNode.parent;\n }\n }\n\n if (currentNode) {\n const nodeAlias = currentNode.getArgKey('alias');\n if (nodeAlias instanceof Expression && (nodeAlias.args.this instanceof IdentifierExpr || typeof nodeAlias.args.this === 'string')) {\n return toIdentifier(nodeAlias.args.this);\n }\n }\n\n return toIdentifier(tableName);\n }\n\n /**\n * All available columns of all sources in this scope\n */\n get allColumns (): Set<string> {\n if (!this.allColumnsCache) {\n this.allColumnsCache = new Set();\n for (const columns of this.getAllSourceColumns().values()) {\n for (const column of columns) {\n this.allColumnsCache.add(column);\n }\n }\n }\n return this.allColumnsCache;\n }\n\n /**\n * Get source columns from a set operation (UNION, INTERSECT, EXCEPT).\n *\n * @param expression - The set operation expression\n * @returns List of column names\n */\n getSourceColumnsFromSetOp (expression: Expression): string[] {\n if (expression instanceof SelectExpr) {\n return (expression as SelectExpr).namedSelects;\n }\n\n if (expression instanceof SubqueryExpr) {\n const subqueryThis = expression.args.this;\n if (subqueryThis instanceof SetOperationExpr) {\n return this.getSourceColumnsFromSetOp(subqueryThis);\n }\n }\n\n if (!(expression instanceof SetOperationExpr)) {\n throw new Error(`Unknown set operation: ${expression}`);\n }\n\n const setOp = expression;\n const onColumnList = setOp.args.on;\n if (onColumnList) {\n return onColumnList.map((col) => col.name);\n }\n\n const side = setOp.args.side;\n const kind = setOp.args.kind;\n\n if (side || kind) {\n const leftExpr = setOp.args.this;\n const rightExpr = setOp.args.expression;\n\n if (!leftExpr || !rightExpr) {\n return [\n ];\n }\n\n const left = this.getSourceColumnsFromSetOp(leftExpr as Expression);\n const right = this.getSourceColumnsFromSetOp(rightExpr as Expression);\n\n if (side === JoinExprKind.LEFT) {\n return left;\n } else if (side === JoinExprKind.FULL) {\n const combined = [\n ...left,\n ...right,\n ];\n return Array.from(new Set(combined));\n } else if (kind === SetOperationExprKind.INNER) {\n const leftSet = new Set(left);\n const rightSet = new Set(right);\n return Array.from(leftSet).filter((col) => rightSet.has(col));\n }\n }\n\n return expression.namedSelects;\n }\n\n /**\n * Resolve the source columns for a given source name.\n *\n * @param name - The source name\n * @param onlyVisible - Whether to only return visible columns\n * @returns List of column names\n */\n getSourceColumns (name: string, options: {onlyVisible?: boolean} = {}): string[] {\n const {\n onlyVisible = false,\n } = options;\n if (this.getSourceColumnsCache.has(name, onlyVisible)) {\n return this.getSourceColumnsCache.get(name, onlyVisible) ?? [\n ];\n }\n\n const source = this.scope.sources.get(name);\n if (!source) {\n throw new OptimizeError(`Unknown table: ${name}`);\n }\n\n let columns: string[] = [\n ];\n\n if (source instanceof TableExpr) {\n columns = this.schema.columnNames?.(source, {\n onlyVisible,\n }) || [\n ];\n } else if (source instanceof Scope) {\n const sourceExpr = source.expression;\n if (sourceExpr instanceof ValuesExpr || sourceExpr instanceof UnnestExpr) {\n columns = sourceExpr.namedSelects;\n\n if (this.dialect._constructor.UNNEST_COLUMN_ONLY && sourceExpr instanceof UnnestExpr) {\n const unnest = sourceExpr;\n\n if (!unnest.type || isType(unnest.type, DataTypeExprKind.UNKNOWN)) {\n const unnestExpressions = unnest.args.expressions;\n const unnestExpr = seqGet(unnestExpressions ?? [\n ], 0);\n if (unnestExpr instanceof ColumnExpr && this.scope.parent) {\n const colType = this.getUnnestColumnType(unnestExpr);\n if (colType?.isType(DataTypeExprKind.ARRAY)) {\n const elementTypes = colType.args.expressions;\n if (elementTypes && 0 < elementTypes.length) {\n unnest.type = elementTypes[0].copy();\n } else {\n unnest.type = colType.copy();\n }\n }\n }\n }\n\n if (unnest.isType(DataTypeExprKind.STRUCT)) {\n for (const field of (unnest.type instanceof Expression ? unnest.type.args.expressions : undefined) || [\n ]) {\n if (isInstanceOf(field, Expression)) {\n columns.push(field.name);\n }\n }\n }\n }\n } else if (sourceExpr instanceof SetOperationExpr) {\n columns = this.getSourceColumnsFromSetOp(sourceExpr);\n } else {\n const select = seqGet(sourceExpr.args.expressions ?? [\n ], 0);\n if (select instanceof QueryTransformExpr) {\n const schema = select.args.schema;\n columns = schema\n ? schema.args.expressions?.map((c) => {\n if (c instanceof Expression) {\n return c.name;\n }\n return String(c);\n }) ?? [\n ]\n : [\n 'key',\n 'value',\n ];\n } else {\n columns = sourceExpr.namedSelects;\n }\n }\n }\n\n const [\n node,\n ] = this.scope.selectedSources[name] || [\n undefined,\n undefined,\n ];\n\n let columnAliases: string[];\n if (node instanceof Scope) {\n columnAliases = node.expression.aliasColumnNames;\n } else if (node instanceof Expression) {\n columnAliases = node.aliasColumnNames;\n } else {\n columnAliases = [\n ];\n }\n\n if (columnAliases.length) {\n const newColumns: string[] = [\n ];\n for (let i = 0; i < Math.max(columns.length, columnAliases.length); i++) {\n const alias = seqGet(columnAliases, i);\n const colName = seqGet(columns, i);\n newColumns.push(alias || colName || '');\n }\n columns = newColumns;\n }\n\n this.getSourceColumnsCache.set(name, onlyVisible, columns);\n return columns;\n }\n\n private getAllSourceColumns (): Map<string, string[]> {\n if (!this.sourceColumns) {\n this.sourceColumns = new Map();\n const allSources = {\n ...this.scope.selectedSources,\n ...Object.fromEntries(this.scope.lateralSources.entries()),\n };\n for (const sourceName of Object.keys(allSources)) {\n this.sourceColumns.set(sourceName, this.getSourceColumns(sourceName));\n }\n }\n return this.sourceColumns;\n }\n\n private getTableNameFromSources (columnName: string, sourceColumns?: Map<string, string[]>): string | undefined {\n let unambiguousColumns: Map<string, string>;\n\n if (!sourceColumns) {\n if (!this.unambiguousColumns) {\n this.unambiguousColumns = this.getUnambiguousColumns(this.getAllSourceColumns());\n }\n unambiguousColumns = this.unambiguousColumns;\n } else {\n unambiguousColumns = this.getUnambiguousColumns(sourceColumns);\n }\n\n return unambiguousColumns.get(columnName);\n }\n\n private getColumnJoinContext (column: ColumnExpr): JoinExpr | undefined {\n const joins = this.scope.expression.args.joins;\n\n if (!joins || this.scope.expression.getArgKey('laterals') || this.scope.expression.getArgKey('pivots')) {\n return undefined;\n }\n\n const joinAncestor = column.findAncestor<JoinExpr | SelectExpr>(JoinExpr, SelectExpr);\n\n if (joinAncestor instanceof JoinExpr && Object.keys(this.scope.selectedSources).includes(joinAncestor.aliasOrName)) {\n return joinAncestor;\n }\n\n return undefined;\n }\n\n private getAvailableSourceColumns (joinAncestor: JoinExpr): Map<string, string[]> {\n const {\n from, joins,\n } = this.scope.expression.args;\n\n if (!from || !joins) {\n return new Map();\n }\n\n const availableSources = new Map<string, string[]>();\n const fromName = from instanceof Expression ? from.aliasOrName : from;\n if (fromName) {\n availableSources.set(fromName, this.getSourceColumns(fromName));\n }\n\n for (const join of joins.slice(0, joins.indexOf(joinAncestor) + 1)) {\n const joinName = join.aliasOrName;\n if (joinName) {\n availableSources.set(joinName, this.getSourceColumns(joinName));\n }\n }\n\n return availableSources;\n }\n\n private getUnambiguousColumns (sourceColumns: Map<string, string[]>): Map<string, string> {\n if (sourceColumns.size === 0) {\n return new Map();\n }\n\n const sourceColumnsPairs = Array.from(sourceColumns.entries());\n const [\n firstTable,\n firstColumns,\n ] = sourceColumnsPairs[0];\n\n if (sourceColumnsPairs.length === 1) {\n return new SingleValuedMapping(firstColumns, firstTable);\n }\n\n const unnestOriginalAliases = new Map<string, string>();\n if (this.dialect._constructor.UNNEST_COLUMN_ONLY) {\n for (const [\n sourceName,\n source,\n ] of this.scope.sources) {\n if (source instanceof Scope && source.expression instanceof UnnestExpr) {\n const aliasArg = source.expression.args.alias;\n if (isInstanceOf(aliasArg, TableAliasExpr) && aliasArg.columns.length) {\n unnestOriginalAliases.set(aliasArg.columns[0].name, sourceName);\n }\n }\n }\n }\n\n const unambiguousColumns = new Map<string, string>();\n for (const col of firstColumns) {\n unambiguousColumns.set(col, firstTable);\n }\n\n const allColumns = new Set(firstColumns);\n\n for (const [\n table,\n columns,\n ] of sourceColumnsPairs.slice(1)) {\n const unique = new Set(columns);\n const ambiguous = new Set([\n ...allColumns,\n ].filter((c) => unique.has(c)));\n for (const col of columns) allColumns.add(col);\n\n for (const column of ambiguous) {\n const unnestAlias = unnestOriginalAliases.get(column);\n if (unnestAlias !== undefined) {\n unambiguousColumns.set(column, unnestAlias);\n continue;\n }\n unambiguousColumns.delete(column);\n }\n\n for (const column of unique) {\n if (!ambiguous.has(column)) {\n unambiguousColumns.set(column, table);\n }\n }\n }\n\n return unambiguousColumns;\n }\n\n private getUnnestColumnType (column: ColumnExpr): DataTypeExpr | undefined {\n const scope = this.scope.parent;\n if (!scope) {\n return undefined;\n }\n\n let tableName: string | undefined;\n if (column.table) {\n tableName = column.table;\n } else {\n const parentResolver = new Resolver(scope, this.schema, {\n inferSchema: this.inferSchema,\n });\n const tableIdentifier = parentResolver.getTable(column);\n if (!tableIdentifier) {\n return undefined;\n }\n tableName = tableIdentifier.name;\n }\n\n const source = scope.sources.get(tableName);\n return source ? this.getColumnTypeFromScope(source, column) : undefined;\n }\n\n private getColumnTypeFromScope (source: Scope | TableExpr, column: ColumnExpr): DataTypeExpr | undefined {\n if (source instanceof TableExpr) {\n const colType = this.schema.getColumnType?.(source, column);\n if (colType) {\n const colTypeThis = typeof colType.args.this === 'string' ? colType.args.this as DataTypeExprKind : DataTypeExprKind.UNKNOWN;\n if (colTypeThis !== DataTypeExprKind.UNKNOWN) {\n return colType;\n }\n }\n } else if (source instanceof Scope) {\n for (const [\n , nestedSource,\n ] of source.sources) {\n const colType = this.getColumnTypeFromScope(nestedSource, column);\n if (colType) {\n const colTypeThis = typeof colType.args.this === 'string' ? colType.args.this as DataTypeExprKind : DataTypeExprKind.UNKNOWN;\n if (colTypeThis !== DataTypeExprKind.UNKNOWN) {\n return colType;\n }\n }\n }\n }\n\n return undefined;\n }\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/qualify_columns.py\n\nimport type {\n CteExpr,\n SetOperationExpr,\n} from '../expressions';\nimport {\n IdentifierExpr,\n AggFuncExpr,\n ColumnDefExpr,\n DataTypeExpr,\n Expression,\n AliasesExpr,\n AliasExpr,\n alias as aliasExpr,\n and as andExpr,\n column as columnExpr,\n ColumnExpr,\n CONSTANTS,\n CoalesceExpr,\n DistinctExpr,\n DotExpr,\n ExplodeExpr,\n GroupExpr,\n HavingExpr,\n InExpr,\n JoinExpr,\n LiteralExpr,\n paren as parenExpr,\n PivotExpr,\n PropertyEqExpr,\n PseudocolumnExpr,\n QueryTransformExpr,\n SelectExpr,\n StarExpr,\n StructExpr,\n SubqueryExpr,\n TableAliasExpr,\n TableColumnExpr,\n toIdentifier,\n UnnestExpr,\n WindowExpr,\n WithExpr,\n ParenExpr,\n DataTypeExprKind,\n alias,\n} from '../expressions';\nimport {\n assertIsInstanceOf, filterInstanceOf, isInstanceOf,\n} from '../port_internals';\nimport {\n Dialect, type DialectType,\n} from '../dialects/dialect';\nimport {\n ensureSchema, type Schema,\n} from '../schema';\nimport {\n highlightSql, OptimizeError,\n} from '../errors';\nimport {\n seqGet,\n} from '../helper';\nimport {\n TypeAnnotator,\n} from './annotate_types';\nimport {\n Resolver,\n} from './resolver';\nimport {\n buildScope, Scope, traverseScope, walkInScope,\n} from './scope';\nimport {\n simplifyParens,\n} from './simplify';\n\n/**\n * Rewrite sqlglot AST to have fully qualified columns.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { qualifyColumns } from 'sqlglot/optimizer';\n *\n * const schema = { tbl: { col: \"INT\" } };\n * const expression = parseOne(\"SELECT col FROM tbl\");\n * qualifyColumns(expression, schema).sql();\n * // 'SELECT tbl.col AS col FROM tbl'\n * ```\n *\n * @param expression - Expression to qualify\n * @param options - Qualification options\n * @param options.schema - Database schema\n * @param options.expandAliasRefs - Whether to expand references to aliases (default: true)\n * @param options.expandStars - Whether to expand star queries (default: true)\n * @param options.inferSchema - Whether to infer the schema if missing\n * @param options.allowPartialQualification - Whether to allow partial qualification (default: false)\n * @param options.dialect - SQL dialect\n * @returns The qualified expression\n *\n * Notes:\n * - Currently only handles a single PIVOT or UNPIVOT operator\n */\nexport function qualifyColumns<E extends Expression> (\n expression: E,\n options: {\n schema?: Record<string, unknown> | Schema;\n expandAliasRefs?: boolean;\n expandStars?: boolean;\n inferSchema?: boolean;\n allowPartialQualification?: boolean;\n dialect?: DialectType;\n } = {},\n): E {\n const {\n schema: schemaArg,\n expandAliasRefs = true,\n expandStars = true,\n inferSchema: inferSchemaArg,\n allowPartialQualification = false,\n dialect: dialectArg,\n } = options;\n\n const schema = ensureSchema(schemaArg, {\n dialect: dialectArg,\n });\n const annotator = new TypeAnnotator({\n schema,\n });\n const inferSchema = inferSchemaArg ?? Boolean(schema.empty);\n const dialect = schema.dialect || new Dialect();\n const dialectClass = dialect._constructor;\n const pseudocolumns = dialectClass.PSEUDOCOLUMNS;\n\n for (const scope of traverseScope(expression)) {\n if (dialectClass.PREFER_CTE_ALIAS_COLUMN) {\n pushdownCteAliasColumns(scope);\n }\n\n const scopeExpression = scope.expression;\n const isSelect = scopeExpression instanceof SelectExpr;\n\n separatePseudocolumns(scope, pseudocolumns);\n\n const resolver = new Resolver(scope, schema, {\n inferSchema,\n });\n popTableColumnAliases(scope.ctes);\n popTableColumnAliases(scope.derivedTables);\n const usingColumnTables = expandUsing(scope, resolver);\n\n if ((schema.empty || dialectClass.FORCE_EARLY_ALIAS_REF_EXPANSION) && expandAliasRefs) {\n expandAliasRefs_(\n scope,\n resolver,\n dialect,\n {\n expandOnlyGroupby: dialectClass.EXPAND_ONLY_GROUP_ALIAS_REF,\n },\n );\n }\n\n convertColumnsToDots(scope, resolver);\n qualifyColumnsInScope(\n scope,\n resolver,\n {\n allowPartialQualification,\n },\n );\n\n if (!schema.empty && expandAliasRefs) {\n expandAliasRefs_(scope, resolver, dialect, {\n expandOnlyGroupby: false,\n });\n }\n\n if (isSelect) {\n if (expandStars) {\n expandStars_(\n scope,\n resolver,\n usingColumnTables,\n pseudocolumns,\n annotator,\n );\n }\n qualifyOutputs(scope);\n }\n\n expandGroupBy(scope, dialect);\n expandOrderByAndDistinctOn(scope, resolver);\n\n if (dialectClass.ANNOTATE_ALL_SCOPES) {\n annotator.annotateScope(scope);\n }\n }\n\n return expression;\n}\n\n/**\n * Raise an error if any columns aren't qualified\n *\n * @param expression - Expression to validate\n * @param sql - Optional SQL string for error highlighting\n * @returns The validated expression\n * @throws OptimizeError if unqualified columns are found\n */\nexport function validateQualifyColumns<E extends Expression> (\n expression: E,\n sql?: string,\n): E {\n const allUnqualifiedColumns: ColumnExpr[] = [\n ];\n\n for (const scope of traverseScope(expression)) {\n if (!(scope.expression instanceof SelectExpr)) {\n continue;\n }\n\n let unqualifiedColumns = scope.unqualifiedColumns;\n\n if (0 < scope.externalColumns.length && !scope.isCorrelatedSubquery && scope.pivots.length === 0) {\n const column = scope.externalColumns[0];\n const forTable = column.table ? ` for table: '${column.table}'` : '';\n const line = (column.args.this as Expression)?.meta?.['line'] as number | undefined;\n const col = (column.args.this as Expression)?.meta?.['col'] as number | undefined;\n\n const start = (column.args.this as Expression)?.meta?.['start'] as number | undefined;\n const end = (column.args.this as Expression)?.meta?.['end'] as number | undefined;\n\n let errorMsg = `Column '${column.name}' could not be resolved${forTable}.`;\n if (line && col) {\n errorMsg += ` Line: ${line}, Col: ${col}`;\n }\n if (sql && start !== undefined && end !== undefined) {\n const {\n formattedSql,\n } = highlightSql({\n sql,\n positions: [\n [\n start,\n end,\n ],\n ],\n });\n errorMsg += `\\n ${formattedSql}`;\n }\n\n throw new OptimizeError(errorMsg);\n }\n\n if (0 < unqualifiedColumns.length && 0 < scope.pivots.length && scope.pivots[0].unpivot) {\n const unpivotColumnSet = new Set(unpivotColumns(scope.pivots[0]));\n unqualifiedColumns = unqualifiedColumns.filter((c) => !unpivotColumnSet.has(c));\n }\n\n allUnqualifiedColumns.push(...unqualifiedColumns);\n }\n\n if (0 < allUnqualifiedColumns.length) {\n const firstColumn = allUnqualifiedColumns[0];\n const firstColumnThis = firstColumn.args.this;\n const line = isInstanceOf(firstColumnThis, Expression) ? firstColumnThis.meta['line'] : undefined;\n const col = isInstanceOf(firstColumnThis, Expression) ? firstColumnThis.meta['col'] : undefined;\n\n const start = isInstanceOf(firstColumnThis, Expression) ? firstColumnThis.meta['start'] as number | undefined : undefined;\n const end = isInstanceOf(firstColumnThis, Expression) ? firstColumnThis.meta['end'] as number | undefined : undefined;\n\n let errorMsg = `Ambiguous column '${firstColumn.name}'`;\n if (line && col) {\n errorMsg += ` (Line: ${line}, Col: ${col})`;\n }\n if (sql && start !== undefined && end !== undefined) {\n const {\n formattedSql,\n } = highlightSql({\n sql,\n positions: [\n [\n start,\n end,\n ],\n ],\n });\n errorMsg += `\\n ${formattedSql}`;\n }\n\n throw new OptimizeError(errorMsg);\n }\n\n return expression;\n}\n\nfunction separatePseudocolumns (scope: Scope, pseudocolumns: Set<string>): void {\n if (pseudocolumns.size === 0) {\n return;\n }\n\n let hasPseudocolumns = false;\n const scopeExpression = scope.expression;\n\n for (const column of scope.columns) {\n const name = column.name.toUpperCase();\n if (!pseudocolumns.has(name)) {\n continue;\n }\n\n if (name !== 'LEVEL' || (\n scopeExpression instanceof SelectExpr\n && (scopeExpression.args as Record<string, unknown>).connect\n )) {\n column.replace(new PseudocolumnExpr({\n ...column.args,\n }));\n hasPseudocolumns = true;\n }\n }\n\n if (hasPseudocolumns) {\n scope.clearCache();\n }\n}\n\nfunction unpivotColumns (unpivot: PivotExpr): ColumnExpr[] {\n const fields = unpivot.args.fields || [\n ];\n const nameColumns = fields\n .filter((field): field is InExpr => field instanceof InExpr && field.args.this instanceof ColumnExpr)\n .map((field) => field.args.this as ColumnExpr);\n\n const valueColumns: ColumnExpr[] = [\n ];\n for (const e of unpivot.args.expressions as Expression[]) {\n for (const col of e.findAll(ColumnExpr)) {\n valueColumns.push(col);\n }\n }\n\n return [\n ...nameColumns,\n ...valueColumns,\n ];\n}\n\nfunction popTableColumnAliases (derivedTables: Iterable<Expression>): void {\n for (const table of derivedTables) {\n if (table.parent instanceof WithExpr && table.parent.args.recursive) {\n continue;\n }\n const tableAlias = table.getArgKey('alias');\n if (tableAlias instanceof TableAliasExpr) {\n tableAlias.setArgKey('columns', undefined);\n }\n }\n}\n\nfunction expandUsing (scope: Scope, resolver: Resolver): Map<string, string[]> {\n const joins = (scope.expression as SelectExpr).args.joins || [\n ];\n if (joins.length === 0) {\n return new Map();\n }\n\n const names = new Set(joins.map((j) => j.aliasOrName));\n const ordered: string[] = Object.keys(scope.selectedSources).filter((k) => !names.has(k));\n\n if (0 < names.size && ordered.length === 0) {\n throw new OptimizeError(`Joins ${[\n ...names,\n ].join(',')} missing source table ${scope.expression}`);\n }\n\n // column name -> first source name that has it\n const columns: Record<string, string> = {};\n\n const updateSourceColumns = (sourceName: string): void => {\n for (const colName of resolver.getSourceColumns(sourceName)) {\n if (!(colName in columns)) {\n columns[colName] = sourceName;\n }\n }\n };\n\n for (const sourceName of ordered) {\n updateSourceColumns(sourceName);\n }\n\n // column name -> ordered map of table names\n const columnTables = new Map<string, string[]>();\n\n for (let i = 0; i < joins.length; i++) {\n const join = joins[i];\n assertIsInstanceOf(join, JoinExpr);\n const sourceTable = ordered[ordered.length - 1];\n if (sourceTable) {\n updateSourceColumns(sourceTable);\n }\n\n const joinTable = join.aliasOrName;\n ordered.push(joinTable);\n\n const using = join.args.using;\n if (!using) continue;\n\n const joinColumns = resolver.getSourceColumns(joinTable);\n\n const conditions: Expression[] = [\n ];\n const usingIdentifierCount = using.length;\n const isSemiOrAntiJoin = join.isSemiOrAntiJoin;\n\n for (const identifierNode of using) {\n const identifier = (identifierNode as Expression).name;\n let table = columns[identifier];\n\n if (!table || !joinColumns.includes(identifier)) {\n if (0 < Object.keys(columns).length && !('*' in columns) && 0 < joinColumns.length) {\n throw new OptimizeError(`Cannot automatically join: ${identifier}`);\n }\n }\n\n table = table || sourceTable;\n\n let lhs: Expression;\n if (i === 0 || usingIdentifierCount === 1) {\n lhs = columnExpr({\n col: identifier,\n table,\n });\n } else {\n const coalesceColumns = ordered.slice(0, -1)\n .filter((t) => resolver.getSourceColumns(t).includes(identifier))\n .map((t) => columnExpr({\n col: identifier,\n table: t,\n }));\n if (1 < coalesceColumns.length) {\n lhs = new CoalesceExpr({\n this: coalesceColumns[0],\n expressions: coalesceColumns.slice(1),\n });\n } else {\n lhs = columnExpr({\n col: identifier,\n table,\n });\n }\n }\n\n conditions.push(lhs.eq(columnExpr({\n col: identifier,\n table: joinTable,\n })));\n\n if (!isSemiOrAntiJoin) {\n let tables_ = columnTables.get(identifier);\n if (!tables_) {\n tables_ = [\n ];\n columnTables.set(identifier, tables_);\n }\n if (!tables_.includes(table)) tables_.push(table);\n if (!tables_.includes(joinTable)) tables_.push(joinTable);\n }\n }\n\n join.setArgKey('using', undefined);\n join.setArgKey('on', andExpr(conditions, {\n copy: false,\n }));\n }\n\n if (0 < columnTables.size) {\n for (const column of scope.columns) {\n const tables_ = !column.table ? columnTables.get(column.name) : undefined;\n if (tables_ !== undefined) {\n const coalesceArgs = tables_.map((t) => columnExpr({\n col: column.name,\n table: t,\n }));\n let replacement: Expression = new CoalesceExpr({\n this: coalesceArgs[0],\n expressions: coalesceArgs.slice(1),\n });\n\n if (column.parent instanceof SelectExpr) {\n replacement = aliasExpr(replacement, column.name, {\n copy: false,\n }) as Expression;\n } else if (column.parent instanceof StructExpr) {\n replacement = new PropertyEqExpr({\n this: toIdentifier(column.name),\n expression: replacement,\n });\n }\n\n scope.replace(column, replacement);\n }\n }\n }\n\n return columnTables;\n}\n\nfunction expandAliasRefs_ (\n scope: Scope,\n resolver: Resolver,\n dialect: Dialect,\n options: {expandOnlyGroupby: boolean},\n): void {\n const {\n expandOnlyGroupby,\n } = options;\n const expression = scope.expression;\n const dialectClass = dialect._constructor;\n\n if (!(expression instanceof SelectExpr) || dialectClass.DISABLES_ALIAS_REF_EXPANSION) {\n return;\n }\n\n const aliasToExpression = new Map<string, [Expression, number]>();\n const projections = new Set(expression.selects.map((s) => (s as Expression).aliasOrName));\n let replaced = false;\n\n const replaceColumns = (\n node: Expression | undefined,\n options: {resolveTable?: boolean;\n literalIndex?: boolean;} = {},\n ): void => {\n const {\n resolveTable = false, literalIndex = false,\n } = options;\n const isGroupBy = node instanceof GroupExpr;\n const isHaving = node instanceof HavingExpr;\n if (!node || (expandOnlyGroupby && !isGroupBy)) {\n return;\n }\n\n for (const column of walkInScope(node, {\n prune: (n) => n.isStar,\n })) {\n if (!(column instanceof ColumnExpr)) continue;\n\n if (expandOnlyGroupby && isGroupBy && column.parent !== node) {\n continue;\n }\n\n let skipReplace = false;\n const table = (resolveTable && !column.table) ? resolver.getTable(column.name) : undefined;\n const aliasEntry = aliasToExpression.get(column.name);\n const aliasExpr_ = aliasEntry ? aliasEntry[0] : undefined;\n const aliasIdx = aliasEntry ? aliasEntry[1] : 1;\n\n if (aliasExpr_) {\n skipReplace = Boolean(\n aliasExpr_.find(AggFuncExpr)\n && column.findAncestor(AggFuncExpr)\n && !(column.findAncestor<WindowExpr | SelectExpr>(WindowExpr, SelectExpr) instanceof WindowExpr),\n );\n\n if (isHaving && dialectClass.PROJECTION_ALIASES_SHADOW_SOURCE_NAMES) {\n skipReplace = skipReplace || Array.from(aliasExpr_.findAll(ColumnExpr)).some(\n (n) => projections.has(n.parts[0]?.name || ''),\n );\n }\n } else if (dialectClass.PROJECTION_ALIASES_SHADOW_SOURCE_NAMES && (isGroupBy || isHaving)) {\n const columnTable = table ? table.name : column.table;\n if (columnTable && projections.has(columnTable)) {\n column.replace(toIdentifier(column.name));\n replaced = true;\n continue;\n }\n }\n\n if (table && (!aliasExpr_ || skipReplace)) {\n column.setArgKey('table', table);\n } else if (!column.table && aliasExpr_ && !skipReplace) {\n if ((aliasExpr_ instanceof LiteralExpr || aliasExpr_.isNumber) && (literalIndex || resolveTable)) {\n if (literalIndex) {\n column.replace(LiteralExpr.number(aliasIdx));\n replaced = true;\n }\n } else {\n replaced = true;\n const parenNode = column.replace(parenExpr(aliasExpr_)) as Expression;\n const simplified = simplifyParens(parenNode, dialect);\n if (simplified !== parenNode) {\n parenNode.replace(simplified);\n }\n }\n }\n }\n };\n\n for (let i = 0; i < expression.selects.length; i++) {\n const projection = expression.selects[i] as Expression;\n replaceColumns(projection);\n if (projection instanceof AliasExpr) {\n aliasToExpression.set(projection.alias, [\n projection.args.this as Expression,\n i + 1,\n ]);\n }\n }\n\n // Handle recursive CTE alias columns\n let parentScope: Scope | undefined = scope;\n let onRightSubTree = false;\n while (parentScope && !parentScope.isCte) {\n if (parentScope.isUnion && parentScope.parent) {\n onRightSubTree = (parentScope.parent.expression as SetOperationExpr).args.expression === parentScope.expression;\n }\n parentScope = parentScope.parent;\n }\n\n if (parentScope && onRightSubTree) {\n const cteExpr = parentScope.expression.parent;\n if (cteExpr) {\n const withNode = cteExpr.findAncestor(WithExpr);\n if (withNode?.args.recursive) {\n const aliasArg = (cteExpr as CteExpr).args.alias;\n const aliasColumns = aliasArg instanceof TableAliasExpr\n ? aliasArg.columns\n : [\n ];\n const columnsSource: Expression[] = 0 < aliasColumns.length\n ? aliasColumns as Expression[]\n : ((cteExpr as CteExpr).args.this as SelectExpr)?.selects || [\n ];\n for (const col of columnsSource) {\n if (col instanceof Expression) {\n aliasToExpression.delete(col.outputName);\n }\n }\n }\n }\n }\n\n replaceColumns(expression.args.where as Expression | undefined);\n replaceColumns(expression.args.group as Expression | undefined, {\n literalIndex: true,\n });\n replaceColumns(expression.args.having as Expression | undefined, {\n resolveTable: true,\n });\n replaceColumns(expression.args.qualify as Expression | undefined, {\n resolveTable: true,\n });\n\n if (dialectClass.SUPPORTS_ALIAS_REFS_IN_JOIN_CONDITIONS) {\n for (const join of expression.args.joins || [\n ]) {\n replaceColumns(join);\n }\n }\n\n if (replaced) {\n scope.clearCache();\n }\n}\n\nfunction convertColumnsToDots (scope: Scope, resolver: Resolver): void {\n let converted = false;\n const allCols: (ColumnExpr | DotExpr)[] = [\n ...scope.columns,\n ...scope.stars,\n ];\n\n for (const column of allCols) {\n if (column instanceof DotExpr) continue;\n\n const columnTable = column.table;\n const dotParts = (column.meta['dotParts'] as unknown[] | undefined) || [\n ];\n delete column.meta['dotParts'];\n\n if (\n columnTable\n && !scope.sources.has(columnTable)\n && (\n !scope.parent\n || !scope.parent.sources.has(columnTable)\n || !scope.isCorrelatedSubquery\n )\n ) {\n const parts = column.parts;\n if (parts.length < 2) continue;\n\n const firstPart = parts[0];\n const remainingParts = parts.slice(1);\n if (!firstPart) continue;\n\n let newRoot: IdentifierExpr;\n let fieldParts: Expression[];\n let newTable: Expression | undefined;\n let wasQualified: boolean;\n\n if (scope.sources.has(firstPart.name)) {\n // Column is already table-qualified: firstPart is the table, remainingParts[0] is column\n if (remainingParts.length === 0) continue;\n newTable = firstPart;\n newRoot = remainingParts[0] as IdentifierExpr;\n fieldParts = remainingParts.slice(1);\n wasQualified = true;\n } else {\n // firstPart is the column name, resolver finds the table\n newTable = resolver.getTable(firstPart.name);\n newRoot = firstPart as IdentifierExpr;\n fieldParts = remainingParts;\n wasQualified = false;\n }\n\n if (newTable) {\n converted = true;\n const newColumn = columnExpr({\n col: newRoot,\n table: newTable as IdentifierExpr,\n });\n if (0 < dotParts.length) {\n newColumn.meta['dotParts'] = dotParts.slice(wasQualified ? 2 : 1);\n }\n if (0 < fieldParts.length) {\n column.replace(DotExpr.build([\n newColumn,\n ...fieldParts,\n ]));\n } else {\n column.replace(newColumn);\n }\n }\n }\n }\n\n if (converted) {\n scope.clearCache();\n }\n}\n\nfunction qualifyColumnsInScope (\n scope: Scope,\n resolver: Resolver,\n options: {allowPartialQualification: boolean},\n): void {\n const {\n allowPartialQualification,\n } = options;\n const dialectClass = resolver.dialect._constructor;\n\n for (const column of scope.columns) {\n const columnTable = column.table;\n const columnName = column.name;\n\n if (columnTable && scope.sources.has(columnTable)) {\n const sourceColumns = resolver.getSourceColumns(columnTable);\n if (\n !allowPartialQualification\n && 0 < sourceColumns.length\n && !sourceColumns.includes(columnName)\n && !sourceColumns.includes('*')\n ) {\n throw new OptimizeError(`Unknown column: ${columnName}`);\n }\n }\n\n if (!columnTable) {\n if (0 < scope.pivots.length && !column.findAncestor(PivotExpr)) {\n column.setArgKey('table', toIdentifier((scope.pivots[0] as PivotExpr).alias));\n continue;\n }\n\n const table = resolver.getTable(column);\n\n if (table) {\n const source = scope.sources.get(table.name);\n if (source instanceof Scope\n && source.columnIndex.has(column)\n ) {\n continue;\n }\n }\n\n if (table) {\n column.setArgKey('table', table);\n } else if (\n dialectClass.TABLES_REFERENCEABLE_AS_COLUMNS\n && column.parts.length === 1\n && columnName in scope.selectedSources\n ) {\n const colThis = column.args.this;\n scope.replace(column, new TableColumnExpr({\n this: isInstanceOf(colThis, Expression) ? colThis : undefined,\n }));\n }\n }\n }\n\n for (const pivot of scope.pivots) {\n if (pivot instanceof PivotExpr) {\n for (const column of pivot.findAll(ColumnExpr)) {\n if (!column.table && resolver.allColumns.has(column.name)) {\n const table = resolver.getTable(column.name);\n if (table) {\n column.setArgKey('table', table);\n }\n }\n }\n }\n }\n}\n\nfunction addExceptColumns (\n expression: Expression,\n tables: Iterable<string>,\n exceptColumns: Map<string, Set<string>>,\n): void {\n const except_ = expression.getArgKey('except') ?? expression.getArgKey('except');\n if (!except_) return;\n const exceptList = Array.isArray(except_)\n ? except_\n : [\n except_,\n ];\n const columns = new Set(\n (exceptList as Expression[])\n .filter((e): e is Expression => e instanceof Expression)\n .map((e) => e.name),\n );\n for (const table of tables) {\n exceptColumns.set(table, columns);\n }\n}\n\nfunction addRenameColumns (\n expression: Expression,\n tables: Iterable<string>,\n renameColumns: Map<string, Record<string, string>>,\n): void {\n const rename = expression.getArgKey('rename') as Expression[] | undefined;\n if (!rename || rename.length === 0) return;\n const columns: Record<string, string> = {};\n for (const e of rename) {\n if (e instanceof Expression) {\n const thisExpr = e.args.this as Expression | undefined;\n if (thisExpr instanceof Expression) {\n columns[thisExpr.name] = (e as Expression).alias;\n }\n }\n }\n for (const table of tables) {\n renameColumns.set(table, columns);\n }\n}\n\nfunction addReplaceColumns (\n expression: Expression,\n tables: Iterable<string>,\n replaceColumns: Map<string, Record<string, AliasExpr>>,\n): void {\n const replace = expression.getArgKey('replace') as Expression[] | undefined;\n if (!replace || replace.length === 0) return;\n const columns: Record<string, AliasExpr> = {};\n for (const e of replace) {\n if (e instanceof AliasExpr) {\n columns[e.alias] = e;\n }\n }\n for (const table of tables) {\n replaceColumns.set(table, columns);\n }\n}\n\nfunction expandStructStarsNoParens (expression: DotExpr): AliasExpr[] {\n const dotColumn = expression.find(ColumnExpr);\n if (!(dotColumn instanceof ColumnExpr) || !dotColumn.isType(DataTypeExprKind.STRUCT)) {\n return [\n ];\n }\n\n // All nested struct values are ColumnDefs, so normalize the first Column in one\n const dotColumnCopy = dotColumn.copy();\n const dotColumnType = dotColumnCopy.type;\n let startingStruct: IdentifierExpr | DotExpr | DataTypeExpr | ColumnDefExpr | undefined = isInstanceOf(dotColumnType, DataTypeExpr) ? dotColumnType : undefined;\n\n // First part is the table name and last part is the star so they can be dropped\n const dotParts = expression.parts.slice(1, -1);\n\n // If we're expanding a nested struct eg. t.c.f1.f2.* find the last struct (f2 in this case)\n outer: for (const part of dotParts.slice(1)) {\n const fieldExprs = startingStruct?.args.expressions || [\n ];\n for (const field of fieldExprs) {\n // Unable to expand star unless all fields are named\n if (!(field.args.this instanceof IdentifierExpr)) {\n return [\n ];\n }\n\n if (!isInstanceOf(field, ColumnDefExpr)) {\n return [\n ];\n }\n\n const fieldKindRaw: unknown = field.args.kind;\n const fieldKind = isInstanceOf(fieldKindRaw, DataTypeExpr) ? fieldKindRaw : undefined;\n\n if (field.name === part.name && fieldKind?.isType(DataTypeExprKind.STRUCT)) {\n startingStruct = fieldKind;\n break outer;\n }\n }\n // There is no matching field in the struct\n return [\n ];\n }\n\n const takenNames = new Set<string>();\n const newSelections: AliasExpr[] = [\n ];\n\n for (const field of (startingStruct?.args.expressions || [\n ])) {\n const name = field.name;\n const fieldThis = field.args.this;\n\n // Ambiguous or anonymous fields can't be expanded\n if (takenNames.has(name) || !(fieldThis instanceof IdentifierExpr)) {\n return [\n ];\n }\n\n takenNames.add(name);\n\n const thisIdent = fieldThis.copy() as IdentifierExpr;\n const allParts = [\n ...dotParts.map((p) => p.copy()),\n thisIdent,\n ];\n const [\n root,\n ...parts\n ] = allParts;\n\n const newColumn = columnExpr(\n {\n col: root as IdentifierExpr,\n table: dotColumnCopy.args.table as IdentifierExpr | undefined,\n },\n {\n fields: parts as IdentifierExpr[],\n },\n );\n\n newSelections.push(aliasExpr(newColumn, thisIdent, {\n copy: false,\n }) as AliasExpr);\n }\n\n return newSelections;\n}\n\nfunction expandStructStarsWithParens (expression: DotExpr): AliasExpr[] {\n if (!(expression.args.this instanceof ParenExpr)) {\n return [\n ];\n }\n\n const dotColumn = expression.find(ColumnExpr);\n if (!(dotColumn instanceof ColumnExpr) || !dotColumn.isType(DataTypeExprKind.STRUCT)) {\n return [\n ];\n }\n\n let parent = dotColumn.parent;\n const dotColumnType2 = dotColumn.type;\n let startingStruct: string | ColumnDefExpr | DotExpr | IdentifierExpr | DataTypeExpr | undefined = isInstanceOf(dotColumnType2, DataTypeExpr) ? dotColumnType2 : undefined;\n\n while (parent !== undefined) {\n if (parent instanceof ParenExpr) {\n parent = parent.parent;\n continue;\n }\n\n if (!(parent instanceof DotExpr)) {\n return [\n ];\n }\n\n const rhs = parent.right;\n if (rhs instanceof StarExpr) {\n break;\n }\n\n if (!(rhs instanceof IdentifierExpr)) {\n return [\n ];\n }\n\n let matched = false;\n const expressions: (DataTypeExpr | ColumnDefExpr)[] = filterInstanceOf((startingStruct as DataTypeExpr).args.expressions || [\n ], ColumnDefExpr);\n for (const structFieldDef of expressions) {\n if (structFieldDef.name === rhs.name) {\n matched = true;\n startingStruct = structFieldDef.args.kind as DataTypeExpr | undefined;\n break;\n }\n }\n\n if (!matched) return [\n ];\n\n parent = parent.parent;\n }\n\n const newSelections = [\n ];\n\n const outerParen = expression.args.this;\n\n const expressions: (DataTypeExpr | ColumnDefExpr)[] = filterInstanceOf((startingStruct as DataTypeExpr).args.expressions || [\n ], ColumnDefExpr);\n for (const structFieldDef of expressions) {\n const newIdentifier = structFieldDef.args.this instanceof IdentifierExpr\n ? structFieldDef.args.this.copy()\n : new IdentifierExpr({\n this: structFieldDef.args.this?.toString(),\n });\n const newDot = DotExpr.build([\n outerParen.copy(),\n newIdentifier,\n ]);\n const newAlias = alias(newDot, newIdentifier, {\n copy: false,\n }) as AliasExpr;\n newSelections.push(newAlias);\n }\n\n return newSelections;\n}\n\nfunction expandStars_ (\n scope: Scope,\n resolver: Resolver,\n usingColumnTables: Map<string, string[]>,\n pseudocolumns: Set<string>,\n annotator: TypeAnnotator,\n): void {\n const newSelections: Expression[] = [\n ];\n const exceptColumns = new Map<string, Set<string>>();\n const replaceColumnsMap = new Map<string, Record<string, AliasExpr>>();\n const renameColumnsMap = new Map<string, Record<string, string>>();\n const coalesedColumns = new Set<string>();\n const dialectClass = resolver.dialect._constructor;\n\n let pivotOutputColumns: string[] | undefined = undefined;\n const pivotExcludeColumns = new Set<string>();\n\n const pivot = seqGet(scope.pivots, 0);\n if (pivot instanceof PivotExpr && !pivot.aliasColumnNames.length) {\n if (pivot.unpivot) {\n pivotOutputColumns = unpivotColumns(pivot).map((c) => c.outputName);\n\n for (const field of pivot.args.fields || [\n ]) {\n if (field instanceof InExpr) {\n for (const e of field.args.expressions as Expression[]) {\n for (const c of (e as Expression).findAll(ColumnExpr)) {\n pivotExcludeColumns.add(c.outputName);\n }\n }\n }\n }\n } else {\n for (const c of pivot.findAll(ColumnExpr)) {\n pivotExcludeColumns.add(c.outputName);\n }\n\n const pivotColumns = pivot.getArgKey('columns') as Expression[] | undefined;\n pivotOutputColumns = (pivotColumns || [\n ]).map((c) => (c as Expression).outputName);\n if (!pivotOutputColumns.length) {\n pivotOutputColumns = (pivot.args.expressions as Expression[]).map((c) => c.aliasOrName);\n }\n }\n }\n\n if (dialectClass.SUPPORTS_STRUCT_STAR_EXPANSION && scope.stars.some((col) => col instanceof DotExpr)) {\n annotator.annotateScope(scope);\n }\n\n for (const expression of scope.expression.selects) {\n const tables: string[] = [\n ];\n\n if (expression instanceof StarExpr) {\n tables.push(...Object.keys(scope.selectedSources));\n addExceptColumns(expression, tables, exceptColumns);\n addReplaceColumns(expression, tables, replaceColumnsMap);\n addRenameColumns(expression, tables, renameColumnsMap);\n } else if ((expression as Expression).isStar) {\n if (!(expression instanceof DotExpr)) {\n const tableName = expression instanceof ColumnExpr ? expression.table : '';\n if (tableName) tables.push(tableName);\n const exprThis = (expression as Expression).args.this;\n if (exprThis instanceof Expression) {\n addExceptColumns(exprThis, tables, exceptColumns);\n addReplaceColumns(exprThis, tables, replaceColumnsMap);\n addRenameColumns(exprThis, tables, renameColumnsMap);\n }\n } else if (dialectClass.SUPPORTS_STRUCT_STAR_EXPANSION && !dialectClass.REQUIRES_PARENTHESIZED_STRUCT_ACCESS) {\n const structFields = expandStructStarsNoParens(expression as DotExpr);\n if (0 < structFields.length) {\n newSelections.push(...structFields);\n continue;\n }\n } else if (dialectClass.REQUIRES_PARENTHESIZED_STRUCT_ACCESS) {\n const structFields = expandStructStarsWithParens(expression as DotExpr);\n if (0 < structFields.length) {\n newSelections.push(...structFields);\n continue;\n }\n }\n }\n\n if (tables.length === 0) {\n newSelections.push(expression as Expression);\n continue;\n }\n\n for (const table of tables) {\n if (!scope.sources.has(table)) {\n throw new OptimizeError(`Unknown table: ${table}`);\n }\n\n let columns = resolver.getSourceColumns(table, {\n onlyVisible: true,\n });\n if (!columns.length) columns = scope.outerColumns;\n\n if (0 < pseudocolumns.size && dialectClass.EXCLUDES_PSEUDOCOLUMNS_FROM_STAR) {\n columns = columns.filter((name) => !pseudocolumns.has(name.toUpperCase()));\n }\n\n if (!columns.length || columns.includes('*')) {\n return;\n }\n\n const columnsToExclude = exceptColumns.get(table) || new Set<string>();\n const renamedColumns = renameColumnsMap.get(table) || {};\n const replacedColumns = replaceColumnsMap.get(table) || {};\n\n if (pivot instanceof PivotExpr) {\n let pivotColumns: string[] | undefined;\n if (pivotOutputColumns && 0 < pivotExcludeColumns.size) {\n pivotColumns = columns.filter((c) => !pivotExcludeColumns.has(c));\n pivotColumns.push(...pivotOutputColumns);\n } else {\n pivotColumns = pivot.aliasColumnNames;\n }\n\n if (0 < pivotColumns.length) {\n for (const name of pivotColumns) {\n if (!columnsToExclude.has(name)) {\n newSelections.push(\n aliasExpr(columnExpr({\n col: name,\n table: pivot.alias,\n }), name, {\n copy: false,\n }) as Expression,\n );\n }\n }\n continue;\n }\n }\n\n for (const name of columns) {\n if (columnsToExclude.has(name) || coalesedColumns.has(name)) continue;\n\n const tablesForCol = usingColumnTables.get(name);\n if (tablesForCol?.includes(table)) {\n coalesedColumns.add(name);\n const coalesceArgs = tablesForCol.map((t) => columnExpr({\n col: name,\n table: t,\n }));\n newSelections.push(\n aliasExpr(\n new CoalesceExpr({\n this: coalesceArgs[0],\n expressions: coalesceArgs.slice(1),\n }),\n name,\n {\n copy: false,\n },\n ) as Expression,\n );\n } else {\n const alias_ = renamedColumns[name] ?? name;\n const selectionExpr = replacedColumns[name] || columnExpr({\n col: name,\n table,\n });\n newSelections.push(\n alias_ !== name\n ? aliasExpr(selectionExpr, alias_, {\n copy: false,\n }) as Expression\n : selectionExpr,\n );\n }\n }\n }\n }\n\n if (0 < newSelections.length && scope.expression instanceof SelectExpr) {\n scope.expression.setArgKey('expressions', newSelections);\n }\n}\n\nexport function qualifyOutputs (scopeOrExpression: Scope | Expression): void {\n let scopeInstance: Scope;\n\n if (scopeOrExpression instanceof Scope) {\n scopeInstance = scopeOrExpression;\n } else {\n const built = buildScope(scopeOrExpression);\n if (!(built instanceof Scope)) return;\n scopeInstance = built;\n }\n\n if (!(scopeInstance.expression instanceof SelectExpr)) {\n return;\n }\n\n const selects = scopeInstance.expression.selects;\n const outerColumns = scopeInstance.outerColumns;\n const newSelections: Expression[] = [\n ];\n const maxLen = Math.max(selects.length, outerColumns.length);\n\n for (let i = 0; i < maxLen; i++) {\n let selection = selects[i] as Expression | undefined;\n const aliasedColumn = outerColumns[i];\n\n if (!selection || selection instanceof QueryTransformExpr) {\n break;\n }\n\n if (selection instanceof SubqueryExpr) {\n if (!selection.outputName) {\n selection.setArgKey('alias', new TableAliasExpr({\n this: toIdentifier(`_col_${i}`),\n }));\n }\n } else if (!(selection instanceof AliasExpr) && !(selection instanceof AliasesExpr) && !selection.isStar) {\n selection = aliasExpr(\n selection,\n selection.outputName || `_col_${i}`,\n {\n copy: false,\n },\n ) as Expression;\n }\n\n if (aliasedColumn) {\n selection.setArgKey('alias', toIdentifier(aliasedColumn));\n }\n\n newSelections.push(selection);\n }\n\n if (0 < newSelections.length && scopeInstance.expression instanceof SelectExpr) {\n scopeInstance.expression.setArgKey('expressions', newSelections);\n }\n}\n\nfunction selectByPos (scope: Scope, node: LiteralExpr): AliasExpr {\n const index = Number(node.args.this) - 1;\n const select = scope.expression.selects[index] as Expression | undefined;\n if (!(select instanceof AliasExpr)) {\n throw new OptimizeError(`Unknown output column: ${node.name}`);\n }\n return select;\n}\n\nfunction expandPositionalReferences (\n scope: Scope,\n expressions: Iterable<Expression>,\n dialect: Dialect,\n options: {alias?: boolean} = {},\n): Expression[] {\n const {\n alias = false,\n } = options;\n const dialectClass = dialect._constructor;\n const newNodes: Expression[] = [\n ];\n let ambiguousProjections: Set<string> | undefined;\n\n for (const node of expressions) {\n if (node.isInteger) {\n const select = selectByPos(scope, node as LiteralExpr);\n if (alias) {\n const selectAlias = select.alias;\n newNodes.push(selectAlias\n ? columnExpr({\n col: selectAlias,\n })\n : node);\n } else {\n const selectThis = select.args.this as Expression;\n let ambiguous = false;\n\n if (dialectClass.PROJECTION_ALIASES_SHADOW_SOURCE_NAMES) {\n if (ambiguousProjections === undefined) {\n ambiguousProjections = new Set(\n scope.expression.selects\n .map((s) => s.aliasOrName)\n .filter((name) => name in scope.selectedSources),\n );\n }\n ambiguous = Array.from(selectThis.findAll(ColumnExpr)).some(\n (col) => ambiguousProjections?.has(col.parts[0]?.name || ''),\n );\n }\n\n if (\n CONSTANTS.some((C) => selectThis instanceof C)\n || selectThis.isNumber\n || selectThis.find(ExplodeExpr)\n || selectThis.find(UnnestExpr)\n || ambiguous\n ) {\n newNodes.push(node);\n } else {\n newNodes.push(selectThis.copy());\n }\n }\n } else {\n newNodes.push(node);\n }\n }\n\n return newNodes;\n}\n\nfunction expandGroupBy (scope: Scope, dialect: Dialect): void {\n const group = (scope.expression as SelectExpr).args.group;\n if (!group) return;\n\n const groupExpressions = filterInstanceOf(group.args.expressions || [\n ], Expression);\n group.setArgKey('expressions', expandPositionalReferences(scope, groupExpressions, dialect));\n (scope.expression as SelectExpr).setArgKey('group', group);\n}\n\nfunction expandOrderByAndDistinctOn (scope: Scope, resolver: Resolver): void {\n for (const modifierKey of [\n 'order',\n 'distinct',\n ]) {\n let modifier = scope.expression.getArgKey(modifierKey) as Expression | undefined;\n\n if (modifier instanceof DistinctExpr) {\n modifier = modifier.args.on;\n }\n\n if (!(modifier instanceof Expression)) {\n continue;\n }\n\n let modifierExpressions = modifier.args.expressions as Expression[];\n\n if (modifierKey === 'order') {\n modifierExpressions = modifierExpressions.map(\n (ordered) => ordered.args.this as Expression,\n );\n }\n\n const expanded = expandPositionalReferences(scope, modifierExpressions, resolver.dialect, {\n alias: true,\n });\n\n for (let j = 0; j < modifierExpressions.length; j++) {\n const original = modifierExpressions[j];\n const expandedNode = expanded[j];\n\n for (const agg of original.findAll(AggFuncExpr)) {\n for (const col of agg.findAll(ColumnExpr)) {\n if (!col.table) {\n const table = resolver.getTable(col.name);\n if (table) {\n col.setArgKey('table', table);\n }\n }\n }\n }\n\n original.replace(expandedNode);\n }\n\n if (scope.expression.getArgKey('group')) {\n const selectsMap = new Map<string, Expression>(\n scope.expression.selects\n .filter((s): s is AliasExpr => s instanceof AliasExpr)\n .map((s) => [\n (s.args.this as Expression).sql(),\n columnExpr({\n col: s.aliasOrName,\n }),\n ]),\n );\n\n for (const expr of modifierExpressions) {\n if (expr.isInteger) {\n expr.replace(toIdentifier(selectByPos(scope, expr as LiteralExpr).alias));\n } else {\n const match = selectsMap.get(expr.sql());\n if (match) expr.replace(match);\n }\n }\n }\n }\n}\n\nexport function quoteIdentifiers (\n expression: Expression,\n options: {\n dialect?: DialectType;\n identify?: boolean;\n } = {},\n): Expression {\n const {\n dialect: dialectArg, identify = true,\n } = options;\n const dialect = Dialect.getOrRaise(dialectArg);\n return expression.transform(\n dialect.quoteIdentifier.bind(dialect),\n {\n identify,\n copy: false,\n },\n );\n}\n\nexport function pushdownCteAliasColumns (scope: Scope): void {\n for (const cte of scope.ctes) {\n const aliasColumnNames = cte.aliasColumnNames;\n if (0 < aliasColumnNames.length && cte.args.this instanceof SelectExpr) {\n const selectExpr = cte.args.this;\n const expressions = selectExpr.args.expressions || [\n ];\n const newExpressions: Expression[] = [\n ];\n\n for (let i = 0; i < aliasColumnNames.length; i++) {\n const alias_ = aliasColumnNames[i];\n const projection = expressions[i];\n if (!projection) break;\n\n let newProjection: Expression;\n if (projection instanceof AliasExpr) {\n projection.setArgKey('alias', toIdentifier(alias_));\n newProjection = projection;\n } else {\n newProjection = aliasExpr(projection, alias_) as Expression;\n }\n newExpressions.push(newProjection);\n }\n\n selectExpr.setArgKey('expressions', newExpressions);\n }\n }\n}\n","// https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/qualify.py\n\nimport type {\n Expression,\n} from '../expressions';\nimport {\n Dialect, type DialectType,\n} from '../dialects/dialect';\nimport {\n ensureSchema, type Schema,\n} from '../schema';\nimport {\n isolateTableSelects,\n} from './isolate_table_selects';\nimport {\n normalizeIdentifiers,\n} from './normalize_identifiers';\nimport {\n qualifyColumns,\n quoteIdentifiers,\n validateQualifyColumns,\n} from './qualify_columns';\nimport {\n qualifyTables,\n} from './qualify_tables';\n\n/**\n * Rewrite sqlglot AST to have normalized and qualified tables and columns.\n *\n * This step is necessary for all further SQLGlot optimizations.\n *\n * Example:\n * ```ts\n * import { parseOne } from 'sqlglot';\n * import { qualify } from 'sqlglot/optimizer';\n *\n * const schema = { tbl: { col: \"INT\" } };\n * const expression = parseOne(\"SELECT col FROM tbl\");\n * qualify(expression, { schema }).sql();\n * // 'SELECT \"tbl\".\"col\" AS \"col\" FROM \"tbl\" AS \"tbl\"'\n * ```\n *\n * @param expression - Expression to qualify\n * @param options - Qualification options\n * @param options.dialect - SQL dialect\n * @param options.db - Default database name for tables\n * @param options.catalog - Default catalog name for tables\n * @param options.schema - Schema to infer column names and types\n * @param options.expandAliasRefs - Whether to expand references to aliases (default: true)\n * @param options.expandStars - Whether to expand star queries (default: true). This is necessary for most optimizer rules!\n * @param options.inferSchema - Whether to infer the schema if missing\n * @param options.isolateTables - Whether to isolate table selects (default: false)\n * @param options.qualifyColumns - Whether to qualify columns (default: true)\n * @param options.allowPartialQualification - Whether to allow partial qualification (default: false)\n * @param options.validateQualifyColumns - Whether to validate columns (default: true)\n * @param options.quoteIdentifiers - Whether to quote identifiers (default: true). This is necessary for case-sensitive queries!\n * @param options.identify - If true, quote all identifiers, else only necessary ones (default: true)\n * @param options.canonicalizeTableAliases - Use canonical aliases (_0, _1, ...) instead of preserving table names (default: false)\n * @param options.onQualify - Callback after a table has been qualified\n * @param options.sql - Original SQL string for error highlighting\n * @returns The qualified expression\n */\nexport function qualify<E extends Expression> (\n expression: E,\n options: {\n dialect?: DialectType;\n db?: string;\n catalog?: string;\n schema?: Record<string, unknown> | Schema;\n expandAliasRefs?: boolean;\n expandStars?: boolean;\n inferSchema?: boolean;\n isolateTables?: boolean;\n qualifyColumns?: boolean;\n allowPartialQualification?: boolean;\n validateQualifyColumns?: boolean;\n quoteIdentifiers?: boolean;\n identify?: boolean;\n canonicalizeTableAliases?: boolean;\n onQualify?: (expression: Expression) => void;\n sql?: string;\n } = {},\n): E {\n const {\n dialect: dialectArg,\n db,\n catalog,\n schema: schemaArg,\n expandAliasRefs = true,\n expandStars = true,\n inferSchema,\n isolateTables = false,\n qualifyColumns: qualifyColumnsFlag = true,\n allowPartialQualification = false,\n validateQualifyColumns: validateQualifyColumnsFlag = true,\n quoteIdentifiers: quoteIdentifiersFlag = true,\n identify = true,\n canonicalizeTableAliases = false,\n onQualify,\n sql,\n } = options;\n\n const schema = ensureSchema(schemaArg, {\n dialect: dialectArg,\n });\n const dialect = Dialect.getOrRaise(dialectArg);\n\n expression = normalizeIdentifiers(expression, {\n dialect,\n storeOriginalColumnIdentifiers: true,\n }) as E;\n\n expression = qualifyTables(expression, {\n db,\n catalog,\n dialect,\n onQualify,\n canonicalizeTableAliases,\n }) as E;\n\n if (isolateTables) {\n expression = isolateTableSelects(expression, {\n schema,\n dialect,\n }) as E;\n }\n\n if (qualifyColumnsFlag) {\n expression = qualifyColumns(expression, {\n schema,\n expandAliasRefs,\n expandStars,\n inferSchema,\n allowPartialQualification,\n }) as E;\n }\n\n if (quoteIdentifiersFlag) {\n expression = quoteIdentifiers(expression, {\n dialect,\n identify,\n }) as E;\n }\n\n if (validateQualifyColumnsFlag) {\n validateQualifyColumns(expression, sql);\n }\n\n return expression;\n}\n"]}