@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,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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');var cr,qt;cr=[_chunk2Z3O2CFMcjs.r];var g=class{static get EXPRESSION_METADATA(){let n=new Map(_chunk2Z3O2CFMcjs.np.EXPRESSION_METADATA),t=(e,r)=>{for(let p of e)n.set(p,r)};return t([_chunk2Z3O2CFMcjs.cf,_chunk2Z3O2CFMcjs.nf],{returns:"double"}),t([_chunk2Z3O2CFMcjs.Yg,_chunk2Z3O2CFMcjs.Yh],{returns:"varchar"}),t([_chunk2Z3O2CFMcjs.Hh,_chunk2Z3O2CFMcjs.Fh,_chunk2Z3O2CFMcjs.Ih,_chunk2Z3O2CFMcjs.kk,_chunk2Z3O2CFMcjs.Wi,_chunk2Z3O2CFMcjs.hm],{returns:"int"}),n.set(_chunk2Z3O2CFMcjs.ch,{returns:"datetime"}),n}};qt=_chunk2Z3O2CFMcjs.a.call(void 0, null),_chunk2Z3O2CFMcjs.d.call(void 0, qt,10,"EXPRESSION_METADATA",cr,g),_chunk2Z3O2CFMcjs.b.call(void 0, qt,g),_chunk2Z3O2CFMcjs.c.call(void 0, qt,3,g);function s(o,n={}){return function(){return this.parseShowMysql(o,n)}}function is(o){let n=this.sql(o,"this"),t=o.text("unit").toUpperCase(),e,r;if(t==="WEEK")e=`CONCAT(YEAR(${n}), ' ', WEEK(${n}, 1), ' 1')`,r="%Y %u %w";else if(t==="MONTH")e=`CONCAT(YEAR(${n}), ' ', MONTH(${n}), ' 1')`,r="%Y %c %e";else if(t==="QUARTER")e=`CONCAT(YEAR(${n}), ' ', QUARTER(${n}) * 3 - 2, ' 1')`,r="%Y %c %e";else if(t==="YEAR")e=`CONCAT(YEAR(${n}), ' 1 1')`,r="%Y %c %e";else return t!=="DAY"&&this.unsupported(`Unexpected interval unit: ${t}`),this.func("DATE",[n]);return this.func("STR_TO_DATE",[e,`'${r}'`])}var ns=new Set(["f","H","h","I","i","k","l","p","r","S","s","T"]);function Es(o){let n=0,t=o.length;for(;n<t;){if(o[n]==="%"&&(n+=1,n<t&&ns.has(o[n])))return!0;n+=1}return!1}function as(o){let n=_chunk2Z3O2CFMcjs.ca.call(void 0, o,1),t=l.formatTime(n),e=_chunk2Z3O2CFMcjs.ca.call(void 0, o,0);return n&&Es(n instanceof _chunk2Z3O2CFMcjs.Ca?n.name:n)?new (0, _chunk2Z3O2CFMcjs.xl)({this:e,format:t||""}):new (0, _chunk2Z3O2CFMcjs.wl)({this:e,format:t})}function Gt(o){return this.func("STR_TO_DATE",[o.args.this,this.formatTime(o)])}function os(o){let n=o.args.scale,t=o.args.this;return n===void 0||n.toValue()===_chunk2Z3O2CFMcjs.Zl.SECONDS.toValue()?this.func("FROM_UNIXTIME",[t,this.formatTime(o)]):this.func("FROM_UNIXTIME",[new (0, _chunk2Z3O2CFMcjs.ze)({this:t,expression:_chunk2Z3O2CFMcjs.no.call(void 0, "POW","10",n.toString())}),this.formatTime(o)])}function Ft(o){return function(n){return this.func(`DATE_${o}`,[n.args.this,new (0, _chunk2Z3O2CFMcjs.fe)({this:n.args.expression,unit:_chunk2Z3O2CFMcjs.vq.call(void 0, n)})])}}function Ts(o){return o.args.format?Gt.call(this,o):this.func("DATE",[o.args.this])}function f(o,n=["this"]){return function(t){for(let e of n){let r=t.getArgKey(e);r instanceof _chunk2Z3O2CFMcjs.Pl&&!r.args.format&&t.setArgKey(e,r.args.this)}return o?o.call(this,t):this.functionFallbackSql(t)}}var Ar,Ir,Rr,et,O=class extends(Rr=_chunk2Z3O2CFMcjs.Xq,Ir=[_chunk2Z3O2CFMcjs.r],Ar=[_chunk2Z3O2CFMcjs.r],Rr){constructor(){super(...arguments);this.ESCAPE_FOLLOW_CHARS=["0","b","n","r","t","Z","%","_"];this.NESTED_COMMENTS=!1}static get ORIGINAL_KEYWORDS(){return{..._chunk2Z3O2CFMcjs.Xq.KEYWORDS,BLOB:"blob",CHARSET:"characterSet",DISTINCTROW:"distinct",EXPLAIN:"describe",FORCE:"force",IGNORE:"ignore",KEY:"key","LOCK TABLES":"command",LONGBLOB:"longblob",LONGTEXT:"longtext",MEDIUMBLOB:"mediumblob",MEDIUMINT:"mediumint",MEDIUMTEXT:"mediumtext","MEMBER OF":"memberOf",MOD:"mod",SEPARATOR:"separator",SERIAL:"serial",SIGNED:"bigint","SIGNED INTEGER":"bigint","SOUNDS LIKE":"soundsLike",START:"begin",TIMESTAMP:"timestamptz",TINYBLOB:"tinyblob",TINYTEXT:"tinytext","UNLOCK TABLES":"command",UNSIGNED:"ubigint","UNSIGNED INTEGER":"ubigint",YEAR:"year",_ARMSCII8:"introducer",_ASCII:"introducer",_BIG5:"introducer",_BINARY:"introducer",_CP1250:"introducer",_CP1251:"introducer",_CP1256:"introducer",_CP1257:"introducer",_CP850:"introducer",_CP852:"introducer",_CP866:"introducer",_CP932:"introducer",_DEC8:"introducer",_EUCJPMS:"introducer",_EUCKR:"introducer",_GB18030:"introducer",_GB2312:"introducer",_GBK:"introducer",_GEOSTD8:"introducer",_GREEK:"introducer",_HEBREW:"introducer",_HP8:"introducer",_KEYBCS2:"introducer",_KOI8R:"introducer",_KOI8U:"introducer",_LATIN1:"introducer",_LATIN2:"introducer",_LATIN5:"introducer",_LATIN7:"introducer",_MACCE:"introducer",_MACROMAN:"introducer",_SJIS:"introducer",_SWE7:"introducer",_TIS620:"introducer",_UCS2:"introducer",_UJIS:"introducer",_UTF8:"introducer",_UTF16:"introducer",_UTF16LE:"introducer",_UTF32:"introducer",_UTF8MB3:"introducer",_UTF8MB4:"introducer","@@":"sessionParameter"}}static get COMMANDS(){let t=new Set([..._chunk2Z3O2CFMcjs.Xq.COMMANDS,"replace"]);return t.delete("show"),t}};et=_chunk2Z3O2CFMcjs.a.call(void 0, Rr),_chunk2Z3O2CFMcjs.d.call(void 0, et,10,"ORIGINAL_KEYWORDS",Ir,O),_chunk2Z3O2CFMcjs.d.call(void 0, et,10,"COMMANDS",Ar,O),_chunk2Z3O2CFMcjs.b.call(void 0, et,O),_chunk2Z3O2CFMcjs.c.call(void 0, et,3,O),O.QUOTES=["'",'"'],O.COMMENTS=["--","#",["/*","*/"]],O.IDENTIFIERS=["`"],O.STRING_ESCAPES=["'",'"',"\\"],O.BIT_STRINGS=[["b'","'"],["B'","'"],["0b",""]],O.HEX_STRINGS=[["x'","'"],["X'","'"],["0x",""]];var hr,Nr,Or,fr,dr,xr,Cr,mr,Pr,gr,Dr,_r,Ur,Lr,Mr,br,Br,qr,Fr,Gr,u,T=class T extends(Gr=_chunk2Z3O2CFMcjs.za,Fr=[_chunk2Z3O2CFMcjs.r],qr=[_chunk2Z3O2CFMcjs.r],Br=[_chunk2Z3O2CFMcjs.r],br=[_chunk2Z3O2CFMcjs.r],Mr=[_chunk2Z3O2CFMcjs.r],Lr=[_chunk2Z3O2CFMcjs.r],Ur=[_chunk2Z3O2CFMcjs.r],_r=[_chunk2Z3O2CFMcjs.r],Dr=[_chunk2Z3O2CFMcjs.r],gr=[_chunk2Z3O2CFMcjs.r],Pr=[_chunk2Z3O2CFMcjs.r],mr=[_chunk2Z3O2CFMcjs.r],Cr=[_chunk2Z3O2CFMcjs.r],xr=[_chunk2Z3O2CFMcjs.r],dr=[_chunk2Z3O2CFMcjs.r],fr=[_chunk2Z3O2CFMcjs.r],Or=[_chunk2Z3O2CFMcjs.r],Nr=[_chunk2Z3O2CFMcjs.r],hr=[_chunk2Z3O2CFMcjs.r],Gr){static get ID_VAR_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.ID_VAR_TOKENS,"currentCatalog"])}static get FUNC_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.FUNC_TOKENS,"database","mod","schema","values","characterSet"])}static get CONJUNCTION(){return{..._chunk2Z3O2CFMcjs.za.CONJUNCTION,damp:_chunk2Z3O2CFMcjs.kn,xor:_chunk2Z3O2CFMcjs.mn}}static get DISJUNCTION(){return{..._chunk2Z3O2CFMcjs.za.DISJUNCTION,dpipe:_chunk2Z3O2CFMcjs.ln}}static get TABLE_ALIAS_TOKENS(){return(()=>{let t=new Set(_chunk2Z3O2CFMcjs.za.TABLE_ALIAS_TOKENS);for(let e of _chunk2Z3O2CFMcjs.za.TABLE_INDEX_HINT_TOKENS)t.delete(e);return t})()}static get RANGE_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.RANGE_PARSERS,soundsLike:function(t){return this.expression(_chunk2Z3O2CFMcjs.Ce,{this:this.expression(_chunk2Z3O2CFMcjs.ll,{this:t}),expression:this.expression(_chunk2Z3O2CFMcjs.ll,{this:this.parseTerm()})})},memberOf:function(t){return this.expression(_chunk2Z3O2CFMcjs.Bj,{this:t,expression:this.parseWrapped(this.parseExpression.bind(this))})}}}static get FUNCTIONS(){return{..._chunk2Z3O2CFMcjs.za.FUNCTIONS,BIT_AND:t=>_chunk2Z3O2CFMcjs.om.fromArgList(t),BIT_OR:t=>_chunk2Z3O2CFMcjs.pm.fromArgList(t),BIT_XOR:t=>_chunk2Z3O2CFMcjs.qm.fromArgList(t),BIT_COUNT:t=>_chunk2Z3O2CFMcjs.tf.fromArgList(t),CONVERT_TZ:t=>new (0, _chunk2Z3O2CFMcjs.$f)({sourceTz:_chunk2Z3O2CFMcjs.ca.call(void 0, t,1),targetTz:_chunk2Z3O2CFMcjs.ca.call(void 0, t,2),timestamp:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)}),CURDATE:t=>_chunk2Z3O2CFMcjs.$g.fromArgList(t),DATE:t=>new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)}),DATE_ADD:t=>_chunk2Z3O2CFMcjs.Np.call(void 0, (0, _chunk2Z3O2CFMcjs.uh))(t),DATE_FORMAT:_chunk2Z3O2CFMcjs.Kp.call(void 0, _chunk2Z3O2CFMcjs.Hl,{dialect:"mysql"}),DATE_SUB:t=>_chunk2Z3O2CFMcjs.Np.call(void 0, (0, _chunk2Z3O2CFMcjs.wh))(t),DAY:t=>new (0, _chunk2Z3O2CFMcjs.mi)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})}),DAYOFMONTH:t=>new (0, _chunk2Z3O2CFMcjs.Hh)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})}),DAYOFWEEK:t=>new (0, _chunk2Z3O2CFMcjs.Fh)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})}),DAYOFYEAR:t=>new (0, _chunk2Z3O2CFMcjs.Ih)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})}),FORMAT:t=>_chunk2Z3O2CFMcjs.Al.fromArgList(t),FROM_UNIXTIME:_chunk2Z3O2CFMcjs.Kp.call(void 0, _chunk2Z3O2CFMcjs.Zl,{dialect:"mysql"}),ISNULL:_chunk2Z3O2CFMcjs.oq,LENGTH:t=>new (0, _chunk2Z3O2CFMcjs.Oj)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),binary:!0}),MAKETIME:t=>_chunk2Z3O2CFMcjs.ii.fromArgList(t),MONTH:t=>new (0, _chunk2Z3O2CFMcjs.kk)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})}),MONTHNAME:t=>new (0, _chunk2Z3O2CFMcjs.Hl)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)}),format:new (0, _chunk2Z3O2CFMcjs.$c)({this:"%B",isString:!0})}),SCHEMA:t=>_chunk2Z3O2CFMcjs.jh.fromArgList(t),DATABASE:t=>_chunk2Z3O2CFMcjs.jh.fromArgList(t),STR_TO_DATE:as,TIMESTAMPDIFF:_chunk2Z3O2CFMcjs.Mp.call(void 0, _chunk2Z3O2CFMcjs.ai),TO_DAYS:t=>new (0, _chunk2Z3O2CFMcjs.xh)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)}),expression:new (0, _chunk2Z3O2CFMcjs.Pl)({this:new (0, _chunk2Z3O2CFMcjs.$c)({this:"0000-01-01",isString:!0})}),unit:new (0, _chunk2Z3O2CFMcjs.Ub)({this:"DAY"})}).add(1),VERSION:t=>_chunk2Z3O2CFMcjs.Yg.fromArgList(t),WEEK:t=>new (0, _chunk2Z3O2CFMcjs.hm)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)}),mode:_chunk2Z3O2CFMcjs.ca.call(void 0, t,1)}),WEEKOFYEAR:t=>new (0, _chunk2Z3O2CFMcjs.Lh)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})}),YEAR:t=>new (0, _chunk2Z3O2CFMcjs.km)({this:new (0, _chunk2Z3O2CFMcjs.Pl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)})})}}static get FUNCTION_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.FUNCTION_PARSERS,GROUP_CONCAT:function(){return this.parseGroupConcat()},VALUES:function(){return this.expression(_chunk2Z3O2CFMcjs.Kf,{this:"VALUES",expressions:[this.parseIdVar()]})},JSON_VALUE:function(){return this.parseJsonValue()},SUBSTR:function(){return this.parseSubstring()}}}static get STATEMENT_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.STATEMENT_PARSERS,show:function(){return this.parseShow()}}}static get PROPERTY_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.PROPERTY_PARSERS,LOCK:function(){return this.parsePropertyAssignment(_chunk2Z3O2CFMcjs.qd)},"PARTITION BY":function(){return this.parsePartitionProperty()}}}static get SET_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.SET_PARSERS,PERSIST:function(){return this.parseSetItemAssignment({kind:"persist"})},PERSIST_ONLY:function(){return this.parseSetItemAssignment({kind:"PERSIST_ONLY"})},"CHARACTER SET":function(){return this.parseSetItemCharset("CHARACTER SET")},CHARSET:function(){return this.parseSetItemCharset("CHARACTER SET")},NAMES:function(){return this.parseSetItemNames()}}}static get CONSTRAINT_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.CONSTRAINT_PARSERS,FULLTEXT:function(){return this.parseIndexConstraint("FULLTEXT")},INDEX:function(){return this.parseIndexConstraint()},KEY:function(){return this.parseIndexConstraint()},SPATIAL:function(){return this.parseIndexConstraint("SPATIAL")},ZEROFILL:function(){return this.expression(_chunk2Z3O2CFMcjs.Lc)}}}static get ALTER_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.ALTER_PARSERS,MODIFY:function(){return this.parseAlterTableAlter()}}}static get ALTER_ALTER_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.ALTER_ALTER_PARSERS,INDEX:function(){return this.parseAlterTableAlterIndex()}}}static get SCHEMA_UNNAMED_CONSTRAINTS(){return new Set([..._chunk2Z3O2CFMcjs.za.SCHEMA_UNNAMED_CONSTRAINTS,"FULLTEXT","INDEX","KEY","SPATIAL"])}static get PROFILE_TYPES(){return{ALL:[],CPU:[],IPC:[],MEMORY:[],SOURCE:[],SWAPS:[],BLOCK:["IO"],CONTEXT:["SWITCHES"],PAGE:["FAULTS"]}}static get TYPE_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.TYPE_TOKENS,"set"])}static get ENUM_TYPE_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.ENUM_TYPE_TOKENS,"set"])}static get OPERATION_MODIFIERS(){return new Set(["HIGH_PRIORITY","STRAIGHT_JOIN","SQL_SMALL_RESULT","SQL_BIG_RESULT","SQL_BUFFER_RESULT","SQL_NO_CACHE","SQL_CALC_FOUND_ROWS"])}parseGeneratedAsIdentity(){let t=super.parseGeneratedAsIdentity();if(this.matchTexts(["STORED","VIRTUAL"])){let e=_optionalChain([this, 'access', _2 => _2.prev, 'optionalAccess', _3 => _3.text, 'access', _4 => _4.toUpperCase, 'call', _5 => _5()])==="STORED";t instanceof _chunk2Z3O2CFMcjs.Yc?t.setArgKey("persisted",e):t instanceof _chunk2Z3O2CFMcjs.Pc&&(t=this.expression(_chunk2Z3O2CFMcjs.Yc,{this:t.args.expression,persisted:e}))}return t}parsePrimaryKeyPart(){let t=this.parseIdVar();if(!this.match("lParen"))return t;let e=this.parseNumber();return this.matchRParen(),this.expression(_chunk2Z3O2CFMcjs.mb,{this:t,expression:e})}parseIndexConstraint(t){t&&this.matchTexts(["INDEX","KEY"]);let e=this.parseIdVar({anyToken:!1}),r=this.match("using")&&this.advanceAny()&&_optionalChain([this, 'access', _6 => _6.prev, 'optionalAccess', _7 => _7.text]),p=this.parseWrappedCsv(this.parseOrdered.bind(this)),S=[];for(;;){let R;if(this.matchTextSeq(["KEY_BLOCK_SIZE"])?(this.match("eq"),R=new (0, _chunk2Z3O2CFMcjs.cb)({keyBlockSize:this.parseNumber()})):this.match("using")?R=new (0, _chunk2Z3O2CFMcjs.cb)({using:this.advanceAny()&&_optionalChain([this, 'access', _8 => _8.prev, 'optionalAccess', _9 => _9.text])}):this.matchTextSeq(["WITH","PARSER"])?R=new (0, _chunk2Z3O2CFMcjs.cb)({parser:this.parseVar({anyToken:!0})}):this.match("comment")?R=new (0, _chunk2Z3O2CFMcjs.cb)({comment:this.parseString()}):this.matchTextSeq(["VISIBLE"])?R=new (0, _chunk2Z3O2CFMcjs.cb)({visible:!0}):this.matchTextSeq(["INVISIBLE"])?R=new (0, _chunk2Z3O2CFMcjs.cb)({visible:!1}):this.matchTextSeq(["ENGINE_ATTRIBUTE"])?(this.match("eq"),R=new (0, _chunk2Z3O2CFMcjs.cb)({engineAttr:this.parseString()})):this.matchTextSeq(["SECONDARY_ENGINE_ATTRIBUTE"])&&(this.match("eq"),R=new (0, _chunk2Z3O2CFMcjs.cb)({secondaryEngineAttr:this.parseString()})),!R)break;S.push(R)}return this.expression(_chunk2Z3O2CFMcjs.Qc,{this:e,expressions:p,kind:t,indexType:r,options:S})}parseShowMysql(t,e={}){let{target:r=!1,full:p,global:S}=e,R=this.matchTextSeq(["JSON"]),D;r&&(typeof r=="string"&&this.matchTextSeq(r.split(" ")),D=this.parseIdVar());let rt=this.matchTextSeq(["IN"])?this.parseString():void 0,x,L;t==="BINLOG EVENTS"||t==="RELAYLOG EVENTS"?x=this.matchTextSeq(["FROM"])?this.parseNumber():void 0:this.match("from")?L=this.parseIdVar():this.match("dot")&&(L=D,D=this.parseIdVar());let k=this.matchTextSeq(["FOR","CHANNEL"])?this.parseIdVar():void 0,M=this.matchTextSeq(["LIKE"])?this.parseString():void 0,st=this.parseWhere(),H,v,_,b;t==="PROFILE"?(H=this.parseCsv(()=>this.parseVarFromOptions(T.PROFILE_TYPES)),v=this.matchTextSeq(["FOR","QUERY"])?this.parseNumber():void 0,_=this.matchTextSeq(["OFFSET"])?this.parseNumber():void 0,b=this.matchTextSeq(["LIMIT"])?this.parseNumber():void 0):[_,b]=this.parseOldstyleLimit();let B;this.matchTextSeq(["MUTEX"])&&(B=!0),this.matchTextSeq(["STATUS"])&&(B=!1);let it=this.matchTextSeq(["FOR","TABLE"])?this.parseIdVar():void 0,nt=this.matchTextSeq(["FOR","GROUP"])?this.parseString():void 0,Et=this.matchTextSeq(["FOR","USER"])?this.parseString():void 0,at=this.matchTextSeq(["FOR","ROLE"])?this.parseString():void 0,rs=this.matchTextSeq(["INTO","OUTFILE"])?this.parseString():void 0;return this.expression(_chunk2Z3O2CFMcjs.Ta,{this:t,target:D,full:p,log:rt,position:x,db:L,channel:k,like:M,where:st,types:H,query:v,offset:_,limit:b,mutex:B,forTable:it,forGroup:nt,forUser:Et,forRole:at,intoOutfile:rs,json:R,global:S})}parseOldstyleLimit(){let t,e;if(this.matchTextSeq(["LIMIT"])){let r=this.parseCsv(this.parseNumber.bind(this));r.length===1?t=r[0]:r.length===2&&(t=r[1],e=r[0])}return[e,t]}parseSetItemCharset(t){let e=this.parseString()||this.parseUnquotedField();return this.expression(_chunk2Z3O2CFMcjs.Ra,{this:e,kind:t})}parseSetItemNames(){let t=this.parseString()||this.parseUnquotedField(),e;return this.matchTextSeq(["COLLATE"])&&(e=this.parseString()||this.parseUnquotedField()),this.expression(_chunk2Z3O2CFMcjs.Ra,{this:t,collate:e,kind:"NAMES"})}parseType(t={}){let{parseInterval:e=!0,fallbackToIdentifier:r=!1}=t;if(this.match("binary",{advance:!1})){let p=this.parseTypes({checkFunc:!0,allowIdentifiers:!1});if(p instanceof _chunk2Z3O2CFMcjs.ac)return this.expression(_chunk2Z3O2CFMcjs.Cg,{this:this.parseColumn(),to:p})}return super.parseType({parseInterval:e,fallbackToIdentifier:r})}parseAlterTableAlterIndex(){let t=this.parseField({anyToken:!0}),e;return this.matchTextSeq(["VISIBLE"])?e=!0:this.matchTextSeq(["INVISIBLE"])&&(e=!1),this.expression(_chunk2Z3O2CFMcjs.$a,{this:t,visible:e})}parsePartitionProperty(){let t,e;if(this.matchTextSeq(["RANGE"])?(t=_chunk2Z3O2CFMcjs.xd,e=this.parsePartitionRangeValue.bind(this)):this.matchTextSeq(["LIST"])&&(t=_chunk2Z3O2CFMcjs.zd,e=this.parsePartitionListValue.bind(this)),!t||!e)return;let r=this.parseWrappedCsv(this.parseAssignment.bind(this));if(!this.matchTextSeq(["(","PARTITION"],{advance:!1}))return r;let p=this.parseWrappedCsv(e);return this.expression(t,{partitionExpressions:r,createExpressions:p})}parsePartitionRangeValue(){this.matchTextSeq(["PARTITION"]);let t=this.parseIdVar();if(!this.matchTextSeq(["VALUES","LESS","THAN"]))return t;let e=this.parseWrappedCsv(this.parseExpression.bind(this));e.length===1&&e[0]instanceof _chunk2Z3O2CFMcjs.Ic&&e[0].name.toUpperCase()==="MAXVALUE"&&(e=[new (0, _chunk2Z3O2CFMcjs.Ub)({this:"MAXVALUE"})]);let r=this.expression(_chunk2Z3O2CFMcjs.vb,{this:t,expressions:e});return this.expression(_chunk2Z3O2CFMcjs.ub,{expressions:[r]})}parsePartitionListValue(){this.matchTextSeq(["PARTITION"]);let t=this.parseIdVar();this.matchTextSeq(["VALUES","IN"]);let e=this.parseWrappedCsv(this.parseExpression.bind(this)),r=this.expression(_chunk2Z3O2CFMcjs.Kb,{this:t,expressions:e});return this.expression(_chunk2Z3O2CFMcjs.ub,{expressions:[r]})}parsePrimaryKey(t={}){let{wrappedOptional:e=!1,inProps:r=!1,namedPrimaryKey:p=!1}=t;return super.parsePrimaryKey({wrappedOptional:e,inProps:r,namedPrimaryKey:!0})}};u=_chunk2Z3O2CFMcjs.a.call(void 0, Gr),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"ID_VAR_TOKENS",Fr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"FUNC_TOKENS",qr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"CONJUNCTION",Br,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"DISJUNCTION",br,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"TABLE_ALIAS_TOKENS",Mr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"RANGE_PARSERS",Lr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"FUNCTIONS",Ur,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"FUNCTION_PARSERS",_r,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"STATEMENT_PARSERS",Dr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"PROPERTY_PARSERS",gr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"SET_PARSERS",Pr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"CONSTRAINT_PARSERS",mr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"ALTER_PARSERS",Cr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"ALTER_ALTER_PARSERS",xr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"SCHEMA_UNNAMED_CONSTRAINTS",dr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"PROFILE_TYPES",fr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"TYPE_TOKENS",Or,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"ENUM_TYPE_TOKENS",Nr,T),_chunk2Z3O2CFMcjs.d.call(void 0, u,10,"OPERATION_MODIFIERS",hr,T),_chunk2Z3O2CFMcjs.b.call(void 0, u,T),_chunk2Z3O2CFMcjs.c.call(void 0, u,3,T),T.SHOW_PARSERS={"BINARY LOGS":s("BINARY LOGS"),"MASTER LOGS":s("BINARY LOGS"),"BINLOG EVENTS":s("BINLOG EVENTS"),"CHARACTER SET":s("CHARACTER SET"),CHARSET:s("CHARACTER SET"),COLLATION:s("COLLATION"),"FULL COLUMNS":s("COLUMNS",{target:"FROM",full:!0}),COLUMNS:s("COLUMNS",{target:"FROM"}),"CREATE DATABASE":s("CREATE DATABASE",{target:!0}),"CREATE EVENT":s("CREATE EVENT",{target:!0}),"CREATE FUNCTION":s("CREATE FUNCTION",{target:!0}),"CREATE PROCEDURE":s("CREATE PROCEDURE",{target:!0}),"CREATE TABLE":s("CREATE TABLE",{target:!0}),"CREATE TRIGGER":s("CREATE TRIGGER",{target:!0}),"CREATE VIEW":s("CREATE VIEW",{target:!0}),DATABASES:s("DATABASES"),SCHEMAS:s("DATABASES"),ENGINE:s("ENGINE",{target:!0}),"STORAGE ENGINES":s("ENGINES"),ENGINES:s("ENGINES"),ERRORS:s("ERRORS"),EVENTS:s("EVENTS"),"FUNCTION CODE":s("FUNCTION CODE",{target:!0}),"FUNCTION STATUS":s("FUNCTION STATUS"),GRANTS:s("GRANTS",{target:"FOR"}),INDEX:s("INDEX",{target:"FROM"}),"MASTER STATUS":s("MASTER STATUS"),"OPEN TABLES":s("OPEN TABLES"),PLUGINS:s("PLUGINS"),"PROCEDURE CODE":s("PROCEDURE CODE",{target:!0}),"PROCEDURE STATUS":s("PROCEDURE STATUS"),PRIVILEGES:s("PRIVILEGES"),"FULL PROCESSLIST":s("PROCESSLIST",{full:!0}),PROCESSLIST:s("PROCESSLIST"),PROFILE:s("PROFILE"),PROFILES:s("PROFILES"),"RELAYLOG EVENTS":s("RELAYLOG EVENTS"),REPLICAS:s("REPLICAS"),"SLAVE HOSTS":s("REPLICAS"),"REPLICA STATUS":s("REPLICA STATUS"),"SLAVE STATUS":s("REPLICA STATUS"),"GLOBAL STATUS":s("STATUS",{global:!0}),"SESSION STATUS":s("STATUS"),STATUS:s("STATUS"),"TABLE STATUS":s("TABLE STATUS"),"FULL TABLES":s("TABLES",{full:!0}),TABLES:s("TABLES"),TRIGGERS:s("TRIGGERS"),"GLOBAL VARIABLES":s("VARIABLES",{global:!0}),"SESSION VARIABLES":s("VARIABLES"),VARIABLES:s("VARIABLES"),WARNINGS:s("WARNINGS")},T.LOG_DEFAULTS_TO_LN=!0,T.STRING_ALIASES=!0,T.VALUES_FOLLOWED_BY_PAREN=!1,T.SUPPORTS_PARTITION_SELECTION=!0;var wt=T,wr,Yr,yr,Vr,Kr,kr,Hr,vr,$r,Wr,Xr,Jr,Zr,N,i=class i extends(Zr=_chunk2Z3O2CFMcjs.lp,Jr=[_chunk2Z3O2CFMcjs.r],Xr=[_chunk2Z3O2CFMcjs.r],Wr=[_chunk2Z3O2CFMcjs.r],$r=[_chunk2Z3O2CFMcjs.r],vr=[_chunk2Z3O2CFMcjs.r],Hr=[_chunk2Z3O2CFMcjs.r],kr=[_chunk2Z3O2CFMcjs.r],Kr=[_chunk2Z3O2CFMcjs.r],Vr=[_chunk2Z3O2CFMcjs.r],yr=[_chunk2Z3O2CFMcjs.r],Yr=[_chunk2Z3O2CFMcjs.r],wr=[_chunk2Z3O2CFMcjs.r],Zr){static get AFTER_HAVING_MODIFIER_TRANSFORMS(){let t=new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);return["cluster","distribute","sort"].forEach(e=>t.delete(e)),t}static get NULL_ORDERING_SUPPORTED(){return"unsupported"}static get ORIGINAL_TRANSFORMS(){return new Map([..._chunk2Z3O2CFMcjs.lp.TRANSFORMS,[_chunk2Z3O2CFMcjs.Nm,_chunk2Z3O2CFMcjs.pp.call(void 0, "GROUP_CONCAT")],[_chunk2Z3O2CFMcjs.om,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_AND")],[_chunk2Z3O2CFMcjs.pm,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_OR")],[_chunk2Z3O2CFMcjs.qm,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_XOR")],[_chunk2Z3O2CFMcjs.tf,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_COUNT")],[_chunk2Z3O2CFMcjs.Kg,function(t){return this.chrSql(t,{name:"CHAR"})}],[_chunk2Z3O2CFMcjs.$g,_chunk2Z3O2CFMcjs.wp],[_chunk2Z3O2CFMcjs.Yg,_chunk2Z3O2CFMcjs.pp.call(void 0, "VERSION")],[_chunk2Z3O2CFMcjs.xh,f(function(t){return this.func("DATEDIFF",[t.args.this,t.args.expression])},["this","expression"])],[_chunk2Z3O2CFMcjs.uh,f(Ft("ADD"))],[_chunk2Z3O2CFMcjs.ji,_chunk2Z3O2CFMcjs.Xp],[_chunk2Z3O2CFMcjs.wh,f(Ft("SUB"))],[_chunk2Z3O2CFMcjs.yh,is],[_chunk2Z3O2CFMcjs.mi,f()],[_chunk2Z3O2CFMcjs.Hh,f(_chunk2Z3O2CFMcjs.pp.call(void 0, "DAYOFMONTH"))],[_chunk2Z3O2CFMcjs.Fh,f(_chunk2Z3O2CFMcjs.pp.call(void 0, "DAYOFWEEK"))],[_chunk2Z3O2CFMcjs.Ih,f(_chunk2Z3O2CFMcjs.pp.call(void 0, "DAYOFYEAR"))],[_chunk2Z3O2CFMcjs.in,function(t){return`GROUP_CONCAT(${this.sql(t,"this")} SEPARATOR ${this.sql(t,"separator")||"','"})`}],[_chunk2Z3O2CFMcjs.Ie,_chunk2Z3O2CFMcjs.vp],[_chunk2Z3O2CFMcjs.wj,_chunk2Z3O2CFMcjs.sp],[_chunk2Z3O2CFMcjs.Oj,_chunk2Z3O2CFMcjs.Pq],[_chunk2Z3O2CFMcjs.qn,_chunk2Z3O2CFMcjs.pp.call(void 0, "MAX")],[_chunk2Z3O2CFMcjs.rn,_chunk2Z3O2CFMcjs.pp.call(void 0, "MIN")],[_chunk2Z3O2CFMcjs.sn,_chunk2Z3O2CFMcjs.$p],[_chunk2Z3O2CFMcjs.vn,_chunk2Z3O2CFMcjs._p],[_chunk2Z3O2CFMcjs.kk,f()],[_chunk2Z3O2CFMcjs.De,function(t){return this.binary(t,"<=>")}],[_chunk2Z3O2CFMcjs.Ee,function(t){return`NOT ${this.binary(t,"<=>")}`}],[_chunk2Z3O2CFMcjs.Al,_chunk2Z3O2CFMcjs.pp.call(void 0, "FORMAT")],[_chunk2Z3O2CFMcjs.Yb,_chunk2Z3O2CFMcjs.zp],[_chunk2Z3O2CFMcjs.Wd,_chunk2Z3O2CFMcjs.Po.call(void 0, [_chunk2Z3O2CFMcjs.So,_chunk2Z3O2CFMcjs.bp,_chunk2Z3O2CFMcjs.To,_chunk2Z3O2CFMcjs.cp,_chunk2Z3O2CFMcjs.Qo])],[_chunk2Z3O2CFMcjs.tl,function(t){return _chunk2Z3O2CFMcjs.Ep.call(this,t,{funcName:"LOCATE",supportsPosition:!0})}],[_chunk2Z3O2CFMcjs.wl,Gt],[_chunk2Z3O2CFMcjs.xl,Gt],[_chunk2Z3O2CFMcjs.El,_chunk2Z3O2CFMcjs.pp.call(void 0, "INSERT")],[_chunk2Z3O2CFMcjs.qh,()=>"SESSION_USER()"],[_chunk2Z3O2CFMcjs.Wb,_chunk2Z3O2CFMcjs.yp],[_chunk2Z3O2CFMcjs.ii,_chunk2Z3O2CFMcjs.pp.call(void 0, "MAKETIME")],[_chunk2Z3O2CFMcjs._h,_chunk2Z3O2CFMcjs.Pp.call(void 0, "DATE","ADD")],[_chunk2Z3O2CFMcjs.ai,function(t){return this.func("TIMESTAMPDIFF",[_chunk2Z3O2CFMcjs.vq.call(void 0, t),t.args.expression,t.args.this])}],[_chunk2Z3O2CFMcjs.$h,_chunk2Z3O2CFMcjs.Pp.call(void 0, "DATE","SUB")],[_chunk2Z3O2CFMcjs.Ll,_chunk2Z3O2CFMcjs.pp.call(void 0, "UNIX_TIMESTAMP")],[_chunk2Z3O2CFMcjs.Kl,function(t){return _chunk2Z3O2CFMcjs.Wp.call(this,t,{includePrecision:!t.args.zone})}],[_chunk2Z3O2CFMcjs.Hl,f(function(t){return this.func("DATE_FORMAT",[t.args.this,this.formatTime(t)])})],[_chunk2Z3O2CFMcjs.Ml,_chunk2Z3O2CFMcjs.bq],[_chunk2Z3O2CFMcjs.Vk,_chunk2Z3O2CFMcjs.pp.call(void 0, "TRUNCATE")],[_chunk2Z3O2CFMcjs.bn,_chunk2Z3O2CFMcjs.Ap],[_chunk2Z3O2CFMcjs.Nl,Ft("ADD")],[_chunk2Z3O2CFMcjs.Ol,function(t){return this.func("DATEDIFF",[t.args.this,t.args.expression])}],[_chunk2Z3O2CFMcjs.Pl,Ts],[_chunk2Z3O2CFMcjs.Vl,function(t){return`ORD(CONVERT(${this.sql(t.args.this)} USING utf32))`}],[_chunk2Z3O2CFMcjs.Zl,os],[_chunk2Z3O2CFMcjs.hm,f()],[_chunk2Z3O2CFMcjs.Lh,f(_chunk2Z3O2CFMcjs.pp.call(void 0, "WEEKOFYEAR"))],[_chunk2Z3O2CFMcjs.km,f()],[_chunk2Z3O2CFMcjs.th,_chunk2Z3O2CFMcjs.pp.call(void 0, "UTC_TIMESTAMP")],[_chunk2Z3O2CFMcjs.sh,_chunk2Z3O2CFMcjs.pp.call(void 0, "UTC_TIME")]])}static get UNSIGNED_TYPE_MAPPING(){return new Map([["ubigint","BIGINT"],["uint","INT"],["umediumint","MEDIUMINT"],["usmallint","SMALLINT"],["utinyint","TINYINT"],["udecimal","DECIMAL"],["udouble","DOUBLE"]])}static get TIMESTAMP_TYPE_MAPPING(){return new Map([["datetime2","DATETIME"],["smalldatetime","DATETIME"],["timestamp","DATETIME"],["timestampntz","DATETIME"],["timestamptz","TIMESTAMP"],["timestampltz","TIMESTAMP"]])}static get TYPE_MAPPING(){let t=new Map(_chunk2Z3O2CFMcjs.lp.TYPE_MAPPING);for(let[e,r]of i.UNSIGNED_TYPE_MAPPING)t.set(e,r);for(let[e,r]of i.TIMESTAMP_TYPE_MAPPING)t.set(e,r);return t.delete("mediumtext"),t.delete("longtext"),t.delete("tinytext"),t.delete("blob"),t.delete("mediumblob"),t.delete("longblob"),t.delete("tinyblob"),t}static get PROPERTIES_LOCATION(){let t=new Map(_chunk2Z3O2CFMcjs.lp.PROPERTIES_LOCATION);return t.set(_chunk2Z3O2CFMcjs.Md,"unsupported"),t.set(_chunk2Z3O2CFMcjs.Od,"unsupported"),t.set(_chunk2Z3O2CFMcjs.ud,"unsupported"),t.set(_chunk2Z3O2CFMcjs.xd,"postSchema"),t.set(_chunk2Z3O2CFMcjs.zd,"postSchema"),t}static get CHAR_CAST_MAPPING(){return["longtext","longblob","mediumblob","mediumtext","text","tinyblob","tinytext","varchar"].reduce((t,e)=>({...t,[e]:"CHAR"}),{})}static get SIGNED_CAST_MAPPING(){return["bigint","boolean","int","smallint","tinyint","mediumint"].reduce((t,e)=>({...t,[e]:"SIGNED"}),{})}static get CAST_MAPPING(){return{...i.CHAR_CAST_MAPPING,...i.SIGNED_CAST_MAPPING,ubigint:"UNSIGNED"}}static get TIMESTAMP_FUNC_TYPES(){return new Set(["timestamptz","timestampltz"])}static get RESERVED_KEYWORDS(){return new Set(["accessible","add","all","alter","analyze","and","as","asc","asensitive","before","between","bigint","binary","blob","both","by","call","cascade","case","change","char","character","check","collate","column","condition","constraint","continue","convert","create","cross","cube","cume_dist","current_date","current_time","current_timestamp","current_user","cursor","database","databases","day_hour","day_microsecond","day_minute","day_second","dec","decimal","declare","default","delayed","delete","dense_rank","desc","describe","deterministic","distinct","distinctrow","div","double","drop","dual","each","else","elseif","empty","enclosed","escaped","except","exists","exit","explain","false","fetch","first_value","float","float4","float8","for","force","foreign","from","fulltext","function","generated","get","grant","group","grouping","groups","having","high_priority","hour_microsecond","hour_minute","hour_second","if","ignore","in","index","infile","inner","inout","insensitive","insert","int","int1","int2","int3","int4","int8","integer","intersect","interval","into","io_after_gtids","io_before_gtids","is","iterate","join","json_table","key","keys","kill","lag","last_value","lateral","lead","leading","leave","left","like","limit","linear","lines","load","localtime","localtimestamp","lock","long","longblob","longtext","loop","low_priority","master_bind","master_ssl_verify_server_cert","match","maxvalue","mediumblob","mediumint","mediumtext","middleint","minute_microsecond","minute_second","mod","modifies","natural","not","no_write_to_binlog","nth_value","ntile","undefined","numeric","of","on","optimize","optimizer_costs","option","optionally","or","order","out","outer","outfile","over","partition","percent_rank","precision","primary","procedure","purge","range","rank","read","reads","read_write","real","recursive","references","regexp","release","rename","repeat","replace","require","resignal","restrict","return","revoke","right","rlike","row","rows","row_number","schema","schemas","second_microsecond","select","sensitive","separator","set","show","signal","smallint","spatial","specific","sql","sqlexception","sqlstate","sqlwarning","sql_big_result","sql_calc_found_rows","sql_small_result","ssl","starting","stored","straight_join","system","table","terminated","then","tinyblob","tinyint","tinytext","to","trailing","trigger","true","undo","union","unique","unlock","unsigned","update","usage","use","using","utc_date","utc_time","utc_timestamp","values","varbinary","varchar","varcharacter","varying","virtual","when","where","while","window","with","write","xor","year_month","zerofill"])}computedColumnConstraintSql(t){let e=t.args.persisted?"STORED":"VIRTUAL";return`GENERATED ALWAYS AS (${this.sql(_optionalChain([t, 'access', _10 => _10.args, 'access', _11 => _11.this, 'optionalAccess', _12 => _12.unnest, 'call', _13 => _13()]))}) ${e}`}arraySql(t){return this.unsupported("Arrays are not supported by MySQL"),this.functionFallbackSql(t)}arrayContainsAllSql(t){return this.unsupported("Array operations are not supported by MySQL"),this.functionFallbackSql(t)}dpipeSql(t){return this.func("CONCAT",[...t.flatten()])}extractSql(t){let e=t.name;return e&&e.toLowerCase()==="epoch"?this.func("UNIX_TIMESTAMP",[t.args.expression]):super.extractSql(t)}dataTypeSql(t){if(this.constructor.VARCHAR_REQUIRES_SIZE&&t.isType("varchar")&&!_optionalChain([t, 'access', _14 => _14.args, 'access', _15 => _15.expressions, 'optionalAccess', _16 => _16.length]))return"TEXT";let e=super.dataTypeSql(t);return i.UNSIGNED_TYPE_MAPPING.has(t.args.this)&&(e=`${e} UNSIGNED`),e}jsonArrayContainsSql(t){return`${this.sql(t,"this")} MEMBER OF(${this.sql(t,"expression")})`}castSql(t,e={}){let r=t.args.to;if(r instanceof _chunk2Z3O2CFMcjs.ac){let p=r.args.this;if(this._constructor.TIMESTAMP_FUNC_TYPES.has(p))return this.func("TIMESTAMP",[t.args.this]);let S=this._constructor.CAST_MAPPING[p];S&&r.setArgKey("this",S)}return super.castSql(t)}showSql(t){let e=` ${t.name}`,r=t.args.full?" FULL":"",p=t.args.global?" GLOBAL":"",S=this.sql(t,"target");S=S?` ${S}`:"",["COLUMNS","INDEX"].includes(t.name)?S=` FROM${S}`:t.name==="GRANTS"?S=` FOR${S}`:["LINKS","PARTITIONS"].includes(t.name)?S=S?` ON${S}`:"":t.name==="PROJECTIONS"&&(S=S?` ON TABLE${S}`:"");let R=this.prefixedSql("FROM",t,"db"),D=this.prefixedSql("LIKE",t,"like"),rt=this.sql(t,"where"),x=this.expressions(t,{key:"types"});x=x&&` ${x}`;let L=this.prefixedSql("FOR QUERY",t,"query"),k="",M="";t.name==="PROFILE"?(k=this.prefixedSql("OFFSET",t,"offset"),M=this.prefixedSql("LIMIT",t,"limit")):M=this.oldStyleLimitSql(t);let st=this.prefixedSql("IN",t,"log"),H=this.prefixedSql("FROM",t,"position"),v=this.prefixedSql("FOR CHANNEL",t,"channel"),_="";t.name==="ENGINE"&&(_=t.args.mutex?" MUTEX":" STATUS");let b=this.prefixedSql("FOR TABLE",t,"forTable"),B=this.prefixedSql("FOR GROUP",t,"forGroup"),it=this.prefixedSql("FOR USER",t,"forUser"),nt=this.prefixedSql("FOR ROLE",t,"forRole"),Et=this.prefixedSql("INTO OUTFILE",t,"intoOutfile"),at=t.args.json?" JSON":"";return`SHOW${r}${p}${e}${at}${S}${b}${x}${R}${L}${st}${H}${v}${_}${D}${rt}${k}${M}${B}${it}${nt}${Et}`}alterRenameSql(t,e={}){return super.alterRenameSql(t,{includeTo:!1})}alterColumnSql(t){let e=this.sql(t,"dtype");return e?`MODIFY COLUMN ${this.sql(t,"this")} ${e}`:super.alterColumnSql(t)}prefixedSql(t,e,r){let p=this.sql(e,r);return p?` ${t} ${p}`:""}oldStyleLimitSql(t){let e=this.sql(t,"limit"),r=this.sql(t,"offset");return e?` LIMIT ${r?`${r}, ${e}`:e}`:""}timestampTruncSql(t){let e=t.args.unit,r="'0000-01-01 00:00:00'",p=_chunk2Z3O2CFMcjs.Mp.call(void 0, (0, _chunk2Z3O2CFMcjs.ai))([e,new (0, _chunk2Z3O2CFMcjs.$c)({this:r,isString:!0}),t.args.this]),S=new (0, _chunk2Z3O2CFMcjs.fe)({this:p,unit:e}),R=_chunk2Z3O2CFMcjs.Np.call(void 0, (0, _chunk2Z3O2CFMcjs.uh))([new (0, _chunk2Z3O2CFMcjs.$c)({this:r,isString:!0}),S]);return this.sql(R)}convertTimezoneSql(t){let e=t.args.sourceTz,r=t.args.targetTz,p=t.args.timestamp;return this.func("CONVERT_TZ",[p,e,r])}attimezoneSql(t){return this.unsupported("AT TIME ZONE is not supported by MySQL"),this.sql(t.args.this)}isasciiSql(t){return`REGEXP_LIKE(${this.sql(t.args.this)}, '^[[:ascii:]]*$')`}ignoreNullsSql(t){return this.unsupported("MySQL does not support IGNORE NULLS."),this.sql(t.args.this)}currentSchemaSql(t){return _chunk2Z3O2CFMcjs.kp.call(this,t,"this"),this.func("SCHEMA",[])}partitionSql(t){let e=t.parent;return e instanceof _chunk2Z3O2CFMcjs.xd||e instanceof _chunk2Z3O2CFMcjs.zd?this.expressions(t,{flat:!0}):super.partitionSql(t)}partitionByRangeOrListSql(t,e){let r=this.expressions(t,{key:"partitionExpressions",flat:!0}),p=this.expressions(t,{key:"createExpressions",flat:!0});return`PARTITION BY ${e} (${r}) (${p})`}partitionByRangePropertySql(t){return this.partitionByRangeOrListSql(t,"RANGE")}partitionByListPropertySql(t){return this.partitionByRangeOrListSql(t,"LIST")}partitionListSql(t){let e=this.sql(t,"this"),r=this.expressions(t,{flat:!0});return`PARTITION ${e} VALUES IN (${r})`}partitionRangeSql(t){let e=this.sql(t,"this"),r=this.expressions(t,{flat:!0});return`PARTITION ${e} VALUES LESS THAN (${r})`}};N=_chunk2Z3O2CFMcjs.a.call(void 0, Zr),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"AFTER_HAVING_MODIFIER_TRANSFORMS",Jr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"NULL_ORDERING_SUPPORTED",Xr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"ORIGINAL_TRANSFORMS",Wr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"UNSIGNED_TYPE_MAPPING",$r,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"TIMESTAMP_TYPE_MAPPING",vr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"TYPE_MAPPING",Hr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"PROPERTIES_LOCATION",kr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"CHAR_CAST_MAPPING",Kr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"SIGNED_CAST_MAPPING",Vr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"CAST_MAPPING",yr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"TIMESTAMP_FUNC_TYPES",Yr,i),_chunk2Z3O2CFMcjs.d.call(void 0, N,10,"RESERVED_KEYWORDS",wr,i),_chunk2Z3O2CFMcjs.b.call(void 0, N,i),_chunk2Z3O2CFMcjs.c.call(void 0, N,3,i),i.SUPPORTS_DECODE_CASE=!1,i.SELECT_KINDS=[],i.TRY_SUPPORTED=!1,i.SUPPORTS_UESCAPE=!1,i.INTERVAL_ALLOWS_PLURAL_FORM=!1,i.LOCKING_READS_SUPPORTED=!0,i.JOIN_HINTS=!1,i.TABLE_HINTS=!0,i.DUPLICATE_KEY_UPDATE_WITH_SET=!1,i.QUERY_HINT_SEP=" ",i.VALUES_AS_TABLE=!1,i.NVL2_SUPPORTED=!1,i.LAST_DAY_SUPPORTS_DATE_PART=!1,i.JSON_TYPE_REQUIRED_FOR_EXTRACTION=!0,i.JSON_PATH_BRACKETED_KEY_SUPPORTED=!1,i.JSON_KEY_VALUE_PAIR_SEP=",",i.SUPPORTS_TO_NUMBER=!1,i.PARSE_JSON_NAME=void 0,i.PAD_FILL_PATTERN_IS_REQUIRED=!0,i.WRAP_DERIVED_VALUES=!1,i.VARCHAR_REQUIRES_SIZE=!0,i.SUPPORTS_MEDIAN=!1,i.UPDATE_STATEMENT_SUPPORTS_FROM=!1,i.SUPPORTS_CONVERT_TIMEZONE=!0,i.LIMIT_FETCH="LIMIT",i.LIMIT_ONLY_LITERALS=!0;var Yt=i,zr,jr,Qr,ts,es,U,l= exports.j =class extends(es=_chunk2Z3O2CFMcjs.op,ts=[_chunk2Z3O2CFMcjs.r],Qr=[_chunk2Z3O2CFMcjs.r],jr=[_chunk2Z3O2CFMcjs.r],zr=[_chunk2Z3O2CFMcjs.r],es){static get NORMALIZATION_STRATEGY(){return"caseSensitive"}static get EXPRESSION_METADATA(){return new Map(g.EXPRESSION_METADATA)}static get TIME_MAPPING(){return{"%M":"%B","%c":"%-m","%e":"%-d","%h":"%I","%i":"%M","%s":"%S","%u":"%W","%k":"%-H","%l":"%-I","%T":"%H:%M:%S","%W":"%A"}}static get VALID_INTERVAL_UNITS(){return new Set([..._chunk2Z3O2CFMcjs.op.VALID_INTERVAL_UNITS,"SECOND_MICROSECOND","MINUTE_MICROSECOND","MINUTE_SECOND","HOUR_MICROSECOND","HOUR_SECOND","HOUR_MINUTE","DAY_MICROSECOND","DAY_SECOND","DAY_MINUTE","DAY_HOUR","YEAR_MONTH"])}};U=_chunk2Z3O2CFMcjs.a.call(void 0, es),_chunk2Z3O2CFMcjs.d.call(void 0, U,10,"NORMALIZATION_STRATEGY",ts,l),_chunk2Z3O2CFMcjs.d.call(void 0, U,10,"EXPRESSION_METADATA",Qr,l),_chunk2Z3O2CFMcjs.d.call(void 0, U,10,"TIME_MAPPING",jr,l),_chunk2Z3O2CFMcjs.d.call(void 0, U,10,"VALID_INTERVAL_UNITS",zr,l),_chunk2Z3O2CFMcjs.b.call(void 0, U,l),_chunk2Z3O2CFMcjs.c.call(void 0, U,3,l),l.DIALECT_NAME="mysql",l.PROMOTE_TO_INFERRED_DATETIME_TYPE=!0,l.IDENTIFIERS_CAN_START_WITH_DIGIT=!0,l.TIME_FORMAT="'%Y-%m-%d %T'",l.DPIPE_IS_STRING_CONCAT=!1,l.SUPPORTS_USER_DEFINED_TYPES=!1,l.SUPPORTS_SEMI_ANTI_JOIN=!1,l.SAFE_DIVISION=!0,l.SAFE_TO_ELIMINATE_DOUBLE_NEGATION=!1,l.LEAST_GREATEST_IGNORES_NULLS=!1,l.Tokenizer=O,l.Parser=wt,l.Generator=Yt;_chunk2Z3O2CFMcjs.op.register("mysql",l);exports.a = s; exports.b = is; exports.c = ns; exports.d = as; exports.e = Gt; exports.f = os; exports.g = Ft; exports.h = Ts; exports.i = f; exports.j = l;
2
+ //# sourceMappingURL=chunk-R7C3ZHVK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/huydna/projects/sqlingo.js/dist/chunk-R7C3ZHVK.cjs","../src/typing/mysql.ts","../src/dialects/mysql.ts"],"names":["_EXPRESSION_METADATA_dec","_init","cache","MySQLTyping","map","DialectTyping","extend","types","data","type","Atan2Expr","DegreesExpr","CurrentVersionExpr","EltExpr","DayOfMonthExpr","DayOfWeekExpr","DayOfYearExpr","MonthExpr","SecondExpr","WeekExpr","LocaltimeExpr","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","showParser","thisArg","options","dateTruncSql","expression","expr","unit","concat","dateFormat"],"mappings":"AAAA,qoBAAosC,ICApsCA,EAAAA,CAAAC,EAAAA,CA8BED,EAAAA,CAAA,CAACE,mBAAAA,CAAAA,CADI,IAAMC,CAAAA,CAAN,KAAkB,CAEvB,OAAA,IAAW,mBAAA,CAAA,CAA2C,CAEpD,IAAMC,CAAAA,CAA0B,IAAI,GAAA,CAAIC,oBAAAA,CAAc,mBAAmB,CAAA,CAEnEC,CAAAA,CAAS,CAACC,CAAAA,CAA8BC,CAAAA,CAAAA,EAAkC,CAC9E,GAAA,CAAA,IAAWC,EAAAA,GAAQF,CAAAA,CAAOH,CAAAA,CAAI,GAAA,CAAIK,CAAAA,CAAMD,CAAI,CAC9C,CAAA,CAEA,OAAAF,CAAAA,CAAO,CACLI,oBAAAA,CACAC,oBACF,CAAA,CAAG,CACD,OAAA,CAAA,QACF,CAAC,CAAA,CAEDL,CAAAA,CAAO,CACLM,oBAAAA,CACAC,oBACF,CAAA,CAAG,CACD,OAAA,CAAA,SACF,CAAC,CAAA,CAEDP,CAAAA,CAAO,CACLQ,oBAAAA,CACAC,oBAAAA,CACAC,oBAAAA,CACAC,oBAAAA,CACAC,oBAAAA,CACAC,oBACF,CAAA,CAAG,CACD,OAAA,CAAA,KACF,CAAC,CAAA,CAEDf,CAAAA,CAAI,GAAA,CAAIgB,oBAAAA,CAAe,CACrB,OAAA,CAAA,UACF,CAAC,CAAA,CAEMhB,CACT,CACF,CAAA,CAzCOH,EAAAA,CAAAoB,iCAAAA,IAAA,CAAA,CAELC,iCAAAA,EAAArB,CAAA,EAAA,CAAW,qBAAA,CADXD,EAAAA,CADWG,CAAAA,CAAAA,CAANoB,iCAAAA,EAAAtB,CAAME,CAAAA,CAAAA,CAANqB,iCAAAA,EAAAvB,CAAA,CAAA,CAAME,CAAAA,CAAAA,CC2IN,SAASsB,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CAII,CAAC,CAAA,CACuB,CAC5B,OAAO,QAAA,CAAA,CAAkC,CACvC,OAAQ,IAAA,CAAqB,cAAA,CAAeD,CAAAA,CAASC,CAAO,CAC9D,CACF,CASO,SAASC,EAAAA,CAA+BC,CAAAA,CAAmC,CAChF,IAAMC,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAY,MAAM,CAAA,CAClCE,CAAAA,CAAOF,CAAAA,CAAW,IAAA,CAAK,MAAM,CAAA,CAAE,WAAA,CAAY,CAAA,CAE7CG,CAAAA,CACAC,CAAAA,CAEJ,EAAA,CAAIF,CAAAA,GAAS,MAAA,CACXC,CAAAA,CAAS,CAAA,YAAA,EAAeF,CAAI,CAAA,aAAA,EAAgBA,CAAI,CAAA,WAAA,CAAA,CAChDG,CAAAA,CAAa,UAAA,CAAA,KAAA,EAAA,CACJF,CAAAA,GAAS,OAAA,CAClBC,CAAAA,CAAS,CAAA,YAAA,EAAeF,CAAI,CAAA,cAAA,EAAiBA,CAAI,CAAA,QAAA,CAAA,CACjDG,CAAAA,CAAa,UAAA,CAAA,KAAA,EAAA,CACJF,CAAAA,GAAS,SAAA,CAClBC,CAAAA,CAAS,CAAA,YAAA,EAAeF,CAAI,CAAA,gBAAA,EAAmBA,CAAI,CAAA,gBAAA,CAAA,CACnDG,CAAAA,CAAa,UAAA,CAAA,KAAA,EAAA,CACJF,CAAAA,GAAS,MAAA,CAClBC,CAAAA,CAAS,CAAA,YAAA,EAAeF,CAAI,CAAA,UAAA,CAAA,CAC5BG,CAAAA,CAAa,UAAA,CAAA,KAEb,OAAIF,CAAAA,GAAS,KAAA,EACX,IAAA,CAAK,WAAA,CAAY,CAAA,0BAAA,EAA6BA,CAAI,CAAA,CAAA","file":"/home/huydna/projects/sqlingo.js/dist/chunk-R7C3ZHVK.cjs","sourcesContent":[null,"import type {\n Expression,\n} from '../expressions/expressions';\nimport {\n cache,\n} from '../port_internals';\nimport {\n DataTypeExprKind,\n} from '../expressions/types';\nimport {\n Atan2Expr,\n DegreesExpr,\n CurrentVersionExpr,\n EltExpr,\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfYearExpr,\n MonthExpr,\n SecondExpr,\n WeekExpr,\n LocaltimeExpr,\n} from '../expressions/expressions';\nimport type {\n ExpressionMetadata,\n} from './dialect';\nimport {\n DialectTyping,\n} from './dialect';\n\nexport class MySQLTyping {\n @cache\n static get EXPRESSION_METADATA (): ExpressionMetadata {\n // Clone the base metadata to apply dialect-specific overrides\n const map: ExpressionMetadata = new Map(DialectTyping.EXPRESSION_METADATA);\n\n const extend = (types: (typeof Expression)[], data: Record<string, unknown>) => {\n for (const type of types) map.set(type, data);\n };\n\n extend([\n Atan2Expr,\n DegreesExpr,\n ], {\n returns: DataTypeExprKind.DOUBLE,\n });\n\n extend([\n CurrentVersionExpr,\n EltExpr,\n ], {\n returns: DataTypeExprKind.VARCHAR,\n });\n\n extend([\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfYearExpr,\n MonthExpr,\n SecondExpr,\n WeekExpr,\n ], {\n returns: DataTypeExprKind.INT,\n });\n\n map.set(LocaltimeExpr, {\n returns: DataTypeExprKind.DATETIME,\n });\n\n return map;\n }\n}\n","import {\n cache,\n} from '../port_internals';\nimport {\n Generator, unsupportedArgs,\n} from '../generator';\nimport type {\n GeneratedAsRowColumnConstraintExpr, PrimaryKeyColumnConstraintExpr, PrimaryKeyExpr,\n ArrayExpr,\n ArrayContainsAllExpr,\n DPipeExpr,\n ExtractExpr,\n TimestampTruncExpr,\n AtTimeZoneExpr,\n IsAsciiExpr,\n IgnoreNullsExpr,\n AlterRenameExpr,\n AlterColumnExpr,\n FuncExpr,\n} from '../expressions';\nimport {\n AlterIndexExpr, ColumnExpr, PartitionExpr, PartitionListExpr, PartitionRangeExpr,\n BitwiseAndAggExpr,\n BitwiseCountExpr,\n BitwiseOrAggExpr,\n BitwiseXorAggExpr,\n ConvertTimezoneExpr,\n CurrentDateExpr,\n DateTruncExpr,\n EqExpr,\n JsonArrayContainsExpr,\n ShowExpr,\n SoundexExpr,\n TimeToStrExpr,\n TsOrDsToDateExpr,\n Expression,\n StrToDateExpr,\n StrToTimeExpr,\n UnixToTimeExpr,\n CastExpr,\n MaxExpr,\n MinExpr,\n StrPositionExpr,\n DateAddExpr,\n DateSubExpr,\n DataTypeExpr,\n DataTypeExprKind,\n LiteralExpr,\n TryCastExpr,\n TableSampleExpr,\n PivotExpr,\n ILikeExpr,\n DivExpr,\n func,\n AndExpr,\n XorExpr,\n OrExpr,\n DayExpr,\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfYearExpr,\n NumberToStrExpr,\n LengthExpr,\n TimeFromPartsExpr,\n MonthExpr,\n CurrentSchemaExpr,\n TimestampDiffExpr,\n DateDiffExpr,\n VarExpr,\n CurrentVersionExpr,\n WeekExpr,\n WeekOfYearExpr,\n YearExpr,\n AnonymousExpr,\n SetItemExpr,\n LockPropertyExpr,\n PartitionByRangePropertyExpr,\n PartitionByListPropertyExpr,\n SetItemExprKind,\n ZeroFillColumnConstraintExpr,\n GeneratedAsIdentityColumnConstraintExpr,\n ComputedColumnConstraintExpr,\n ColumnPrefixExpr,\n IndexColumnConstraintExpr,\n IndexConstraintOptionExpr,\n ArrayAggExpr,\n ChrExpr,\n IntervalExpr,\n PropertiesLocation,\n TransientPropertyExpr,\n VolatilePropertyExpr,\n PartitionedByPropertyExpr,\n SelectExpr,\n GroupConcatExpr,\n LogicalOrExpr,\n LogicalAndExpr,\n NullSafeEqExpr,\n NullSafeNeqExpr,\n JsonExtractScalarExpr,\n StuffExpr,\n SessionUserExpr,\n TimestampAddExpr,\n TimestampSubExpr,\n TimeStrToUnixExpr,\n TimeStrToTimeExpr,\n TrimExpr,\n TruncExpr,\n TsOrDsAddExpr,\n TsOrDsDiffExpr,\n UnicodeExpr,\n UtcTimestampExpr,\n UtcTimeExpr,\n DateStrToDateExpr,\n} from '../expressions';\nimport {\n type ExpressionMetadata,\n} from '../typing/dialect';\nimport {\n MySQLTyping,\n} from '../typing/mysql';\nimport type {\n TokenPair,\n} from '../tokens';\nimport {\n Tokenizer, TokenType,\n} from '../tokens';\nimport {\n seqGet,\n} from '../helper';\nimport {\n Parser,\n} from '../parser';\nimport {\n eliminateDistinctOn, eliminateFullOuterJoin, eliminateQualify, eliminateSemiAndAntiJoins, preprocess, unnestGenerateDateArrayUsingRecursiveCte,\n} from '../transforms';\nimport {\n isnullToIsNull,\n lengthOrCharLengthSql,\n maxOrGreatest,\n minOrLeast,\n noIlikeSql,\n noParenCurrentDateSql,\n noPivotSql,\n noTablesampleSql,\n noTrycastSql,\n strPositionSql,\n trimSql,\n arrowJsonExtractSql,\n dateAddIntervalSql,\n dateStrToDateSql,\n timeStrToTimeSql,\n unitToVar,\n renameFunc,\n NormalizationStrategy,\n Dialect,\n buildDateDeltaWithInterval,\n Dialects,\n buildFormattedTime,\n buildDateDelta,\n NullOrderingSupported,\n} from './dialect';\n\n/**\n * A higher-order function that returns a parser for MySQL SHOW statements.\n * @param args - Arguments to pass to the internal MySQL SHOW parser.\n * @param kwargs - Keyword arguments to pass to the internal MySQL SHOW parser.\n * @returns A function that takes a MySQL Parser and returns a ShowExpr.\n */\nexport function showParser (\n thisArg: string,\n options: {\n target?: boolean | string;\n full?: boolean;\n global?: boolean;\n } = {},\n): (this: Parser) => ShowExpr {\n return function (this: Parser): ShowExpr {\n return (this as MySQLParser).parseShowMysql(thisArg, options);\n };\n}\n\n/**\n * Transpiles the DATE_TRUNC expression into MySQL-compatible SQL.\n * Since MySQL lacks a native DATE_TRUNC, this uses string concatenation and conversion.\n * @param self - The MySQL Generator instance.\n * @param expression - The DateTruncExpr node to transpile.\n * @returns The generated SQL string.\n */\nexport function dateTruncSql (this: Generator, expression: DateTruncExpr): string {\n const expr = this.sql(expression, 'this');\n const unit = expression.text('unit').toUpperCase();\n\n let concat: string;\n let dateFormat: string;\n\n if (unit === 'WEEK') {\n concat = `CONCAT(YEAR(${expr}), ' ', WEEK(${expr}, 1), ' 1')`;\n dateFormat = '%Y %u %w';\n } else if (unit === 'MONTH') {\n concat = `CONCAT(YEAR(${expr}), ' ', MONTH(${expr}), ' 1')`;\n dateFormat = '%Y %c %e';\n } else if (unit === 'QUARTER') {\n concat = `CONCAT(YEAR(${expr}), ' ', QUARTER(${expr}) * 3 - 2, ' 1')`;\n dateFormat = '%Y %c %e';\n } else if (unit === 'YEAR') {\n concat = `CONCAT(YEAR(${expr}), ' 1 1')`;\n dateFormat = '%Y %c %e';\n } else {\n if (unit !== 'DAY') {\n this.unsupported(`Unexpected interval unit: ${unit}`);\n }\n return this.func('DATE', [\n expr,\n ]);\n }\n\n return this.func('STR_TO_DATE', [\n concat,\n `'${dateFormat}'`,\n ]);\n}\n\n/**\n * All specifiers for time parts (as opposed to date parts)\n * Reference: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format\n */\nexport const TIME_SPECIFIERS = new Set([\n 'f',\n 'H',\n 'h',\n 'I',\n 'i',\n 'k',\n 'l',\n 'p',\n 'r',\n 'S',\n 's',\n 'T',\n]);\n\n/**\n * Checks if a MySQL date format string contains any time-specific specifiers.\n */\nfunction hasTimeSpecifier (dateFormat: string): boolean {\n let i = 0;\n const length = dateFormat.length;\n\n while (i < length) {\n if (dateFormat[i] === '%') {\n i += 1;\n if (i < length && TIME_SPECIFIERS.has(dateFormat[i])) {\n return true;\n }\n }\n i += 1;\n }\n return false;\n}\n\n/**\n * Parser builder for STR_TO_DATE. Decides whether to return a StrToDateExpr or StrToTimeExpr\n * based on the presence of time specifiers in the format string.\n */\nexport function buildStrToDate (args: [Expression, ...(string | Expression | undefined)[]]): StrToDateExpr | StrToTimeExpr {\n const mysqlDateFormat = seqGet(args, 1);\n const dateFormat = MySQL.formatTime(mysqlDateFormat);\n const thisArg = seqGet(args, 0) as Expression;\n\n if (mysqlDateFormat && hasTimeSpecifier(mysqlDateFormat instanceof Expression ? mysqlDateFormat.name : mysqlDateFormat)) {\n return new StrToTimeExpr({\n this: thisArg,\n format: dateFormat || '',\n });\n }\n\n return new StrToDateExpr({\n this: thisArg,\n format: dateFormat,\n });\n}\n\n/**\n * Generator for STR_TO_DATE.\n */\nexport function strToDateSql (\n this: Generator,\n expression: StrToDateExpr | StrToTimeExpr | TsOrDsToDateExpr,\n): string {\n return this.func('STR_TO_DATE', [\n expression.args.this,\n this.formatTime(expression),\n ]);\n}\n\n/**\n * Generator for UNIX_TO_TIME. Handles optional scale for sub-second precision.\n */\nexport function unixToTimeSql (this: Generator, expression: UnixToTimeExpr): string {\n const scale = expression.args.scale;\n const timestamp = expression.args.this;\n\n if (scale === undefined || scale.toValue() === UnixToTimeExpr.SECONDS.toValue()) {\n return this.func('FROM_UNIXTIME', [\n timestamp,\n this.formatTime(expression),\n ]);\n }\n\n return this.func(\n 'FROM_UNIXTIME',\n [\n new DivExpr({\n this: timestamp,\n expression: func('POW', '10', scale.toString()),\n }),\n this.formatTime(expression),\n ],\n );\n}\n\n/**\n * Higher-order function to generate MySQL DATE_ADD or DATE_SUB calls.\n * @param kind - Either 'ADD' or 'SUB'.\n * @returns A function that generates the MySQL-specific DATE logic.\n */\nexport function dateAddSql (kind: string): (this: Generator, expression: DateAddExpr) => string {\n return function (this: Generator, expression: DateAddExpr): string {\n return this.func(\n `DATE_${kind}`,\n [\n expression.args.this,\n new IntervalExpr({\n this: expression.args.expression,\n unit: unitToVar(expression),\n }),\n ],\n );\n };\n}\n\n/**\n * Handles converting a Timestamp or DateString to a Date in MySQL.\n * @param self - The MySQL Generator.\n * @param expression - The TsOrDsToDateExpr node.\n */\nexport function tsOrDsToDateSql (this: Generator, expression: TsOrDsToDateExpr): string {\n const timeFormat = expression.args.format;\n return timeFormat\n ? strToDateSql.call(this, expression)\n : this.func('DATE', [\n expression.args.this,\n ]);\n}\n\n/**\n * Optimization that removes redundant TsOrDsToDate wrappers when the parent\n * function can handle raw types.\n */\nexport function removeTsOrDsToDate<T extends FuncExpr> (\n toSql?: (this: Generator, expression: T) => string,\n args: string[] = [\n 'this',\n ],\n): (this: Generator, expression: T) => string {\n return function (this: Generator, expression: T): string {\n for (const argKey of args) {\n const arg = expression.getArgKey(argKey);\n if (arg instanceof TsOrDsToDateExpr && !arg.args.format) {\n expression.setArgKey(argKey, arg.args.this);\n }\n }\n\n return toSql ? toSql.call(this, expression) : this.functionFallbackSql(expression);\n };\n}\n\nclass MySQLTokenizer extends Tokenizer {\n static QUOTES: TokenPair[] = [\n '\\'',\n '\"',\n ];\n static COMMENTS: TokenPair[] = [\n '--',\n '#',\n [\n '/*',\n '*/',\n ],\n ];\n\n static IDENTIFIERS: TokenPair[] = [\n '`',\n ];\n static STRING_ESCAPES: string[] = [\n '\\'',\n '\"',\n '\\\\',\n ];\n\n static BIT_STRINGS: TokenPair[] = [\n [\n 'b\\'',\n '\\'',\n ],\n [\n 'B\\'',\n '\\'',\n ],\n [\n '0b',\n '',\n ],\n ];\n\n static HEX_STRINGS: TokenPair[] = [\n [\n 'x\\'',\n '\\'',\n ],\n [\n 'X\\'',\n '\\'',\n ],\n [\n '0x',\n '',\n ],\n ];\n\n /**\n * Special characters that are recognized after an escape character (\\) in MySQL.\n * Reference: https://dev.mysql.com/doc/refman/8.4/en/string-literals.html\n */\n public ESCAPE_FOLLOW_CHARS = [\n '0',\n 'b',\n 'n',\n 'r',\n 't',\n 'Z',\n '%',\n '_',\n ];\n\n public NESTED_COMMENTS = false;\n\n @cache\n static get ORIGINAL_KEYWORDS (): Record<string, TokenType> {\n return {\n ...Tokenizer.KEYWORDS,\n 'BLOB': TokenType.BLOB,\n 'CHARSET': TokenType.CHARACTER_SET,\n 'DISTINCTROW': TokenType.DISTINCT,\n 'EXPLAIN': TokenType.DESCRIBE,\n 'FORCE': TokenType.FORCE,\n 'IGNORE': TokenType.IGNORE,\n 'KEY': TokenType.KEY,\n 'LOCK TABLES': TokenType.COMMAND,\n 'LONGBLOB': TokenType.LONGBLOB,\n 'LONGTEXT': TokenType.LONGTEXT,\n 'MEDIUMBLOB': TokenType.MEDIUMBLOB,\n 'MEDIUMINT': TokenType.MEDIUMINT,\n 'MEDIUMTEXT': TokenType.MEDIUMTEXT,\n 'MEMBER OF': TokenType.MEMBER_OF,\n 'MOD': TokenType.MOD,\n 'SEPARATOR': TokenType.SEPARATOR,\n 'SERIAL': TokenType.SERIAL,\n 'SIGNED': TokenType.BIGINT,\n 'SIGNED INTEGER': TokenType.BIGINT,\n 'SOUNDS LIKE': TokenType.SOUNDS_LIKE,\n 'START': TokenType.BEGIN,\n 'TIMESTAMP': TokenType.TIMESTAMPTZ,\n 'TINYBLOB': TokenType.TINYBLOB,\n 'TINYTEXT': TokenType.TINYTEXT,\n 'UNLOCK TABLES': TokenType.COMMAND,\n 'UNSIGNED': TokenType.UBIGINT,\n 'UNSIGNED INTEGER': TokenType.UBIGINT,\n 'YEAR': TokenType.YEAR,\n '_ARMSCII8': TokenType.INTRODUCER,\n '_ASCII': TokenType.INTRODUCER,\n '_BIG5': TokenType.INTRODUCER,\n '_BINARY': TokenType.INTRODUCER,\n '_CP1250': TokenType.INTRODUCER,\n '_CP1251': TokenType.INTRODUCER,\n '_CP1256': TokenType.INTRODUCER,\n '_CP1257': TokenType.INTRODUCER,\n '_CP850': TokenType.INTRODUCER,\n '_CP852': TokenType.INTRODUCER,\n '_CP866': TokenType.INTRODUCER,\n '_CP932': TokenType.INTRODUCER,\n '_DEC8': TokenType.INTRODUCER,\n '_EUCJPMS': TokenType.INTRODUCER,\n '_EUCKR': TokenType.INTRODUCER,\n '_GB18030': TokenType.INTRODUCER,\n '_GB2312': TokenType.INTRODUCER,\n '_GBK': TokenType.INTRODUCER,\n '_GEOSTD8': TokenType.INTRODUCER,\n '_GREEK': TokenType.INTRODUCER,\n '_HEBREW': TokenType.INTRODUCER,\n '_HP8': TokenType.INTRODUCER,\n '_KEYBCS2': TokenType.INTRODUCER,\n '_KOI8R': TokenType.INTRODUCER,\n '_KOI8U': TokenType.INTRODUCER,\n '_LATIN1': TokenType.INTRODUCER,\n '_LATIN2': TokenType.INTRODUCER,\n '_LATIN5': TokenType.INTRODUCER,\n '_LATIN7': TokenType.INTRODUCER,\n '_MACCE': TokenType.INTRODUCER,\n '_MACROMAN': TokenType.INTRODUCER,\n '_SJIS': TokenType.INTRODUCER,\n '_SWE7': TokenType.INTRODUCER,\n '_TIS620': TokenType.INTRODUCER,\n '_UCS2': TokenType.INTRODUCER,\n '_UJIS': TokenType.INTRODUCER,\n '_UTF8': TokenType.INTRODUCER,\n '_UTF16': TokenType.INTRODUCER,\n '_UTF16LE': TokenType.INTRODUCER,\n '_UTF32': TokenType.INTRODUCER,\n '_UTF8MB3': TokenType.INTRODUCER,\n '_UTF8MB4': TokenType.INTRODUCER,\n '@@': TokenType.SESSION_PARAMETER,\n };\n }\n\n @cache\n static get COMMANDS () {\n const commands = new Set([\n ...Tokenizer.COMMANDS,\n TokenType.REPLACE,\n ]);\n commands.delete(TokenType.SHOW);\n return commands;\n };\n};\n\nclass MySQLParser extends Parser {\n // port from _Dialect metaclass logic\n @cache\n static get ID_VAR_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.ID_VAR_TOKENS,\n TokenType.CURRENT_CATALOG,\n ]);\n }\n\n @cache\n static get FUNC_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.FUNC_TOKENS,\n TokenType.DATABASE,\n TokenType.MOD,\n TokenType.SCHEMA,\n TokenType.VALUES,\n TokenType.CHARACTER_SET,\n ]);\n }\n\n @cache\n static get CONJUNCTION (): Partial<Record<TokenType, typeof Expression>> {\n return {\n ...Parser.CONJUNCTION,\n [TokenType.DAMP]: AndExpr,\n [TokenType.XOR]: XorExpr,\n };\n }\n\n @cache\n static get DISJUNCTION (): Partial<Record<TokenType, typeof Expression>> {\n return {\n ...Parser.DISJUNCTION,\n [TokenType.DPIPE]: OrExpr,\n };\n }\n\n @cache\n static get TABLE_ALIAS_TOKENS (): Set<TokenType> {\n return (() => {\n const tokens = new Set(Parser.TABLE_ALIAS_TOKENS);\n for (const hint of Parser.TABLE_INDEX_HINT_TOKENS) {\n tokens.delete(hint);\n }\n return tokens;\n })();\n }\n\n @cache\n static get RANGE_PARSERS (): Partial<Record<TokenType, (this: Parser, this_: Expression) => Expression | undefined>> {\n return {\n ...Parser.RANGE_PARSERS,\n [TokenType.SOUNDS_LIKE]: function (this: Parser, thisArg: Expression): EqExpr {\n return this.expression(EqExpr, {\n this: this.expression(SoundexExpr, {\n this: thisArg,\n }),\n expression: this.expression(SoundexExpr, {\n this: this.parseTerm(),\n }),\n });\n },\n [TokenType.MEMBER_OF]: function (this: Parser, thisArg: Expression): JsonArrayContainsExpr {\n return this.expression(JsonArrayContainsExpr, {\n this: thisArg,\n expression: this.parseWrapped(this.parseExpression.bind(this)),\n });\n },\n };\n }\n\n @cache\n static get FUNCTIONS (): typeof Parser.FUNCTIONS {\n return {\n ...Parser.FUNCTIONS,\n BIT_AND: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BIT_OR: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BIT_XOR: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n BIT_COUNT: (args: unknown[]) => BitwiseCountExpr.fromArgList(args),\n CONVERT_TZ: (args: Expression[]): ConvertTimezoneExpr =>\n new ConvertTimezoneExpr({\n sourceTz: seqGet(args, 1),\n targetTz: seqGet(args, 2),\n timestamp: seqGet(args, 0),\n }),\n CURDATE: (args: unknown[]) => CurrentDateExpr.fromArgList(args),\n DATE: (args: Expression[]): TsOrDsToDateExpr =>\n new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n DATE_ADD: (args: Expression[]) => buildDateDeltaWithInterval(DateAddExpr)(args),\n DATE_FORMAT: buildFormattedTime(TimeToStrExpr, {\n dialect: Dialects.MYSQL,\n }),\n DATE_SUB: (args: Expression[]) => buildDateDeltaWithInterval(DateSubExpr)(args),\n DAY: (args: Expression[]): DayExpr =>\n new DayExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n DAYOFMONTH: (args: Expression[]): DayOfMonthExpr =>\n new DayOfMonthExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n DAYOFWEEK: (args: Expression[]): DayOfWeekExpr =>\n new DayOfWeekExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n DAYOFYEAR: (args: Expression[]): DayOfYearExpr =>\n new DayOfYearExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n FORMAT: (args: unknown[]) => NumberToStrExpr.fromArgList(args),\n FROM_UNIXTIME: buildFormattedTime(UnixToTimeExpr, {\n dialect: Dialects.MYSQL,\n }),\n ISNULL: isnullToIsNull,\n LENGTH: (args: Expression[]): LengthExpr =>\n new LengthExpr({\n this: seqGet(args, 0),\n binary: true,\n }),\n MAKETIME: (args: unknown[]) => TimeFromPartsExpr.fromArgList(args),\n MONTH: (args: Expression[]): MonthExpr =>\n new MonthExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n MONTHNAME: (args: Expression[]): TimeToStrExpr =>\n new TimeToStrExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n format: new LiteralExpr({\n this: '%B',\n isString: true,\n }),\n }),\n SCHEMA: (args: unknown[]) => CurrentSchemaExpr.fromArgList(args),\n DATABASE: (args: unknown[]) => CurrentSchemaExpr.fromArgList(args),\n STR_TO_DATE: buildStrToDate as (args: Expression[]) => Expression,\n TIMESTAMPDIFF: buildDateDelta(TimestampDiffExpr),\n TO_DAYS: (args: Expression[]) => {\n const diff = new DateDiffExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n expression: new TsOrDsToDateExpr({\n this: new LiteralExpr({\n this: '0000-01-01',\n isString: true,\n }),\n }),\n unit: new VarExpr({\n this: 'DAY',\n }),\n });\n return diff.add(1); // Standardized parenthesized expression with offset\n },\n VERSION: (args: unknown[]) => CurrentVersionExpr.fromArgList(args),\n WEEK: (args: Expression[]): WeekExpr =>\n new WeekExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n mode: seqGet(args, 1),\n }),\n WEEKOFYEAR: (args: Expression[]): WeekOfYearExpr =>\n new WeekOfYearExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n YEAR: (args: Expression[]): YearExpr =>\n new YearExpr({\n this: new TsOrDsToDateExpr({\n this: seqGet(args, 0),\n }),\n }),\n };\n }\n\n @cache\n static get FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.FUNCTION_PARSERS,\n GROUP_CONCAT: function (this: Parser) {\n return this.parseGroupConcat();\n },\n VALUES: function (this: Parser): AnonymousExpr {\n return this.expression(AnonymousExpr, {\n this: 'VALUES',\n expressions: [\n this.parseIdVar(),\n ],\n });\n },\n JSON_VALUE: function (this: Parser): Expression {\n return this.parseJsonValue();\n },\n SUBSTR: function (this: Parser): Expression {\n return this.parseSubstring();\n },\n };\n }\n\n @cache\n static get STATEMENT_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.STATEMENT_PARSERS,\n [TokenType.SHOW]: function (this: Parser) {\n return this.parseShow();\n },\n };\n }\n\n static SHOW_PARSERS: typeof Parser.SHOW_PARSERS = ({\n 'BINARY LOGS': showParser('BINARY LOGS'),\n 'MASTER LOGS': showParser('BINARY LOGS'),\n 'BINLOG EVENTS': showParser('BINLOG EVENTS'),\n 'CHARACTER SET': showParser('CHARACTER SET'),\n 'CHARSET': showParser('CHARACTER SET'),\n 'COLLATION': showParser('COLLATION'),\n 'FULL COLUMNS': showParser('COLUMNS', {\n target: 'FROM',\n full: true,\n }),\n 'COLUMNS': showParser('COLUMNS', {\n target: 'FROM',\n }),\n 'CREATE DATABASE': showParser('CREATE DATABASE', {\n target: true,\n }),\n 'CREATE EVENT': showParser('CREATE EVENT', {\n target: true,\n }),\n 'CREATE FUNCTION': showParser('CREATE FUNCTION', {\n target: true,\n }),\n 'CREATE PROCEDURE': showParser('CREATE PROCEDURE', {\n target: true,\n }),\n 'CREATE TABLE': showParser('CREATE TABLE', {\n target: true,\n }),\n 'CREATE TRIGGER': showParser('CREATE TRIGGER', {\n target: true,\n }),\n 'CREATE VIEW': showParser('CREATE VIEW', {\n target: true,\n }),\n 'DATABASES': showParser('DATABASES'),\n 'SCHEMAS': showParser('DATABASES'),\n 'ENGINE': showParser('ENGINE', {\n target: true,\n }),\n 'STORAGE ENGINES': showParser('ENGINES'),\n 'ENGINES': showParser('ENGINES'),\n 'ERRORS': showParser('ERRORS'),\n 'EVENTS': showParser('EVENTS'),\n 'FUNCTION CODE': showParser('FUNCTION CODE', {\n target: true,\n }),\n 'FUNCTION STATUS': showParser('FUNCTION STATUS'),\n 'GRANTS': showParser('GRANTS', {\n target: 'FOR',\n }),\n 'INDEX': showParser('INDEX', {\n target: 'FROM',\n }),\n 'MASTER STATUS': showParser('MASTER STATUS'),\n 'OPEN TABLES': showParser('OPEN TABLES'),\n 'PLUGINS': showParser('PLUGINS'),\n 'PROCEDURE CODE': showParser('PROCEDURE CODE', {\n target: true,\n }),\n 'PROCEDURE STATUS': showParser('PROCEDURE STATUS'),\n 'PRIVILEGES': showParser('PRIVILEGES'),\n 'FULL PROCESSLIST': showParser('PROCESSLIST', {\n full: true,\n }),\n 'PROCESSLIST': showParser('PROCESSLIST'),\n 'PROFILE': showParser('PROFILE'),\n 'PROFILES': showParser('PROFILES'),\n 'RELAYLOG EVENTS': showParser('RELAYLOG EVENTS'),\n 'REPLICAS': showParser('REPLICAS'),\n 'SLAVE HOSTS': showParser('REPLICAS'),\n 'REPLICA STATUS': showParser('REPLICA STATUS'),\n 'SLAVE STATUS': showParser('REPLICA STATUS'),\n 'GLOBAL STATUS': showParser('STATUS', {\n global: true,\n }),\n 'SESSION STATUS': showParser('STATUS'),\n 'STATUS': showParser('STATUS'),\n 'TABLE STATUS': showParser('TABLE STATUS'),\n 'FULL TABLES': showParser('TABLES', {\n full: true,\n }),\n 'TABLES': showParser('TABLES'),\n 'TRIGGERS': showParser('TRIGGERS'),\n 'GLOBAL VARIABLES': showParser('VARIABLES', {\n global: true,\n }),\n 'SESSION VARIABLES': showParser('VARIABLES'),\n 'VARIABLES': showParser('VARIABLES'),\n 'WARNINGS': showParser('WARNINGS'),\n });\n\n @cache\n static get PROPERTY_PARSERS (): Record<string, (this: Parser, ...args: unknown[]) => Expression | Expression[] | undefined> {\n return {\n ...Parser.PROPERTY_PARSERS,\n 'LOCK': function (this: Parser) {\n return this.parsePropertyAssignment(LockPropertyExpr);\n },\n 'PARTITION BY': function (this: Parser) {\n return (this as MySQLParser).parsePartitionProperty();\n },\n };\n }\n\n @cache\n static get SET_PARSERS (): Record<string, (this: Parser) => Expression | undefined> {\n return {\n ...Parser.SET_PARSERS,\n 'PERSIST': function (this: Parser) {\n return (this as MySQLParser).parseSetItemAssignment({\n kind: SetItemExprKind.PERSIST,\n });\n },\n 'PERSIST_ONLY': function (this: Parser) {\n return this.parseSetItemAssignment({\n kind: 'PERSIST_ONLY',\n });\n },\n 'CHARACTER SET': function (this: Parser): Expression {\n return (this as MySQLParser).parseSetItemCharset('CHARACTER SET');\n },\n 'CHARSET': function (this: Parser): Expression {\n return (this as MySQLParser).parseSetItemCharset('CHARACTER SET');\n },\n 'NAMES': function (this: Parser) {\n return (this as MySQLParser).parseSetItemNames();\n },\n };\n }\n\n @cache\n static get CONSTRAINT_PARSERS (): Partial<Record<string, (this: Parser, ...args: unknown[]) => Expression | Expression[] | undefined>> {\n return {\n ...Parser.CONSTRAINT_PARSERS,\n FULLTEXT: function (this: Parser) {\n return (this as MySQLParser).parseIndexConstraint('FULLTEXT');\n },\n INDEX: function (this: Parser) {\n return (this as MySQLParser).parseIndexConstraint();\n },\n KEY: function (this: Parser) {\n return (this as MySQLParser).parseIndexConstraint();\n },\n SPATIAL: function (this: Parser) {\n return (this as MySQLParser).parseIndexConstraint('SPATIAL');\n },\n ZEROFILL: function (this: Parser) {\n return this.expression(ZeroFillColumnConstraintExpr);\n },\n };\n }\n\n @cache\n static get ALTER_PARSERS (): Partial<Record<string, (this: Parser) => Expression | Expression[] | undefined>> {\n return {\n ...Parser.ALTER_PARSERS,\n MODIFY: function (this: Parser) {\n return this.parseAlterTableAlter();\n },\n };\n }\n\n @cache\n static get ALTER_ALTER_PARSERS (): Partial<Record<string, (this: Parser) => Expression>> {\n return {\n ...Parser.ALTER_ALTER_PARSERS,\n INDEX: function (this: Parser) {\n return (this as MySQLParser).parseAlterTableAlterIndex();\n },\n };\n }\n\n @cache\n static get SCHEMA_UNNAMED_CONSTRAINTS (): Set<string> {\n return new Set([\n ...Parser.SCHEMA_UNNAMED_CONSTRAINTS,\n 'FULLTEXT',\n 'INDEX',\n 'KEY',\n 'SPATIAL',\n ]);\n }\n\n @cache\n static get PROFILE_TYPES () {\n return {\n ALL: [\n ],\n CPU: [\n ],\n IPC: [\n ],\n MEMORY: [\n ],\n SOURCE: [\n ],\n SWAPS: [\n ],\n BLOCK: [\n 'IO',\n ],\n CONTEXT: [\n 'SWITCHES',\n ],\n PAGE: [\n 'FAULTS',\n ],\n };\n }\n\n @cache\n static get TYPE_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.TYPE_TOKENS,\n TokenType.SET,\n ]);\n }\n\n @cache\n static get ENUM_TYPE_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.ENUM_TYPE_TOKENS,\n TokenType.SET,\n ]);\n }\n\n /**\n * Modifiers that can appear in a MySQL SELECT statement.\n */\n @cache\n static get OPERATION_MODIFIERS (): Set<string> {\n return new Set([\n 'HIGH_PRIORITY',\n 'STRAIGHT_JOIN',\n 'SQL_SMALL_RESULT',\n 'SQL_BIG_RESULT',\n 'SQL_BUFFER_RESULT',\n 'SQL_NO_CACHE',\n 'SQL_CALC_FOUND_ROWS',\n ]);\n }\n\n static LOG_DEFAULTS_TO_LN = true;\n static STRING_ALIASES = true;\n static VALUES_FOLLOWED_BY_PAREN = false;\n static SUPPORTS_PARTITION_SELECTION = true;\n\n /**\n * Handles MySQL's GENERATED ALWAYS AS logic, including VIRTUAL vs STORED persistence.\n */\n public parseGeneratedAsIdentity ():\n | GeneratedAsIdentityColumnConstraintExpr\n | ComputedColumnConstraintExpr\n | GeneratedAsRowColumnConstraintExpr {\n let thisExpr = super.parseGeneratedAsIdentity();\n\n if (this.matchTexts([\n 'STORED',\n 'VIRTUAL',\n ])) {\n const persisted = this.prev?.text.toUpperCase() === 'STORED';\n\n if (thisExpr instanceof ComputedColumnConstraintExpr) {\n thisExpr.setArgKey('persisted', persisted);\n } else if (thisExpr instanceof GeneratedAsIdentityColumnConstraintExpr) {\n // Pivot to a ComputedColumnConstraint if persistence is explicitly specified\n thisExpr = this.expression(ComputedColumnConstraintExpr, {\n this: thisExpr.args.expression,\n persisted: persisted,\n });\n }\n }\n\n return thisExpr;\n }\n\n /**\n * Parses MySQL-specific primary key parts which allow column prefixes (e.g. KEY(col(10))).\n */\n public parsePrimaryKeyPart (): Expression | undefined {\n const thisExpr = this.parseIdVar();\n if (!this.match(TokenType.L_PAREN)) {\n return thisExpr;\n }\n\n const expression = this.parseNumber();\n this.matchRParen();\n\n return this.expression(ColumnPrefixExpr, {\n this: thisExpr,\n expression: expression,\n });\n }\n\n /**\n * Parses MySQL index constraints, including support for KEY_BLOCK_SIZE,\n * custom parsers, and visibility toggles.\n */\n protected parseIndexConstraint (kind?: string): IndexColumnConstraintExpr {\n if (kind) {\n this.matchTexts([\n 'INDEX',\n 'KEY',\n ]);\n }\n\n const thisExpr = this.parseIdVar({\n anyToken: false,\n });\n const indexType = this.match(TokenType.USING) && this.advanceAny() && this.prev?.text;\n const expressions = this.parseWrappedCsv(this.parseOrdered.bind(this));\n\n const options: IndexConstraintOptionExpr[] = [\n ];\n while (true) {\n let opt: IndexConstraintOptionExpr | undefined = undefined;\n\n if (this.matchTextSeq([\n 'KEY_BLOCK_SIZE',\n ])) {\n this.match(TokenType.EQ);\n opt = new IndexConstraintOptionExpr({\n keyBlockSize: this.parseNumber(),\n });\n } else if (this.match(TokenType.USING)) {\n opt = new IndexConstraintOptionExpr({\n using: this.advanceAny() && this.prev?.text,\n });\n } else if (this.matchTextSeq([\n 'WITH',\n 'PARSER',\n ])) {\n opt = new IndexConstraintOptionExpr({\n parser: this.parseVar({\n anyToken: true,\n }),\n });\n } else if (this.match(TokenType.COMMENT)) {\n opt = new IndexConstraintOptionExpr({\n comment: this.parseString(),\n });\n } else if (this.matchTextSeq([\n 'VISIBLE',\n ])) {\n opt = new IndexConstraintOptionExpr({\n visible: true,\n });\n } else if (this.matchTextSeq([\n 'INVISIBLE',\n ])) {\n opt = new IndexConstraintOptionExpr({\n visible: false,\n });\n } else if (this.matchTextSeq([\n 'ENGINE_ATTRIBUTE',\n ])) {\n this.match(TokenType.EQ);\n opt = new IndexConstraintOptionExpr({\n engineAttr: this.parseString(),\n });\n } else if (this.matchTextSeq([\n 'SECONDARY_ENGINE_ATTRIBUTE',\n ])) {\n this.match(TokenType.EQ);\n opt = new IndexConstraintOptionExpr({\n secondaryEngineAttr: this.parseString(),\n });\n }\n\n if (!opt) break;\n options.push(opt);\n }\n\n return this.expression(IndexColumnConstraintExpr, {\n this: thisExpr,\n expressions: expressions,\n kind: kind,\n indexType: indexType,\n options: options,\n });\n }\n\n /**\n * Core internal parser for the varied MySQL SHOW statement variants.\n */\n public parseShowMysql (\n thisArg: string,\n options: {\n target?: boolean | string;\n full?: boolean;\n global?: boolean;\n } = {},\n ): ShowExpr {\n const {\n target = false,\n full,\n global,\n } = options;\n const json = this.matchTextSeq([\n 'JSON',\n ]);\n let targetId: Expression | undefined = undefined;\n\n if (target) {\n if (typeof target === 'string') {\n this.matchTextSeq(target.split(' '));\n }\n targetId = this.parseIdVar();\n }\n\n const log = this.matchTextSeq([\n 'IN',\n ])\n ? this.parseString()\n : undefined;\n let position: Expression | undefined = undefined;\n let db: Expression | undefined = undefined;\n\n if (thisArg === 'BINLOG EVENTS' || thisArg === 'RELAYLOG EVENTS') {\n position = this.matchTextSeq([\n 'FROM',\n ])\n ? this.parseNumber()\n : undefined;\n } else {\n if (this.match(TokenType.FROM)) {\n db = this.parseIdVar();\n } else if (this.match(TokenType.DOT)) {\n db = targetId;\n targetId = this.parseIdVar();\n }\n }\n\n const channel = this.matchTextSeq([\n 'FOR',\n 'CHANNEL',\n ])\n ? this.parseIdVar()\n : undefined;\n const like = this.matchTextSeq([\n 'LIKE',\n ])\n ? this.parseString()\n : undefined;\n const where = this.parseWhere();\n\n let types: Expression[] | undefined = undefined;\n let query: Expression | undefined = undefined;\n let offset: Expression | undefined = undefined;\n let limit: Expression | undefined = undefined;\n\n if (thisArg === 'PROFILE') {\n types = this.parseCsv(() => this.parseVarFromOptions(MySQLParser.PROFILE_TYPES));\n query = this.matchTextSeq([\n 'FOR',\n 'QUERY',\n ])\n ? this.parseNumber()\n : undefined;\n offset = this.matchTextSeq([\n 'OFFSET',\n ])\n ? this.parseNumber()\n : undefined;\n limit = this.matchTextSeq([\n 'LIMIT',\n ])\n ? this.parseNumber()\n : undefined;\n } else {\n [\n offset,\n limit,\n ] = this.parseOldstyleLimit();\n }\n\n let mutex: boolean | undefined = undefined;\n if (this.matchTextSeq([\n 'MUTEX',\n ])) mutex = true;\n if (this.matchTextSeq([\n 'STATUS',\n ])) mutex = false;\n\n const forTable = this.matchTextSeq([\n 'FOR',\n 'TABLE',\n ])\n ? this.parseIdVar()\n : undefined;\n const forGroup = this.matchTextSeq([\n 'FOR',\n 'GROUP',\n ])\n ? this.parseString()\n : undefined;\n const forUser = this.matchTextSeq([\n 'FOR',\n 'USER',\n ])\n ? this.parseString()\n : undefined;\n const forRole = this.matchTextSeq([\n 'FOR',\n 'ROLE',\n ])\n ? this.parseString()\n : undefined;\n const intoOutfile = this.matchTextSeq([\n 'INTO',\n 'OUTFILE',\n ])\n ? this.parseString()\n : undefined;\n\n return this.expression(ShowExpr, {\n this: thisArg,\n target: targetId,\n full: full,\n log: log,\n position: position,\n db: db,\n channel: channel,\n like: like,\n where: where,\n types: types,\n query: query,\n offset: offset,\n limit: limit,\n mutex: mutex,\n forTable: forTable,\n forGroup: forGroup,\n forUser: forUser,\n forRole: forRole,\n intoOutfile: intoOutfile,\n json: json,\n global: global,\n });\n }\n\n protected parseOldstyleLimit (): [Expression | undefined, Expression | undefined] {\n let limit: Expression | undefined = undefined;\n let offset: Expression | undefined = undefined;\n\n if (this.matchTextSeq([\n 'LIMIT',\n ])) {\n const parts = this.parseCsv(this.parseNumber.bind(this));\n if (parts.length === 1) {\n limit = parts[0];\n } else if (parts.length === 2) {\n limit = parts[1];\n offset = parts[0];\n }\n }\n\n return [\n offset,\n limit,\n ];\n }\n\n protected parseSetItemCharset (kind: string): Expression {\n const thisExpr = this.parseString() || this.parseUnquotedField();\n return this.expression(SetItemExpr, {\n this: thisExpr,\n kind: kind,\n });\n }\n\n protected parseSetItemNames (): Expression {\n const charset = this.parseString() || this.parseUnquotedField();\n let collate: Expression | undefined = undefined;\n\n if (this.matchTextSeq([\n 'COLLATE',\n ])) {\n collate = this.parseString() || this.parseUnquotedField();\n }\n\n return this.expression(SetItemExpr, {\n this: charset,\n collate: collate,\n kind: 'NAMES',\n });\n }\n\n /**\n * Overrides core type parsing to handle MySQL's unique 'BINARY' modifier\n * which can act as a cast without parentheses.\n */\n public parseType (options: {\n parseInterval?: boolean;\n fallbackToIdentifier?: boolean;\n } = {}): Expression | undefined {\n const {\n parseInterval = true,\n fallbackToIdentifier = false,\n } = options;\n if (this.match(TokenType.BINARY, {\n advance: false,\n })) {\n const dataType = this.parseTypes({\n checkFunc: true,\n allowIdentifiers: false,\n });\n\n if (dataType instanceof DataTypeExpr) {\n return this.expression(CastExpr, {\n this: this.parseColumn(),\n to: dataType,\n });\n }\n }\n\n return super.parseType({\n parseInterval,\n fallbackToIdentifier,\n });\n }\n\n protected parseAlterTableAlterIndex (): AlterIndexExpr {\n const index = this.parseField({\n anyToken: true,\n });\n let visible: boolean | undefined = undefined;\n\n if (this.matchTextSeq([\n 'VISIBLE',\n ])) {\n visible = true;\n } else if (this.matchTextSeq([\n 'INVISIBLE',\n ])) {\n visible = false;\n }\n\n return this.expression(AlterIndexExpr, {\n this: index,\n visible: visible,\n });\n }\n\n /**\n * Parses MySQL partitioning properties for RANGE and LIST schemes.\n */\n protected parsePartitionProperty (): Expression | Expression[] | undefined {\n let partitionCls: typeof Expression | undefined = undefined;\n let valueParser: (() => Expression | undefined) | undefined = undefined;\n\n if (this.matchTextSeq([\n 'RANGE',\n ])) {\n partitionCls = PartitionByRangePropertyExpr;\n valueParser = this.parsePartitionRangeValue.bind(this);\n } else if (this.matchTextSeq([\n 'LIST',\n ])) {\n partitionCls = PartitionByListPropertyExpr;\n valueParser = this.parsePartitionListValue.bind(this);\n }\n\n if (!partitionCls || !valueParser) {\n return undefined;\n }\n\n const partitionExpressions = this.parseWrappedCsv(this.parseAssignment.bind(this));\n\n // For Doris and Starrocks compatibility check\n if (!this.matchTextSeq([\n '(',\n 'PARTITION',\n ], {\n advance: false,\n })) {\n return partitionExpressions;\n }\n\n const createExpressions = this.parseWrappedCsv(valueParser);\n\n return this.expression(partitionCls, {\n partitionExpressions: partitionExpressions,\n createExpressions: createExpressions,\n });\n }\n\n protected parsePartitionRangeValue (): Expression | undefined {\n this.matchTextSeq([\n 'PARTITION',\n ]);\n const name = this.parseIdVar();\n\n if (!this.matchTextSeq([\n 'VALUES',\n 'LESS',\n 'THAN',\n ])) {\n return name;\n }\n\n let values = this.parseWrappedCsv(this.parseExpression.bind(this));\n\n if (\n values.length === 1\n && values[0] instanceof ColumnExpr\n && values[0].name.toUpperCase() === 'MAXVALUE'\n ) {\n values = [\n new VarExpr({\n this: 'MAXVALUE',\n }),\n ];\n }\n\n const partRange = this.expression(PartitionRangeExpr, {\n this: name,\n expressions: values,\n });\n return this.expression(PartitionExpr, {\n expressions: [\n partRange,\n ],\n });\n }\n\n protected parsePartitionListValue (): PartitionExpr {\n this.matchTextSeq([\n 'PARTITION',\n ]);\n const name = this.parseIdVar();\n this.matchTextSeq([\n 'VALUES',\n 'IN',\n ]);\n const values = this.parseWrappedCsv(this.parseExpression.bind(this));\n\n const partList = this.expression(PartitionListExpr, {\n this: name,\n expressions: values,\n });\n return this.expression(PartitionExpr, {\n expressions: [\n partList,\n ],\n });\n }\n\n public parsePrimaryKey (\n options: {\n wrappedOptional?: boolean;\n inProps?: boolean;\n namedPrimaryKey?: boolean;\n } = {},\n ): PrimaryKeyColumnConstraintExpr | PrimaryKeyExpr {\n const {\n wrappedOptional = false,\n inProps = false,\n namedPrimaryKey: _namedPrimaryKey = false,\n } = options;\n // MySQL always supports named primary keys in this context\n return super.parsePrimaryKey({\n wrappedOptional,\n inProps,\n namedPrimaryKey: true,\n });\n }\n}\n\nclass MySQLGenerator extends Generator {\n // port from _Dialect metaclass logic\n @cache\n static get AFTER_HAVING_MODIFIER_TRANSFORMS () {\n const modifiers = new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);\n [\n 'cluster',\n 'distribute',\n 'sort',\n ].forEach((m) => modifiers.delete(m));\n return modifiers;\n }\n\n // port from _Dialect metaclass logic\n static SUPPORTS_DECODE_CASE = false;\n // port from _Dialect metaclass logic\n static readonly SELECT_KINDS: string[] = [\n ];\n // port from _Dialect metaclass logic\n static TRY_SUPPORTED = false;\n // port from _Dialect metaclass logic\n static SUPPORTS_UESCAPE = false;\n static INTERVAL_ALLOWS_PLURAL_FORM: boolean = false;\n static LOCKING_READS_SUPPORTED: boolean = true;\n\n @cache\n static get NULL_ORDERING_SUPPORTED () {\n return NullOrderingSupported.UNSUPPORTED;\n }\n\n static JOIN_HINTS: boolean = false;\n static TABLE_HINTS: boolean = true;\n static DUPLICATE_KEY_UPDATE_WITH_SET: boolean = false;\n static QUERY_HINT_SEP: string = ' ';\n static VALUES_AS_TABLE: boolean = false;\n static NVL2_SUPPORTED: boolean = false;\n static LAST_DAY_SUPPORTS_DATE_PART: boolean = false;\n static JSON_TYPE_REQUIRED_FOR_EXTRACTION: boolean = true;\n static JSON_PATH_BRACKETED_KEY_SUPPORTED: boolean = false;\n static JSON_KEY_VALUE_PAIR_SEP: string = ',';\n static SUPPORTS_TO_NUMBER: boolean = false;\n static PARSE_JSON_NAME: string | undefined = undefined;\n static PAD_FILL_PATTERN_IS_REQUIRED: boolean = true;\n static WRAP_DERIVED_VALUES: boolean = false;\n static VARCHAR_REQUIRES_SIZE: boolean = true;\n static SUPPORTS_MEDIAN: boolean = false;\n static UPDATE_STATEMENT_SUPPORTS_FROM: boolean = false;\n static SUPPORTS_CONVERT_TIMEZONE = true;\n\n @cache\n static get ORIGINAL_TRANSFORMS () {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Map<typeof Expression, (this: Generator, e: any) => string>([\n ...Generator.TRANSFORMS,\n [\n ArrayAggExpr,\n renameFunc('GROUP_CONCAT'),\n ],\n [\n BitwiseAndAggExpr,\n renameFunc('BIT_AND'),\n ],\n [\n BitwiseOrAggExpr,\n renameFunc('BIT_OR'),\n ],\n [\n BitwiseXorAggExpr,\n renameFunc('BIT_XOR'),\n ],\n [\n BitwiseCountExpr,\n renameFunc('BIT_COUNT'),\n ],\n [\n ChrExpr,\n function (this: Generator, e: ChrExpr): string {\n return this.chrSql(e, {\n name: 'CHAR',\n });\n },\n ],\n [\n CurrentDateExpr,\n noParenCurrentDateSql,\n ],\n [\n CurrentVersionExpr,\n renameFunc('VERSION'),\n ],\n [\n DateDiffExpr,\n removeTsOrDsToDate(\n function (this: Generator, e: DateDiffExpr): string {\n return this.func('DATEDIFF', [\n e.args.this,\n e.args.expression,\n ]);\n },\n [\n 'this',\n 'expression',\n ],\n ),\n ],\n [\n DateAddExpr,\n removeTsOrDsToDate(dateAddSql('ADD')),\n ],\n [\n DateStrToDateExpr,\n dateStrToDateSql,\n ],\n [\n DateSubExpr,\n removeTsOrDsToDate(dateAddSql('SUB')),\n ],\n [\n DateTruncExpr,\n dateTruncSql,\n ],\n [\n DayExpr,\n removeTsOrDsToDate(),\n ],\n [\n DayOfMonthExpr,\n removeTsOrDsToDate(renameFunc('DAYOFMONTH')),\n ],\n [\n DayOfWeekExpr,\n removeTsOrDsToDate(renameFunc('DAYOFWEEK')),\n ],\n [\n DayOfYearExpr,\n removeTsOrDsToDate(renameFunc('DAYOFYEAR')),\n ],\n [\n GroupConcatExpr,\n function (this: Generator, e: GroupConcatExpr): string {\n return `GROUP_CONCAT(${this.sql(e, 'this')} SEPARATOR ${this.sql(e, 'separator') || '\\',\\''})`;\n },\n ],\n [\n ILikeExpr,\n noIlikeSql,\n ],\n [\n JsonExtractScalarExpr,\n arrowJsonExtractSql,\n ],\n [\n LengthExpr,\n lengthOrCharLengthSql,\n ],\n [\n LogicalOrExpr,\n renameFunc('MAX'),\n ],\n [\n LogicalAndExpr,\n renameFunc('MIN'),\n ],\n [\n MaxExpr,\n maxOrGreatest,\n ],\n [\n MinExpr,\n minOrLeast,\n ],\n [\n MonthExpr,\n removeTsOrDsToDate(),\n ],\n [\n NullSafeEqExpr,\n function (this: Generator, e: NullSafeEqExpr): string {\n return this.binary(e, '<=>');\n },\n ],\n [\n NullSafeNeqExpr,\n function (this: Generator, e: NullSafeNeqExpr): string {\n return `NOT ${this.binary(e, '<=>')}`;\n },\n ],\n [\n NumberToStrExpr,\n renameFunc('FORMAT'),\n ],\n [\n PivotExpr,\n noPivotSql,\n ],\n [\n SelectExpr,\n preprocess([\n eliminateDistinctOn,\n eliminateSemiAndAntiJoins,\n eliminateQualify,\n eliminateFullOuterJoin,\n unnestGenerateDateArrayUsingRecursiveCte,\n ]),\n ],\n [\n StrPositionExpr,\n function (this: Generator, e: StrPositionExpr): string {\n return strPositionSql.call(this, e, {\n funcName: 'LOCATE',\n supportsPosition: true,\n });\n },\n ],\n [\n StrToDateExpr,\n strToDateSql,\n ],\n [\n StrToTimeExpr,\n strToDateSql,\n ],\n [\n StuffExpr,\n renameFunc('INSERT'),\n ],\n [\n SessionUserExpr,\n () => 'SESSION_USER()',\n ],\n [\n TableSampleExpr,\n noTablesampleSql,\n ],\n [\n TimeFromPartsExpr,\n renameFunc('MAKETIME'),\n ],\n [\n TimestampAddExpr,\n dateAddIntervalSql('DATE', 'ADD'),\n ],\n [\n TimestampDiffExpr,\n function (this: Generator, e: TimestampDiffExpr): string {\n return this.func('TIMESTAMPDIFF', [\n unitToVar(e),\n e.args.expression,\n e.args.this,\n ]);\n },\n ],\n [\n TimestampSubExpr,\n dateAddIntervalSql('DATE', 'SUB'),\n ],\n [\n TimeStrToUnixExpr,\n renameFunc('UNIX_TIMESTAMP'),\n ],\n [\n TimeStrToTimeExpr,\n function (this: Generator, e: TimeStrToTimeExpr): string {\n return timeStrToTimeSql.call(this, e, {\n includePrecision: !e.args.zone,\n });\n },\n ],\n [\n TimeToStrExpr,\n removeTsOrDsToDate(function (this: Generator, e: TimeToStrExpr) {\n return this.func('DATE_FORMAT', [\n e.args.this,\n this.formatTime(e),\n ]);\n }),\n ],\n [\n TrimExpr,\n trimSql,\n ],\n [\n TruncExpr,\n renameFunc('TRUNCATE'),\n ],\n [\n TryCastExpr,\n noTrycastSql,\n ],\n [\n TsOrDsAddExpr,\n dateAddSql('ADD'),\n ],\n [\n TsOrDsDiffExpr,\n function (this: Generator, e: TsOrDsDiffExpr): string {\n return this.func('DATEDIFF', [\n e.args.this,\n e.args.expression,\n ]);\n },\n ],\n [\n TsOrDsToDateExpr,\n tsOrDsToDateSql,\n ],\n [\n UnicodeExpr,\n function (this: Generator, e: UnicodeExpr): string {\n return `ORD(CONVERT(${this.sql(e.args.this)} USING utf32))`;\n },\n ],\n [\n UnixToTimeExpr,\n unixToTimeSql,\n ],\n [\n WeekExpr,\n removeTsOrDsToDate(),\n ],\n [\n WeekOfYearExpr,\n removeTsOrDsToDate(renameFunc('WEEKOFYEAR')),\n ],\n [\n YearExpr,\n removeTsOrDsToDate(),\n ],\n [\n UtcTimestampExpr,\n renameFunc('UTC_TIMESTAMP'),\n ],\n [\n UtcTimeExpr,\n renameFunc('UTC_TIME'),\n ],\n ]);\n }\n\n /**\n * Maps unsigned types to their standard MySQL counterparts.\n * MySQL adds the 'UNSIGNED' attribute during generation based on the DataTypeExpr.\n */\n @cache\n static get UNSIGNED_TYPE_MAPPING (): Map<DataTypeExprKind, string> {\n return new Map<DataTypeExprKind, string>([\n [\n DataTypeExprKind.UBIGINT,\n 'BIGINT',\n ],\n [\n DataTypeExprKind.UINT,\n 'INT',\n ],\n [\n DataTypeExprKind.UMEDIUMINT,\n 'MEDIUMINT',\n ],\n [\n DataTypeExprKind.USMALLINT,\n 'SMALLINT',\n ],\n [\n DataTypeExprKind.UTINYINT,\n 'TINYINT',\n ],\n [\n DataTypeExprKind.UDECIMAL,\n 'DECIMAL',\n ],\n [\n DataTypeExprKind.UDOUBLE,\n 'DOUBLE',\n ],\n ]);\n }\n\n /**\n * Standardizes various timestamp types to MySQL's DATETIME or TIMESTAMP.\n */\n @cache\n static get TIMESTAMP_TYPE_MAPPING (): Map<DataTypeExprKind, string> {\n return new Map<DataTypeExprKind, string>([\n [\n DataTypeExprKind.DATETIME2,\n 'DATETIME',\n ],\n [\n DataTypeExprKind.SMALLDATETIME,\n 'DATETIME',\n ],\n [\n DataTypeExprKind.TIMESTAMP,\n 'DATETIME',\n ],\n [\n DataTypeExprKind.TIMESTAMPNTZ,\n 'DATETIME',\n ],\n [\n DataTypeExprKind.TIMESTAMPTZ,\n 'TIMESTAMP',\n ],\n [\n DataTypeExprKind.TIMESTAMPLTZ,\n 'TIMESTAMP',\n ],\n ]);\n }\n\n @cache\n static get TYPE_MAPPING (): Map<DataTypeExprKind | string, string> {\n const mapping = new Map(Generator.TYPE_MAPPING);\n\n for (const [\n k,\n v,\n ] of MySQLGenerator.UNSIGNED_TYPE_MAPPING) {\n mapping.set(k, v);\n }\n for (const [\n k,\n v,\n ] of MySQLGenerator.TIMESTAMP_TYPE_MAPPING) {\n mapping.set(k, v);\n }\n\n // Remove types that MySQL handles natively or via special attributes\n mapping.delete(DataTypeExprKind.MEDIUMTEXT);\n mapping.delete(DataTypeExprKind.LONGTEXT);\n mapping.delete(DataTypeExprKind.TINYTEXT);\n mapping.delete(DataTypeExprKind.BLOB);\n mapping.delete(DataTypeExprKind.MEDIUMBLOB);\n mapping.delete(DataTypeExprKind.LONGBLOB);\n mapping.delete(DataTypeExprKind.TINYBLOB);\n\n return mapping;\n }\n\n @cache\n static get PROPERTIES_LOCATION (): Map<typeof Expression, PropertiesLocation> {\n const map = new Map(Generator.PROPERTIES_LOCATION);\n map.set(TransientPropertyExpr, PropertiesLocation.UNSUPPORTED);\n map.set(VolatilePropertyExpr, PropertiesLocation.UNSUPPORTED);\n map.set(PartitionedByPropertyExpr, PropertiesLocation.UNSUPPORTED);\n map.set(PartitionByRangePropertyExpr, PropertiesLocation.POST_SCHEMA);\n map.set(PartitionByListPropertyExpr, PropertiesLocation.POST_SCHEMA);\n return map;\n }\n\n static LIMIT_FETCH: string = 'LIMIT';\n static LIMIT_ONLY_LITERALS: boolean = true;\n\n /**\n * MySQL CAST targets for character-based types.\n */\n @cache\n static get CHAR_CAST_MAPPING () {\n return [\n DataTypeExprKind.LONGTEXT,\n DataTypeExprKind.LONGBLOB,\n DataTypeExprKind.MEDIUMBLOB,\n DataTypeExprKind.MEDIUMTEXT,\n DataTypeExprKind.TEXT,\n DataTypeExprKind.TINYBLOB,\n DataTypeExprKind.TINYTEXT,\n DataTypeExprKind.VARCHAR,\n ].reduce((acc, type) => ({\n ...acc,\n [type]: 'CHAR',\n }), {});\n }\n\n /**\n * MySQL CAST targets for integer-based types.\n */\n @cache\n static get SIGNED_CAST_MAPPING () {\n return [\n DataTypeExprKind.BIGINT,\n DataTypeExprKind.BOOLEAN,\n DataTypeExprKind.INT,\n DataTypeExprKind.SMALLINT,\n DataTypeExprKind.TINYINT,\n DataTypeExprKind.MEDIUMINT,\n ].reduce((acc, type) => ({\n ...acc,\n [type]: 'SIGNED',\n }), {});\n }\n\n /**\n * MySQL is restricted in which types it can use as a CAST target.\n * Reference: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast\n */\n @cache\n static get CAST_MAPPING (): Record<string, string> {\n return {\n ...MySQLGenerator.CHAR_CAST_MAPPING,\n ...MySQLGenerator.SIGNED_CAST_MAPPING,\n [DataTypeExprKind.UBIGINT]: 'UNSIGNED',\n };\n }\n\n /**\n * Types that require specific function-like syntax for timestamp manipulation.\n */\n @cache\n static get TIMESTAMP_FUNC_TYPES (): Set<string> {\n return new Set([\n DataTypeExprKind.TIMESTAMPTZ,\n DataTypeExprKind.TIMESTAMPLTZ,\n ]);\n }\n\n /**\n * Comprehensive list of MySQL reserved keywords for identifier quoting.\n * Reference: https://dev.mysql.com/doc/refman/8.0/en/keywords.html\n */\n @cache\n static get RESERVED_KEYWORDS (): Set<string> {\n return new Set([\n 'accessible',\n 'add',\n 'all',\n 'alter',\n 'analyze',\n 'and',\n 'as',\n 'asc',\n 'asensitive',\n 'before',\n 'between',\n 'bigint',\n 'binary',\n 'blob',\n 'both',\n 'by',\n 'call',\n 'cascade',\n 'case',\n 'change',\n 'char',\n 'character',\n 'check',\n 'collate',\n 'column',\n 'condition',\n 'constraint',\n 'continue',\n 'convert',\n 'create',\n 'cross',\n 'cube',\n 'cume_dist',\n 'current_date',\n 'current_time',\n 'current_timestamp',\n 'current_user',\n 'cursor',\n 'database',\n 'databases',\n 'day_hour',\n 'day_microsecond',\n 'day_minute',\n 'day_second',\n 'dec',\n 'decimal',\n 'declare',\n 'default',\n 'delayed',\n 'delete',\n 'dense_rank',\n 'desc',\n 'describe',\n 'deterministic',\n 'distinct',\n 'distinctrow',\n 'div',\n 'double',\n 'drop',\n 'dual',\n 'each',\n 'else',\n 'elseif',\n 'empty',\n 'enclosed',\n 'escaped',\n 'except',\n 'exists',\n 'exit',\n 'explain',\n 'false',\n 'fetch',\n 'first_value',\n 'float',\n 'float4',\n 'float8',\n 'for',\n 'force',\n 'foreign',\n 'from',\n 'fulltext',\n 'function',\n 'generated',\n 'get',\n 'grant',\n 'group',\n 'grouping',\n 'groups',\n 'having',\n 'high_priority',\n 'hour_microsecond',\n 'hour_minute',\n 'hour_second',\n 'if',\n 'ignore',\n 'in',\n 'index',\n 'infile',\n 'inner',\n 'inout',\n 'insensitive',\n 'insert',\n 'int',\n 'int1',\n 'int2',\n 'int3',\n 'int4',\n 'int8',\n 'integer',\n 'intersect',\n 'interval',\n 'into',\n 'io_after_gtids',\n 'io_before_gtids',\n 'is',\n 'iterate',\n 'join',\n 'json_table',\n 'key',\n 'keys',\n 'kill',\n 'lag',\n 'last_value',\n 'lateral',\n 'lead',\n 'leading',\n 'leave',\n 'left',\n 'like',\n 'limit',\n 'linear',\n 'lines',\n 'load',\n 'localtime',\n 'localtimestamp',\n 'lock',\n 'long',\n 'longblob',\n 'longtext',\n 'loop',\n 'low_priority',\n 'master_bind',\n 'master_ssl_verify_server_cert',\n 'match',\n 'maxvalue',\n 'mediumblob',\n 'mediumint',\n 'mediumtext',\n 'middleint',\n 'minute_microsecond',\n 'minute_second',\n 'mod',\n 'modifies',\n 'natural',\n 'not',\n 'no_write_to_binlog',\n 'nth_value',\n 'ntile',\n 'undefined',\n 'numeric',\n 'of',\n 'on',\n 'optimize',\n 'optimizer_costs',\n 'option',\n 'optionally',\n 'or',\n 'order',\n 'out',\n 'outer',\n 'outfile',\n 'over',\n 'partition',\n 'percent_rank',\n 'precision',\n 'primary',\n 'procedure',\n 'purge',\n 'range',\n 'rank',\n 'read',\n 'reads',\n 'read_write',\n 'real',\n 'recursive',\n 'references',\n 'regexp',\n 'release',\n 'rename',\n 'repeat',\n 'replace',\n 'require',\n 'resignal',\n 'restrict',\n 'return',\n 'revoke',\n 'right',\n 'rlike',\n 'row',\n 'rows',\n 'row_number',\n 'schema',\n 'schemas',\n 'second_microsecond',\n 'select',\n 'sensitive',\n 'separator',\n 'set',\n 'show',\n 'signal',\n 'smallint',\n 'spatial',\n 'specific',\n 'sql',\n 'sqlexception',\n 'sqlstate',\n 'sqlwarning',\n 'sql_big_result',\n 'sql_calc_found_rows',\n 'sql_small_result',\n 'ssl',\n 'starting',\n 'stored',\n 'straight_join',\n 'system',\n 'table',\n 'terminated',\n 'then',\n 'tinyblob',\n 'tinyint',\n 'tinytext',\n 'to',\n 'trailing',\n 'trigger',\n 'true',\n 'undo',\n 'union',\n 'unique',\n 'unlock',\n 'unsigned',\n 'update',\n 'usage',\n 'use',\n 'using',\n 'utc_date',\n 'utc_time',\n 'utc_timestamp',\n 'values',\n 'varbinary',\n 'varchar',\n 'varcharacter',\n 'varying',\n 'virtual',\n 'when',\n 'where',\n 'while',\n 'window',\n 'with',\n 'write',\n 'xor',\n 'year_month',\n 'zerofill',\n ]);\n }\n\n public computedColumnConstraintSql (expression: ComputedColumnConstraintExpr): string {\n const persisted = expression.args.persisted ? 'STORED' : 'VIRTUAL';\n return `GENERATED ALWAYS AS (${this.sql(expression.args.this?.unnest())}) ${persisted}`;\n }\n\n public arraySql (expression: ArrayExpr): string {\n this.unsupported('Arrays are not supported by MySQL');\n return this.functionFallbackSql(expression);\n }\n\n public arrayContainsAllSql (expression: ArrayContainsAllExpr): string {\n this.unsupported('Array operations are not supported by MySQL');\n return this.functionFallbackSql(expression);\n }\n\n public dpipeSql (expression: DPipeExpr): string {\n return this.func('CONCAT', [\n ...expression.flatten(),\n ]);\n }\n\n public extractSql (expression: ExtractExpr): string {\n const unit = expression.name;\n if (unit && unit.toLowerCase() === 'epoch') {\n return this.func('UNIX_TIMESTAMP', [\n expression.args.expression as Expression,\n ]);\n }\n\n return super.extractSql(expression);\n }\n\n public dataTypeSql (expression: DataTypeExpr): string {\n if (\n (this.constructor as typeof MySQLGenerator).VARCHAR_REQUIRES_SIZE\n && expression.isType(DataTypeExprKind.VARCHAR)\n && !expression.args.expressions?.length\n ) {\n // `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT`\n return 'TEXT';\n }\n\n let result = super.dataTypeSql(expression);\n if (MySQLGenerator.UNSIGNED_TYPE_MAPPING.has(expression.args.this as DataTypeExprKind)) {\n result = `${result} UNSIGNED`;\n }\n\n return result;\n }\n\n public jsonArrayContainsSql (expression: JsonArrayContainsExpr): string {\n return `${this.sql(expression, 'this')} MEMBER OF(${this.sql(expression, 'expression')})`;\n }\n\n public castSql (expression: CastExpr, _options: {safePrefix?: string} = {}): string {\n const toExpr = expression.args.to;\n if (toExpr instanceof DataTypeExpr) {\n const toThis = toExpr.args.this as string;\n if ((this._constructor as typeof MySQLGenerator).TIMESTAMP_FUNC_TYPES.has(toThis)) {\n return this.func('TIMESTAMP', [\n expression.args.this as Expression,\n ]);\n }\n const to = (this._constructor as typeof MySQLGenerator).CAST_MAPPING[toThis];\n if (to) {\n toExpr.setArgKey('this', to);\n }\n }\n return super.castSql(expression);\n }\n\n public showSql (expression: ShowExpr): string {\n const thisName = ` ${expression.name}`;\n const full = expression.args.full ? ' FULL' : '';\n const global_ = expression.args.global ? ' GLOBAL' : '';\n\n let target = this.sql(expression, 'target');\n target = target ? ` ${target}` : '';\n\n if ([\n 'COLUMNS',\n 'INDEX',\n ].includes(expression.name)) {\n target = ` FROM${target}`;\n } else if (expression.name === 'GRANTS') {\n target = ` FOR${target}`;\n } else if ([\n 'LINKS',\n 'PARTITIONS',\n ].includes(expression.name)) {\n target = target ? ` ON${target}` : '';\n } else if (expression.name === 'PROJECTIONS') {\n target = target ? ` ON TABLE${target}` : '';\n }\n\n const db = this.prefixedSql('FROM', expression, 'db');\n const like = this.prefixedSql('LIKE', expression, 'like');\n const where = this.sql(expression, 'where');\n\n let types = this.expressions(expression, {\n key: 'types',\n });\n types = types ? ` ${types}` : types;\n const query = this.prefixedSql('FOR QUERY', expression, 'query');\n\n let offset = '';\n let limit = '';\n if (expression.name === 'PROFILE') {\n offset = this.prefixedSql('OFFSET', expression, 'offset');\n limit = this.prefixedSql('LIMIT', expression, 'limit');\n } else {\n limit = this.oldStyleLimitSql(expression);\n }\n\n const log = this.prefixedSql('IN', expression, 'log');\n const position = this.prefixedSql('FROM', expression, 'position');\n const channel = this.prefixedSql('FOR CHANNEL', expression, 'channel');\n\n let mutexOrStatus = '';\n if (expression.name === 'ENGINE') {\n mutexOrStatus = expression.args.mutex ? ' MUTEX' : ' STATUS';\n }\n\n const forTable = this.prefixedSql('FOR TABLE', expression, 'forTable');\n const forGroup = this.prefixedSql('FOR GROUP', expression, 'forGroup');\n const forUser = this.prefixedSql('FOR USER', expression, 'forUser');\n const forRole = this.prefixedSql('FOR ROLE', expression, 'forRole');\n const intoOutfile = this.prefixedSql('INTO OUTFILE', expression, 'intoOutfile');\n const json = expression.args.json ? ' JSON' : '';\n\n return `SHOW${full}${global_}${thisName}${json}${target}${forTable}${types}${db}${query}${log}${position}${channel}${mutexOrStatus}${like}${where}${offset}${limit}${forGroup}${forUser}${forRole}${intoOutfile}`;\n }\n\n /**\n * MySQL doesn't use the TO keyword in ALTER ... RENAME.\n */\n public alterRenameSql (expression: AlterRenameExpr, _options: {includeTo?: boolean} = {}): string {\n return super.alterRenameSql(expression, {\n includeTo: false,\n });\n }\n\n /**\n * MySQL uses MODIFY COLUMN for changing column data types.\n */\n public alterColumnSql (expression: AlterColumnExpr): string {\n const dtype = this.sql(expression, 'dtype');\n if (!dtype) {\n return super.alterColumnSql(expression);\n }\n\n const thisExpr = this.sql(expression, 'this');\n return `MODIFY COLUMN ${thisExpr} ${dtype}`;\n }\n\n protected prefixedSql (prefix: string, expression: Expression, arg: string): string {\n const sql = this.sql(expression, arg);\n return sql ? ` ${prefix} ${sql}` : '';\n }\n\n protected oldStyleLimitSql (expression: ShowExpr): string {\n const limit = this.sql(expression, 'limit');\n const offset = this.sql(expression, 'offset');\n if (limit) {\n const limitOffset = offset ? `${offset}, ${limit}` : limit;\n return ` LIMIT ${limitOffset}`;\n }\n return '';\n }\n\n /**\n * Simulates TIMESTAMP_TRUNC using TIMESTAMPDIFF and DATE_ADD math.\n */\n public timestampTruncSql (expression: TimestampTruncExpr): string {\n const unit = expression.args.unit;\n const startTs = '\\'0000-01-01 00:00:00\\'';\n\n // Calculate diff between 0000-01-01 and target, then add that interval back to the base\n const timestampDiff = buildDateDelta(TimestampDiffExpr)([\n unit as Expression,\n new LiteralExpr({\n this: startTs,\n isString: true,\n }),\n expression.args.this as Expression,\n ]);\n const interval = new IntervalExpr({\n this: timestampDiff,\n unit: unit,\n });\n const dateAdd = buildDateDeltaWithInterval(DateAddExpr)([\n new LiteralExpr({\n this: startTs,\n isString: true,\n }),\n interval,\n ]);\n\n return this.sql(dateAdd);\n }\n\n public convertTimezoneSql (expression: ConvertTimezoneExpr): string {\n const fromTz = expression.args.sourceTz;\n const toTz = expression.args.targetTz;\n const dt = expression.args.timestamp;\n\n return this.func('CONVERT_TZ', [\n dt,\n fromTz,\n toTz,\n ] as Expression[]);\n }\n\n public attimezoneSql (expression: AtTimeZoneExpr): string {\n this.unsupported('AT TIME ZONE is not supported by MySQL');\n return this.sql(expression.args.this);\n }\n\n public isasciiSql (expression: IsAsciiExpr): string {\n return `REGEXP_LIKE(${this.sql(expression.args.this)}, '^[[:ascii:]]*$')`;\n }\n\n public ignoreNullsSql (expression: IgnoreNullsExpr): string {\n this.unsupported('MySQL does not support IGNORE NULLS.');\n return this.sql(expression.args.this);\n }\n\n public currentSchemaSql (_expression: CurrentSchemaExpr): string {\n unsupportedArgs.call(this, _expression, 'this');\n return this.func('SCHEMA', [\n ]);\n }\n\n public partitionSql (expression: PartitionExpr): string {\n const parent = expression.parent;\n if (parent instanceof PartitionByRangePropertyExpr || parent instanceof PartitionByListPropertyExpr) {\n return this.expressions(expression, {\n flat: true,\n });\n }\n return super.partitionSql(expression);\n }\n\n public partitionByRangeOrListSql (\n expression: PartitionByRangePropertyExpr | PartitionByListPropertyExpr,\n kind: string,\n ): string {\n const partitions = this.expressions(expression, {\n key: 'partitionExpressions',\n flat: true,\n });\n const create = this.expressions(expression, {\n key: 'createExpressions',\n flat: true,\n });\n return `PARTITION BY ${kind} (${partitions}) (${create})`;\n }\n\n public partitionByRangePropertySql (expression: PartitionByRangePropertyExpr): string {\n return this.partitionByRangeOrListSql(expression, 'RANGE');\n }\n\n public partitionByListPropertySql (expression: PartitionByListPropertyExpr): string {\n return this.partitionByRangeOrListSql(expression, 'LIST');\n }\n\n public partitionListSql (expression: PartitionListExpr): string {\n const name = this.sql(expression, 'this');\n const values = this.expressions(expression, {\n flat: true,\n });\n return `PARTITION ${name} VALUES IN (${values})`;\n }\n\n public partitionRangeSql (expression: PartitionRangeExpr): string {\n const name = this.sql(expression, 'this');\n const values = this.expressions(expression, {\n flat: true,\n });\n return `PARTITION ${name} VALUES LESS THAN (${values})`;\n }\n}\n\nexport class MySQL extends Dialect {\n static DIALECT_NAME = Dialects.MYSQL;\n static PROMOTE_TO_INFERRED_DATETIME_TYPE: boolean = true;\n\n // MySQL allows identifiers to start with digits if they are quoted or in specific contexts\n // Reference: https://dev.mysql.com/doc/refman/8.0/en/identifiers.html\n static IDENTIFIERS_CAN_START_WITH_DIGIT: boolean = true;\n\n /**\n * We default to treating all identifiers as case-sensitive, since it matches MySQL's\n * behavior on Linux systems. For MacOS and Windows systems, one can override this\n * setting by specifying `dialect=\"mysql, normalization_strategy = lowercase\"`.\n * * Reference: https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html\n */\n @cache\n static get NORMALIZATION_STRATEGY (): NormalizationStrategy {\n return NormalizationStrategy.CASE_SENSITIVE;\n }\n\n static TIME_FORMAT: string = '\\'%Y-%m-%d %T\\'';\n static DPIPE_IS_STRING_CONCAT: boolean = false;\n static SUPPORTS_USER_DEFINED_TYPES: boolean = false;\n static SUPPORTS_SEMI_ANTI_JOIN: boolean = false;\n static SAFE_DIVISION: boolean = true;\n static SAFE_TO_ELIMINATE_DOUBLE_NEGATION: boolean = false;\n static LEAST_GREATEST_IGNORES_NULLS: boolean = false;\n\n @cache\n static get EXPRESSION_METADATA (): ExpressionMetadata {\n return new Map(MySQLTyping.EXPRESSION_METADATA);\n }\n\n /**\n * MySQL-specific time format mapping.\n * Reference: https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions\n */\n @cache\n static get TIME_MAPPING (): Record<string, string> {\n return {\n '%M': '%B',\n '%c': '%-m',\n '%e': '%-d',\n '%h': '%I',\n '%i': '%M',\n '%s': '%S',\n '%u': '%W',\n '%k': '%-H',\n '%l': '%-I',\n '%T': '%H:%M:%S',\n '%W': '%A',\n };\n }\n\n /**\n * Valid interval units supported by MySQL.\n * Includes standard units plus MySQL-specific compound units.\n */\n @cache\n static get VALID_INTERVAL_UNITS () {\n return new Set([\n ...Dialect.VALID_INTERVAL_UNITS,\n 'SECOND_MICROSECOND',\n 'MINUTE_MICROSECOND',\n 'MINUTE_SECOND',\n 'HOUR_MICROSECOND',\n 'HOUR_SECOND',\n 'HOUR_MINUTE',\n 'DAY_MICROSECOND',\n 'DAY_SECOND',\n 'DAY_MINUTE',\n 'DAY_HOUR',\n 'YEAR_MONTH',\n ]);\n }\n\n static Tokenizer = MySQLTokenizer;\n static Parser = MySQLParser;\n static Generator = MySQLGenerator;\n}\nDialect.register(Dialects.MYSQL, MySQL);\n"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkYSS2WVCMcjs = require('./chunk-YSS2WVCM.cjs');var _chunk2Z3O2CFMcjs = require('./chunk-2Z3O2CFM.cjs');var B,$,P,R=class extends($=_chunkYSS2WVCMcjs.q.Tokenizer,B=[_chunk2Z3O2CFMcjs.r],$){static get ORIGINAL_KEYWORDS(){return{..._chunkYSS2WVCMcjs.q.Tokenizer.KEYWORDS,REFRESH:"refresh"}}};P=_chunk2Z3O2CFMcjs.a.call(void 0, $),_chunk2Z3O2CFMcjs.d.call(void 0, P,10,"ORIGINAL_KEYWORDS",B,R),_chunk2Z3O2CFMcjs.b.call(void 0, P,R),_chunk2Z3O2CFMcjs.c.call(void 0, P,3,R);var k,v,X,Z,z,tt,et,a,i=class extends(et=_chunkYSS2WVCMcjs.q.Parser,tt=[_chunk2Z3O2CFMcjs.r],z=[_chunk2Z3O2CFMcjs.r],Z=[_chunk2Z3O2CFMcjs.r],X=[_chunk2Z3O2CFMcjs.r],v=[_chunk2Z3O2CFMcjs.r],k=[_chunk2Z3O2CFMcjs.r],et){static get ID_VAR_TOKENS(){return new Set([..._chunkYSS2WVCMcjs.q.Parser.ID_VAR_TOKENS,"sessionUser","straightJoin"])}static get NO_PAREN_FUNCTIONS(){let t={..._chunkYSS2WVCMcjs.q.Parser.NO_PAREN_FUNCTIONS};return t.currentCatalog=_chunk2Z3O2CFMcjs.lh,t}static get FUNCTIONS(){return{..._chunkYSS2WVCMcjs.q.Parser.FUNCTIONS,VERSION:t=>_chunk2Z3O2CFMcjs.Yg.fromArgList(t)}}static get FUNCTION_PARSERS(){return{..._chunkYSS2WVCMcjs.q.Parser.FUNCTION_PARSERS,TRIM:function(){return this.parseTrim()},JSON_QUERY:function(){return this.parseJsonQuery()},JSON_VALUE:function(){return this.parseJsonValue()},LISTAGG:function(){return this.parseStringAgg()}}}static get JSON_QUERY_OPTIONS(){return{WITH:[["WRAPPER"],["ARRAY","WRAPPER"],["CONDITIONAL","WRAPPER"],["CONDITIONAL","ARRAY","WRAPPED"],["UNCONDITIONAL","WRAPPER"],["UNCONDITIONAL","ARRAY","WRAPPER"]],WITHOUT:[["WRAPPER"],["ARRAY","WRAPPER"],["CONDITIONAL","WRAPPER"],["CONDITIONAL","ARRAY","WRAPPED"],["UNCONDITIONAL","WRAPPER"],["UNCONDITIONAL","ARRAY","WRAPPER"]]}}parseJsonQueryQuote(){if(this.matchTextSeq(["KEEP","QUOTES"])||this.matchTextSeq(["OMIT","QUOTES"]))return this.expression(_chunk2Z3O2CFMcjs.wc,{option:this.tokens[this.index-2].text.toUpperCase(),scalar:this.matchTextSeq(["ON","SCALAR","STRING"])})}parseJsonQuery(){return this.expression(_chunk2Z3O2CFMcjs.uj,{this:this.parseBitwise(),expression:this.match("comma")?this.parseBitwise():void 0,option:this.parseVarFromOptions(this._constructor.JSON_QUERY_OPTIONS,{raiseUnmatched:!1}),jsonQuery:!0,quote:this.parseJsonQueryQuote(),onCondition:this.parseOnCondition()})}static get TABLE_ALIAS_TOKENS(){return new Set([..._chunkYSS2WVCMcjs.q.Parser.TABLE_ALIAS_TOKENS,"straightJoin"])}};a=_chunk2Z3O2CFMcjs.a.call(void 0, et),_chunk2Z3O2CFMcjs.d.call(void 0, a,10,"ID_VAR_TOKENS",tt,i),_chunk2Z3O2CFMcjs.d.call(void 0, a,10,"NO_PAREN_FUNCTIONS",z,i),_chunk2Z3O2CFMcjs.d.call(void 0, a,10,"FUNCTIONS",Z,i),_chunk2Z3O2CFMcjs.d.call(void 0, a,10,"FUNCTION_PARSERS",X,i),_chunk2Z3O2CFMcjs.d.call(void 0, a,10,"JSON_QUERY_OPTIONS",v,i),_chunk2Z3O2CFMcjs.d.call(void 0, a,10,"TABLE_ALIAS_TOKENS",k,i),_chunk2Z3O2CFMcjs.b.call(void 0, a,i),_chunk2Z3O2CFMcjs.c.call(void 0, a,3,i);var rt,st,it,nt,ot,E,n=class extends(ot=_chunkYSS2WVCMcjs.q.Generator,nt=[_chunk2Z3O2CFMcjs.r],it=[_chunk2Z3O2CFMcjs.r],st=[_chunk2Z3O2CFMcjs.r],rt=[_chunk2Z3O2CFMcjs.r],ot){static get AFTER_HAVING_MODIFIER_TRANSFORMS(){let t=new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);return["cluster","distribute","sort"].forEach(u=>t.delete(u)),t}static get PROPERTIES_LOCATION(){return new Map([..._chunkYSS2WVCMcjs.q.Generator.PROPERTIES_LOCATION,[_chunk2Z3O2CFMcjs.pd,"postWith"]])}static get ORIGINAL_TRANSFORMS(){return new Map([..._chunkYSS2WVCMcjs.q.Generator.TRANSFORMS,[_chunk2Z3O2CFMcjs.zg,function(t){return`REDUCE(${this.sql(t,"this")}, 0, (acc, x) -> acc + x, acc -> acc)`}],[_chunk2Z3O2CFMcjs.Om,function(t){return`ARRAY_AGG(DISTINCT ${this.sql(t,"this")})`}],[_chunk2Z3O2CFMcjs.Yg,_chunk2Z3O2CFMcjs.pp.call(void 0, "VERSION")],[_chunk2Z3O2CFMcjs.in,function(t){return _chunk2Z3O2CFMcjs.Qq.call(this,t,{onOverflow:!0})}],[_chunk2Z3O2CFMcjs.pd,function(t){return this.propertySql(t)}],[_chunk2Z3O2CFMcjs.me,_chunk2Z3O2CFMcjs.yq],[_chunk2Z3O2CFMcjs.Wd,_chunk2Z3O2CFMcjs.Po.call(void 0, [_chunk2Z3O2CFMcjs.To,_chunk2Z3O2CFMcjs.So,_chunk2Z3O2CFMcjs.Yo.call(void 0, 1),_chunk2Z3O2CFMcjs.bp,_chunkYSS2WVCMcjs.p])],[_chunk2Z3O2CFMcjs.Kl,function(t){return _chunk2Z3O2CFMcjs.Wp.call(this,t,{includePrecision:!0})}],[_chunk2Z3O2CFMcjs.Ml,_chunk2Z3O2CFMcjs.bq]])}static get SUPPORTED_JSON_PATH_PARTS(){return new Set([_chunk2Z3O2CFMcjs.ie,_chunk2Z3O2CFMcjs.je,_chunk2Z3O2CFMcjs.ke])}jsonExtractSql(t){if(!t.args.jsonQuery)return super.jsonExtractSql(t);let u=this.sql(t,"expression"),T=this.sql(t,"option"),at=T?` ${T}`:"",h=this.sql(t,"quote"),Et=h?` ${h}`:"",_=this.sql(t,"onCondition"),Rt=_?` ${_}`:"";return this.func("JSON_QUERY",[t.args.this,u+at+Et+Rt])}};E=_chunk2Z3O2CFMcjs.a.call(void 0, ot),_chunk2Z3O2CFMcjs.d.call(void 0, E,10,"AFTER_HAVING_MODIFIER_TRANSFORMS",nt,n),_chunk2Z3O2CFMcjs.d.call(void 0, E,10,"PROPERTIES_LOCATION",it,n),_chunk2Z3O2CFMcjs.d.call(void 0, E,10,"ORIGINAL_TRANSFORMS",st,n),_chunk2Z3O2CFMcjs.d.call(void 0, E,10,"SUPPORTED_JSON_PATH_PARTS",rt,n),_chunk2Z3O2CFMcjs.b.call(void 0, E,n),_chunk2Z3O2CFMcjs.c.call(void 0, E,3,n),n.SUPPORTS_DECODE_CASE=!1,n.EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE=!0;var o=class extends _chunkYSS2WVCMcjs.q{};o.DIALECT_NAME="trino",o.SUPPORTS_USER_DEFINED_TYPES=!1,o.LOG_BASE_FIRST=!0,o.Tokenizer=R,o.Parser=i,o.Generator=n;_chunk2Z3O2CFMcjs.op.register("trino",o);exports.a = o;
2
+ //# sourceMappingURL=chunk-UHWHUDLE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/huydna/projects/sqlingo.js/dist/chunk-UHWHUDLE.cjs","../src/dialects/trino.ts"],"names":["_ORIGINAL_KEYWORDS_dec","_a","_init","TrinoTokenizer","Presto","cache","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","_TABLE_ALIAS_TOKENS_dec","_JSON_QUERY_OPTIONS_dec","_FUNCTION_PARSERS_dec","_FUNCTIONS_dec","_NO_PAREN_FUNCTIONS_dec","_ID_VAR_TOKENS_dec","TrinoParser","noParenFunctions","CurrentCatalogExpr","args","CurrentVersionExpr","JsonExtractQuoteExpr","JsonExtractExpr","_SUPPORTED_JSON_PATH_PARTS_dec","_ORIGINAL_TRANSFORMS_dec","_PROPERTIES_LOCATION_dec","_AFTER_HAVING_MODIFIER_TRANSFORMS_dec","TrinoGenerator","modifiers","m","LocationPropertyExpr","ArraySumExpr","e","ArrayUniqueAggExpr","renameFunc","GroupConcatExpr","groupConcatSql","MergeExpr","mergeWithoutTargetSql","SelectExpr","preprocess","eliminateQualify","eliminateDistinctOn","explodeProjectionToUnnest","eliminateSemiAndAntiJoins","amendExplodedColumnTable","TimeStrToTimeExpr","timeStrToTimeSql","TrimExpr","trimSql","JsonPathKeyExpr","JsonPathRootExpr","JsonPathSubscriptExpr","expression","jsonPath","option","optionStr"],"mappings":"AAAA,iIAA+C,wDAAqR,ICApUA,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CA4CMC,CAAAA,CAAN,MAAA,OAAA,CAA6BF,CAAAA,CAAAG,mBAAAA,CAAO,SAAA,CAClCJ,CAAAA,CAAA,CAACK,mBAAAA,CAAAA,CAD0BJ,CAAAA,CAAiB,CAE5C,OAAA,IAAW,iBAAA,CAAA,CAAgD,CACzD,MAAO,CACL,GAAGG,mBAAAA,CAAO,SAAA,CAAU,QAAA,CACpB,OAAA,CAAA,SACF,CACF,CACF,CAAA,CARAF,CAAAA,CAAAI,iCAAAA,CAAAL,CAAAA,CAEEM,iCAAAA,CAAAL,CAAA,EAAA,CAAW,mBAAA,CADXF,CAAAA,CADIG,CAAAA,CAAAA,CAANK,iCAAAA,CAAAN,CAAMC,CAAAA,CAAAA,CAANM,iCAAAA,CAAAP,CAAA,CAAA,CAAMC,CAAAA,CAAAA,CA5CN,IAAAO,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CAAAC,EAAAA,CAAAd,EAAAA,CAAAC,CAAAA,CAsDMc,CAAAA,CAAN,MAAA,OAAA,CAA0Bf,EAAAA,CAAAG,mBAAAA,CAAO,MAAA,CAE/BW,EAAAA,CAAA,CAACV,mBAAAA,CAAAA,CAUDS,CAAAA,CAAA,CAACT,mBAAAA,CAAAA,CASDQ,CAAAA,CAAA,CAACR,mBAAAA,CAAAA,CAQDO,CAAAA,CAAA,CAACP,mBAAAA,CAAAA,CAmBDM,CAAAA,CAAA,CAACN,mBAAAA,CAAAA,CAsGDK,CAAAA,CAAA,CAACL,mBAAAA,CAAAA,CAtJuBJ,EAAAA,CAAc,CAGtC,OAAA,IAAW,aAAA,CAAA,CAAiC,CAC1C,OAAO,IAAI,GAAA,CAAI,CACb,GAAGG,mBAAAA,CAAO,MAAA,CAAO,aAAA,CAAA,aAAA,CAAA,cAGnB,CAAC,CACH,CAIA,OAAA,IAAW,kBAAA,CAAA,CAAsB,CAC/B,IAAMa,CAAAA,CAAmB,CACvB,GAAGb,mBAAAA,CAAO,MAAA,CAAO,kBACnB,CAAA,CACA,OAAAa,CAAAA,CAAiB,cAAA,CAA6BC,oBAAAA,CACvCD,CACT,CAGA,OAAA,IAAW,SAAA,CAAA,CAA8F,CACvG,MAAO,CACL,GAAGb,mBAAAA,CAAO,MAAA,CAAO,SAAA,CACjB,OAAA,CAAUe,CAAAA,EAAuBC,oBAAAA,CAAmB,WAAA,CAAYD,CAAI,CACtE,CACF,CAGA,OAAA,IAAW,gBAAA,CAAA,CAAuF,CAChG,MAAO,CACL,GAAGf,mBAAAA,CAAO,MAAA,CAAO,gBAAA,CACjB,IAAA,CAAM,QAAA,CAAA,CAAwB,CAC5B,OAAO,IAAA,CAAK,SAAA,CAAU,CACxB,CAAA,CACA,UAAA,CAAY,QAAA,CAAA,CAAwB,CAClC,OAAQ,IAAA,CAAqB,cAAA,CAAe,CAC9C,CAAA,CACA,UAAA,CAAY,QAAA,CAAA,CAAwB,CAClC,OAAO,IAAA,CAAK,cAAA,CAAe,CAC7B,CAAA,CACA,OAAA,CAAS,QAAA,CAAA,CAAwB,CAC/B,OAAO,IAAA,CAAK,cAAA,CAAe,CAC7B,CACF,CACF,CAGA,OAAA,IAAW,kBAAA,CAAA,CAAkD,CAC3D,MAAO,CACL,IAAA,CAAM,CACJ,CACE,SACF,CAAA,CACA,CACE,OAAA,CACA,SACF,CAAA,CACA,CACE,aAAA,CACA,SACF,CAAA,CACA,CACE,aAAA,CACA,OAAA,CACA,SACF,CAAA,CACA,CACE,eAAA,CACA,SACF,CAAA,CACA,CACE,eAAA,CACA,OAAA,CACA,SACF,CACF,CAAA,CACA,OAAA,CAAS,CACP,CACE,SACF,CAAA,CACA,CACE,OAAA,CACA,SACF,CAAA,CACA,CACE,aAAA,CACA,SACF,CAAA,CACA,CACE,aAAA,CACA,OAAA,CACA,SACF,CAAA,CACA,CACE,eAAA,CACA,SACF,CAAA,CACA,CACE,eAAA,CACA,OAAA,CACA,SACF,CACF,CACF,CACF,CAEO,mBAAA,CAAA,CAAyD,CAC9D,EAAA,CACI,IAAA,CAAK,YAAA,CAAa,CAClB,MAAA,CACA,QACF,CAAC,CAAA,EAAK,IAAA,CAAK,YAAA,CAAa,CACtB,MAAA,CACA,QACF,CAAC,CAAA,CAOH,OAAO,IAAA,CAAK,UAAA,CAAWiB,oBAAAA,CAAsB,CAC3C,MAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,WAAA,CAAY,CAAA,CACrD,MAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,CACxB,IAAA,CACA,QAAA,CACA,QACF,CAAC,CACH,CAAC,CACH,CAEO,cAAA,CAAA,CAAmC,CACxC,OAAO,IAAA,CAAK,UAAA,CAAWC,oBAAAA,CAAiB,CACtC,IAAA,CAAM,IAAA,CAAK,YAAA,CAAa,CAAA,CACxB,UAAA,CAAY,IAAA,CAAK,KAAA,CAAA,OAAqB,CAAA,CAAI,IAAA,CAAK,YAAA,CAAa,CAAA,CAAI,KAAA,CAAA,CAChE,MAAA,CAAQ,IAAA,CAAK,mBAAA,CACV,IAAA,CAAK,YAAA,CAAoC,kBAAA,CAC1C,CACE,cAAA,CAAgB,CAAA,CAClB,CACF,CAAA,CACA,SAAA,CAAW,CAAA,CAAA,CACX,KAAA,CAAO,IAAA,CAAK,mBAAA,CAAoB,CAAA,CAChC,WAAA,CAAa,IAAA,CAAK,gBAAA,CAAiB,CACrC,CAAC,CACH,CAIA,OAAA,IAAW,kBAAA,CAAA,CAAsC,CAC/C,OAAO,IAAI,GAAA,CAAI,CACb,GAAGlB,mBAAAA,CAAO,MAAA,CAAO,kBAAA,CAAA,cAEnB,CAAC,CACH,CACF,CAAA,CA7JAF,CAAAA,CAAAI,iCAAAA,EAAAL,CAAAA,CAGEM,iCAAAA,CAAAL,CAAA,EAAA,CAAW,eAAA,CADXa,EAAAA,CAFIC,CAAAA,CAAAA,CAaJT,iCAAAA,CAAAL,CAAA,EAAA,CAAW,oBAAA,CADXY,CAAAA,CAZIE,CAAAA,CAAAA,CAsBJT,iCAAAA,CAAAL,CAAA,EAAA,CAAW,WAAA,CADXW,CAAAA,CArBIG,CAAAA,CAAAA,CA8BJT,iCAAAA,CAAAL,CAAA,EAAA,CAAW,kBAAA,CADXU,CAAAA,CA7BII,CAAAA,CAAAA,CAiDJT,iCAAAA,CAAAL,CAAA,EAAA,CAAW,oBAAA,CADXS,CAAAA,CAhDIK,CAAAA,CAAAA,CAuJJT,iCAAAA,CAAAL,CAAA,EAAA,CAAW,oBAAA,CADXQ,CAAAA,CAtJIM,CAAAA,CAAAA,CAANR,iCAAAA,CAAAN,CAAMc,CAAAA,CAAAA,CAANP,iCAAAA,CAAAP,CAAA,CAAA,CAAMc,CAAAA,CAAAA,CAtDN,IAAAO,EAAAA,CAAAC,EAAAA,CAAAC,EAAAA,CAAAC,EAAAA,CAAAzB,EAAAA,CAAAC,CAAAA,CAqNMyB,CAAAA,CAAN,MAAA,OAAA,CAA6B1B,EAAAA,CAAAG,mBAAAA,CAAO,SAAA,CAMlCsB,EAAAA,CAAA,CAACrB,mBAAAA,CAAAA,CAWDoB,EAAAA,CAAA,CAACpB,mBAAAA,CAAAA,CAWDmB,EAAAA,CAAA,CAACnB,mBAAAA,CAAAA,CAiEDkB,EAAAA,CAAA,CAAClB,mBAAAA,CAAAA,CA7F0BJ,EAAAA,CAAiB,CAO5C,OAAA,IAAW,gCAAA,CAAA,CAAoC,CAC7C,IAAM2B,CAAAA,CAAY,IAAI,GAAA,CAAI,KAAA,CAAM,gCAAgC,CAAA,CAChE,MAAA,CACE,SAAA,CACA,YAAA,CACA,MACF,CAAA,CAAE,OAAA,CAASC,CAAAA,EAAMD,CAAAA,CAAU,MAAA,CAAOC,CAAC,CAAC,CAAA,CAC7BD,CACT,CAGA,OAAA,IAAW,mBAAA,CAAA,CAAmE,CAC5E,OAAO,IAAI,GAAA,CAAI,CACb,GAAGxB,mBAAAA,CAAO,SAAA,CAAU,mBAAA,CACpB,CACE0B,oBAAAA,CAAAA,UAEF,CACF,CAAC,CACH,CAIA,OAAA,IAAW,mBAAA,CAAA,CAAoF,CAE7F,OAAO,IAAI,GAAA,CAA4D,CACrE,GAAG1B,mBAAAA,CAAO,SAAA,CAAU,UAAA,CACpB,CACE2B,oBAAAA,CACA,QAAA,CAA2BC,CAAAA,CAAG,CAC5B,MAAO,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAG,MAAM,CAAC,CAAA,qCAAA,CACtC,CACF,CAAA,CACA,CACEC,oBAAAA,CACA,QAAA,CAA2BD,CAAAA,CAAG,CAC5B,MAAO,CAAA,mBAAA,EAAsB,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAG,MAAM,CAAC,CAAA,CAAA,CAClD,CACF,CAAA,CACA,CACEZ,oBAAAA,CACAc,kCAAAA,SAAoB,CACtB,CAAA,CACA,CACEC,oBAAAA,CACA,QAAA,CAA2BH,CAAAA,CAAG,CAC5B,OAAOI,oBAAAA,CAAe,IAAA,CAAK,IAAA,CAAMJ,CAAAA,CAAG,CAClC,UAAA,CAAY,CAAA,CACd,CAAC,CACH,CACF,CAAA,CACA,CACEF,oBAAAA,CACA,QAAA,CAA2BE,CAAAA,CAAG,CAC5B,OAAO,IAAA,CAAK,WAAA,CAAYA,CAAC,CAC3B,CACF,CAAA,CACA,CACEK,oBAAAA,CACAC,oBACF,CAAA,CACA,CACEC,oBAAAA,CACAC,kCAAAA,CACEC,oBAAAA,CACAC,oBAAAA,CACAC,kCAAAA,CAA2B,CAAA,CAC3BC,oBAAAA,CACAC,mBACF,CAAC,CACH,CAAA,CACA,CACEC,oBAAAA,CACA,QAAA,CAA2Bd,CAAAA,CAAG,CAC5B,OAAOe,oBAAAA,CAAiB,IAAA,CAAK,IAAA,CAAMf,CAAAA,CAAG,CACpC,gBAAA,CAAkB,CAAA,CACpB,CAAC,CACH,CACF,CAAA,CACA,CACEgB,oBAAAA,CACAC,oBACF,CACF,CAAC,CACH,CAGA,OAAA,IAAW,yBAAA,CAAA,CAAqD,CAC9D,OAAO,IAAI,GAAA,CAAI,CACbC,oBAAAA,CACAC,oBAAAA,CACAC,oBACF,CAAC,CACH,CAEO,cAAA,CAAgBC,CAAAA,CAAqC,CAC1D,EAAA,CAAI,CAACA,CAAAA,CAAW,IAAA,CAAK,SAAA,CACnB,OAAO,KAAA,CAAM,cAAA,CAAeA,CAAU,CAAA,CAGxC,IAAMC,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAY,YAAY,CAAA,CAC5CE,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAIF,CAAAA,CAAY,QAAQ,CAAA,CACtCG,EAAAA,CAAYD,CAAAA,CAAS,CAAA,CAAA,EAAIA,CAAM,CAAA,CAAA","file":"/home/huydna/projects/sqlingo.js/dist/chunk-UHWHUDLE.cjs","sourcesContent":[null,"import {\n cache,\n} from '../port_internals';\nimport type {\n Expression,\n} from '../expressions';\nimport {\n JsonExtractExpr, JsonExtractQuoteExpr,\n CurrentVersionExpr,\n LocationPropertyExpr,\n ArraySumExpr,\n ArrayUniqueAggExpr,\n GroupConcatExpr,\n PropertiesLocation,\n MergeExpr,\n SelectExpr,\n TimeStrToTimeExpr,\n TrimExpr,\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n CurrentCatalogExpr,\n} from '../expressions';\nimport type {\n Generator,\n} from '../generator';\nimport type {\n Parser,\n} from '../parser';\nimport {\n TokenType,\n} from '../tokens';\nimport {\n eliminateDistinctOn, eliminateQualify, eliminateSemiAndAntiJoins, explodeProjectionToUnnest, preprocess,\n} from '../transforms';\nimport {\n Dialect,\n Dialects,\n groupConcatSql, mergeWithoutTargetSql, renameFunc, timeStrToTimeSql, trimSql,\n} from './dialect';\nimport {\n Presto, amendExplodedColumnTable,\n} from './presto';\n\nclass TrinoTokenizer extends Presto.Tokenizer {\n @cache\n static get ORIGINAL_KEYWORDS (): Record<string, TokenType> {\n return {\n ...Presto.Tokenizer.KEYWORDS,\n REFRESH: TokenType.REFRESH,\n };\n }\n}\n\nclass TrinoParser extends Presto.Parser {\n // port from _Dialect metaclass logic\n @cache\n static get ID_VAR_TOKENS (): Set<TokenType> {\n return new Set([\n ...Presto.Parser.ID_VAR_TOKENS,\n TokenType.SESSION_USER,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n\n // port from _Dialect metaclass logic\n @cache\n static get NO_PAREN_FUNCTIONS () {\n const noParenFunctions = {\n ...Presto.Parser.NO_PAREN_FUNCTIONS,\n };\n noParenFunctions[TokenType.CURRENT_CATALOG] = CurrentCatalogExpr;\n return noParenFunctions;\n }\n\n @cache\n static get FUNCTIONS (): Record<string, (args: Expression[], options: {dialect: Dialect}) => Expression> {\n return {\n ...Presto.Parser.FUNCTIONS,\n VERSION: (args: Expression[]) => CurrentVersionExpr.fromArgList(args),\n };\n }\n\n @cache\n static get FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return {\n ...Presto.Parser.FUNCTION_PARSERS,\n TRIM: function (this: Parser) {\n return this.parseTrim();\n },\n JSON_QUERY: function (this: Parser) {\n return (this as TrinoParser).parseJsonQuery();\n },\n JSON_VALUE: function (this: Parser) {\n return this.parseJsonValue();\n },\n LISTAGG: function (this: Parser) {\n return this.parseStringAgg();\n },\n };\n }\n\n @cache\n static get JSON_QUERY_OPTIONS (): Record<string, string[][]> {\n return {\n WITH: [\n [\n 'WRAPPER',\n ],\n [\n 'ARRAY',\n 'WRAPPER',\n ],\n [\n 'CONDITIONAL',\n 'WRAPPER',\n ],\n [\n 'CONDITIONAL',\n 'ARRAY',\n 'WRAPPED',\n ],\n [\n 'UNCONDITIONAL',\n 'WRAPPER',\n ],\n [\n 'UNCONDITIONAL',\n 'ARRAY',\n 'WRAPPER',\n ],\n ],\n WITHOUT: [\n [\n 'WRAPPER',\n ],\n [\n 'ARRAY',\n 'WRAPPER',\n ],\n [\n 'CONDITIONAL',\n 'WRAPPER',\n ],\n [\n 'CONDITIONAL',\n 'ARRAY',\n 'WRAPPED',\n ],\n [\n 'UNCONDITIONAL',\n 'WRAPPER',\n ],\n [\n 'UNCONDITIONAL',\n 'ARRAY',\n 'WRAPPER',\n ],\n ],\n };\n }\n\n public parseJsonQueryQuote (): JsonExtractQuoteExpr | undefined {\n if (\n !(this.matchTextSeq([\n 'KEEP',\n 'QUOTES',\n ]) || this.matchTextSeq([\n 'OMIT',\n 'QUOTES',\n ]))\n ) {\n return undefined;\n }\n\n // If matched, _matchTextSeq advanced the index by 2 tokens.\n // We look back to grab the KEEP or OMIT text.\n return this.expression(JsonExtractQuoteExpr, {\n option: this.tokens[this.index - 2].text.toUpperCase(),\n scalar: this.matchTextSeq([\n 'ON',\n 'SCALAR',\n 'STRING',\n ]),\n });\n }\n\n public parseJsonQuery (): JsonExtractExpr {\n return this.expression(JsonExtractExpr, {\n this: this.parseBitwise(),\n expression: this.match(TokenType.COMMA) ? this.parseBitwise() : undefined,\n option: this.parseVarFromOptions(\n (this._constructor as typeof TrinoParser).JSON_QUERY_OPTIONS,\n {\n raiseUnmatched: false,\n },\n ),\n jsonQuery: true,\n quote: this.parseJsonQueryQuote(),\n onCondition: this.parseOnCondition(),\n });\n }\n\n // port from _Dialect metaclass logic\n @cache\n static get TABLE_ALIAS_TOKENS (): Set<TokenType> {\n return new Set([\n ...Presto.Parser.TABLE_ALIAS_TOKENS,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n}\n\nclass TrinoGenerator extends Presto.Generator {\n // port from _Dialect metaclass logic\n static SUPPORTS_DECODE_CASE = false;\n static EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE = true;\n\n // port from _Dialect metaclass logic\n @cache\n static get AFTER_HAVING_MODIFIER_TRANSFORMS () {\n const modifiers = new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);\n [\n 'cluster',\n 'distribute',\n 'sort',\n ].forEach((m) => modifiers.delete(m));\n return modifiers;\n }\n\n @cache\n static get PROPERTIES_LOCATION (): Map<typeof Expression, PropertiesLocation> {\n return new Map([\n ...Presto.Generator.PROPERTIES_LOCATION,\n [\n LocationPropertyExpr,\n PropertiesLocation.POST_WITH,\n ],\n ]);\n }\n\n @cache\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get ORIGINAL_TRANSFORMS (): Map<typeof Expression, (this: Generator, e: any) => string> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Map<typeof Expression, (this: Generator, e: any) => string>([\n ...Presto.Generator.TRANSFORMS,\n [\n ArraySumExpr,\n function (this: Generator, e) {\n return `REDUCE(${this.sql(e, 'this')}, 0, (acc, x) -> acc + x, acc -> acc)`;\n },\n ],\n [\n ArrayUniqueAggExpr,\n function (this: Generator, e) {\n return `ARRAY_AGG(DISTINCT ${this.sql(e, 'this')})`;\n },\n ],\n [\n CurrentVersionExpr,\n renameFunc('VERSION'),\n ],\n [\n GroupConcatExpr,\n function (this: Generator, e) {\n return groupConcatSql.call(this, e, {\n onOverflow: true,\n });\n },\n ],\n [\n LocationPropertyExpr,\n function (this: Generator, e) {\n return this.propertySql(e);\n },\n ],\n [\n MergeExpr,\n mergeWithoutTargetSql,\n ],\n [\n SelectExpr,\n preprocess([\n eliminateQualify,\n eliminateDistinctOn,\n explodeProjectionToUnnest(1),\n eliminateSemiAndAntiJoins,\n amendExplodedColumnTable,\n ]),\n ],\n [\n TimeStrToTimeExpr,\n function (this: Generator, e) {\n return timeStrToTimeSql.call(this, e, {\n includePrecision: true,\n });\n },\n ],\n [\n TrimExpr,\n trimSql,\n ],\n ]);\n }\n\n @cache\n static get SUPPORTED_JSON_PATH_PARTS (): Set<typeof Expression> {\n return new Set([\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n ]);\n }\n\n public jsonExtractSql (expression: JsonExtractExpr): string {\n if (!expression.args.jsonQuery) {\n return super.jsonExtractSql(expression);\n }\n\n const jsonPath = this.sql(expression, 'expression');\n const option = this.sql(expression, 'option');\n const optionStr = option ? ` ${option}` : '';\n\n const quote = this.sql(expression, 'quote');\n const quoteStr = quote ? ` ${quote}` : '';\n\n const onCondition = this.sql(expression, 'onCondition');\n const onConditionStr = onCondition ? ` ${onCondition}` : '';\n\n return this.func(\n 'JSON_QUERY',\n [\n expression.args.this,\n jsonPath + optionStr + quoteStr + onConditionStr,\n ],\n );\n }\n}\n\nexport class Trino extends Presto {\n static DIALECT_NAME = Dialects.TRINO;\n static SUPPORTS_USER_DEFINED_TYPES = false;\n static LOG_BASE_FIRST = true;\n\n static Tokenizer = TrinoTokenizer;\n static Parser = TrinoParser;\n static Generator = TrinoGenerator;\n}\nDialect.register(Dialects.TRINO, Trino);\n"]}
@@ -0,0 +1,2 @@
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');var Rs={MICROSECOND:" * 1000000",MILLISECOND:" * 1000",SECOND:"",MINUTE:" / 60",HOUR:" / 3600",DAY:" / 86400"};function mt(e){return function(n){let t=n;t instanceof _chunk2Z3O2CFMcjs.Nl&&(t=_chunk2Z3O2CFMcjs.rq.call(void 0, t));let r=this.sql(t,"this"),s=t.args.unit,i=t.args.expression&&this.simplifyUnlessLiteral(t.args.expression);return i instanceof _chunk2Z3O2CFMcjs.$c?i.setArgKey("isString",!0):i&&i.isNumber?i=_chunk2Z3O2CFMcjs.$c.string(i.toValue()):this.unsupported("Cannot add non-literal"),`${r} ${e} ${this.sql(new (0, _chunk2Z3O2CFMcjs.fe)({this:i,unit:s}))}`}}function Ue(e){let n=e.text("unit").toUpperCase(),t=Rs[n],r=`CAST(${this.sql(e,"this")} AS TIMESTAMP)`,s=`CAST(${this.sql(e,"expression")} AS TIMESTAMP)`;if(t!==void 0)return`CAST(EXTRACT(epoch FROM ${r} - ${s})${t} AS BIGINT)`;let i=`AGE(${r}, ${s})`,p;return n==="WEEK"?p=`EXTRACT(days FROM (${r} - ${s})) / 7`:n==="MONTH"?p=`EXTRACT(year FROM ${i}) * 12 + EXTRACT(month FROM ${i})`:n==="QUARTER"?p=`EXTRACT(year FROM ${i}) * 4 + EXTRACT(month FROM ${i}) / 3`:n==="YEAR"?p=`EXTRACT(year FROM ${i})`:p=i,`CAST(${p} AS BIGINT)`}function hs(e){let n=this.sql(e,"this"),t=this.sql(e,"start"),r=this.sql(e,"length"),s=t?` FROM ${t}`:"",i=r?` FOR ${r}`:"";return`SUBSTRING(${n}${s}${i})`}function xs(e){let n=e.find(_chunk2Z3O2CFMcjs.Kc);if(n&&e instanceof _chunk2Z3O2CFMcjs.Za){let t=e.args.constraints||[];e.setArgKey("constraints",t.filter(s=>s!==n.parent));let r=e.args.kind;r instanceof _chunk2Z3O2CFMcjs.ac&&(r.isType("int")?r.replace(new (0, _chunk2Z3O2CFMcjs.ac)({this:"serial"})):r.isType("smallint")?r.replace(new (0, _chunk2Z3O2CFMcjs.ac)({this:"smallserial"})):r.isType("bigint")&&r.replace(new (0, _chunk2Z3O2CFMcjs.ac)({this:"bigserial"})))}return e}function fs(e){if(!(e instanceof _chunk2Z3O2CFMcjs.Za))return e;let n=e.args.kind;if(!(n instanceof _chunk2Z3O2CFMcjs.ac))return e;let t;if(n.isType("serial")?t=new (0, _chunk2Z3O2CFMcjs.ac)({this:"int"}):n.isType("smallserial")?t=new (0, _chunk2Z3O2CFMcjs.ac)({this:"smallint"}):n.isType("bigserial")&&(t=new (0, _chunk2Z3O2CFMcjs.ac)({this:"bigint"})),t){n.replace(t);let r=e.args.constraints||[],s=new (0, _chunk2Z3O2CFMcjs.db)({kind:new (0, _chunk2Z3O2CFMcjs.Pc)({this:!1})}),i=new (0, _chunk2Z3O2CFMcjs.db)({kind:new (0, _chunk2Z3O2CFMcjs.Uc)({})});r.some(p=>p instanceof _chunk2Z3O2CFMcjs.db&&p.args.kind instanceof _chunk2Z3O2CFMcjs.Uc)||r.unshift(i),r.some(p=>p instanceof _chunk2Z3O2CFMcjs.db&&p.args.kind instanceof _chunk2Z3O2CFMcjs.Pc)||r.unshift(s),e.setArgKey("constraints",r)}return e}function Is(e){let n=_chunk2Z3O2CFMcjs.ca.call(void 0, e,2);return n&&(n instanceof _chunk2Z3O2CFMcjs.$c&&n.isString?e[2]=_chunk2Z3O2CFMcjs.go.call(void 0, n.args.this):n instanceof _chunk2Z3O2CFMcjs.fe&&!n.args.unit&&(e[2]=_chunk2Z3O2CFMcjs.go.call(void 0, _optionalChain([n, 'access', _2 => _2.args, 'access', _3 => _3.this, 'optionalAccess', _4 => _4.args, 'access', _5 => _5.this])))),_chunk2Z3O2CFMcjs.Mm.fromArgList(e)}function Ns(e){return e.length===1?_chunk2Z3O2CFMcjs.Zl.fromArgList(e):_chunk2Z3O2CFMcjs.Kp.call(void 0, _chunk2Z3O2CFMcjs.xl,{dialect:"postgres"})(e)}function Ge(e,n){return function(t){return t.args.onlyJsonTypes?_chunk2Z3O2CFMcjs.Aq.call(void 0, e,{quotedIndex:!1,op:n}).call(this,t):_chunk2Z3O2CFMcjs.Aq.call(void 0, e).call(this,t)}}function Os(e){let n;if(3<e.length){let t=e[e.length-1];t instanceof _chunk2Z3O2CFMcjs.$c&&t.isNumber||t instanceof _chunk2Z3O2CFMcjs.$c&&t.isString&&(n=_chunk2Z3O2CFMcjs.Kk.fromArgList(e.slice(0,-1)),n.setArgKey("modifiers",t))}return n=n||_chunk2Z3O2CFMcjs.Kk.fromArgList(e),n.setArgKey("singleReplace",!0),n}function _s(e){let n=e.args.scale,t=e.args.this;if(n===void 0||_optionalChain([n, 'optionalAccess', _6 => _6.toValue, 'call', _7 => _7()])===_chunk2Z3O2CFMcjs.Zl.SECONDS.toValue())return this.func("TO_TIMESTAMP",[t,this.formatTime(e)]);let r=new (0, _chunk2Z3O2CFMcjs.ze)({this:_optionalChain([t, 'optionalAccess', _8 => _8.copy, 'call', _9 => _9()]),expression:new (0, _chunk2Z3O2CFMcjs.zk)({this:_chunk2Z3O2CFMcjs.$c.number(10),expression:_optionalChain([n, 'optionalAccess', _10 => _10.copy, 'call', _11 => _11()])})});return this.func("TO_TIMESTAMP",[r,this.formatTime(e)])}function ds(e){let n=e.pop();return new (0, _chunk2Z3O2CFMcjs.Rj)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, e,0),expression:_chunk2Z3O2CFMcjs.ca.call(void 0, e,1),insCost:_chunk2Z3O2CFMcjs.ca.call(void 0, e,2),delCost:_chunk2Z3O2CFMcjs.ca.call(void 0, e,3),subCost:_chunk2Z3O2CFMcjs.ca.call(void 0, e,4),maxDist:n})}function Cs(e){let n=e.args.maxDist?"LEVENSHTEIN_LESS_EQUAL":"LEVENSHTEIN";return _chunk2Z3O2CFMcjs.pp.call(void 0, n).call(this,e)}function ms(e){return this.dialect.version.major<16?_chunk2Z3O2CFMcjs.lq.call(this,e):_chunk2Z3O2CFMcjs.pp.call(void 0, "ANY_VALUE").call(this,e)}function gs(e){let n=this.sql(e,"this"),t=this.sql(e,"decimals");if(!t)return this.func("ROUND",[n]);let r=n;if(e.args.this instanceof _chunk2Z3O2CFMcjs.Ca&&e.args.this.isType("double")){let s=_chunk2Z3O2CFMcjs.ac.build("decimal",{expressions:e.args.expressions});r=this.sql(new (0, _chunk2Z3O2CFMcjs.Cg)({this:n,to:s}))}return this.func("ROUND",[r,t])}var Be,we,Fe,be,Je,Ye,He,$e,ke,f,h= exports.a =class extends(ke=_chunk2Z3O2CFMcjs.Xq,$e=[_chunk2Z3O2CFMcjs.r],He=[_chunk2Z3O2CFMcjs.r],Ye=[_chunk2Z3O2CFMcjs.r],Je=[_chunk2Z3O2CFMcjs.r],be=[_chunk2Z3O2CFMcjs.r],Fe=[_chunk2Z3O2CFMcjs.r],we=[_chunk2Z3O2CFMcjs.r],Be=[_chunk2Z3O2CFMcjs.r],ke){static get BIT_STRINGS(){return[["b'","'"],["B'","'"],"0b"]}static get HEX_STRINGS(){return[["x'","'"],["X'","'"],"0x"]}static get BYTE_STRINGS(){return[["e'","'"],["E'","'"]]}static get BYTE_STRING_ESCAPES(){return["'","\\"]}static get HEREDOC_STRINGS(){return["$"]}static get ORIGINAL_KEYWORDS(){let{"/*+":t,DIV:r,...s}=_chunk2Z3O2CFMcjs.Xq.KEYWORDS;return{...s,"~":"rlike","@@":"dat","@>":"atGt","<@":"ltAt","?&":"qmarkAmp","?|":"qmarkPipe","#-":"hashDash","|/":"pipeSlash","||/":"dpipeSlash",BEGIN:"begin",BIGSERIAL:"bigserial","CONSTRAINT TRIGGER":"command",CSTRING:"pseudoType",DECLARE:"command",DO:"command",EXEC:"command",HSTORE:"hstore",INT8:"bigint",MONEY:"money",NAME:"name",OID:"objectIdentifier",ONLY:"only",POINT:"point",REFRESH:"command",REINDEX:"command",RESET:"command",SERIAL:"serial",SMALLSERIAL:"smallserial",TEMP:"temporary",REGCLASS:"objectIdentifier",REGCOLLATION:"objectIdentifier",REGCONFIG:"objectIdentifier",REGDICTIONARY:"objectIdentifier",REGNAMESPACE:"objectIdentifier",REGOPER:"objectIdentifier",REGOPERATOR:"objectIdentifier",REGPROC:"objectIdentifier",REGPROCEDURE:"objectIdentifier",REGROLE:"objectIdentifier",REGTYPE:"objectIdentifier",FLOAT:"double",XML:"xml",VARIADIC:"variadic",INOUT:"inout"}}static get SINGLE_TOKENS(){return{..._chunk2Z3O2CFMcjs.Xq.SINGLE_TOKENS,$:"heredocString"}}static get VAR_SINGLE_TOKENS(){return new Set(["$"])}};f=_chunk2Z3O2CFMcjs.a.call(void 0, ke),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"BIT_STRINGS",$e,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"HEX_STRINGS",He,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"BYTE_STRINGS",Ye,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"BYTE_STRING_ESCAPES",Je,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"HEREDOC_STRINGS",be,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"ORIGINAL_KEYWORDS",Fe,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"SINGLE_TOKENS",we,h),_chunk2Z3O2CFMcjs.d.call(void 0, f,10,"VAR_SINGLE_TOKENS",Be,h),_chunk2Z3O2CFMcjs.b.call(void 0, f,h),_chunk2Z3O2CFMcjs.c.call(void 0, f,3,h),h.HEREDOC_TAG_IS_IDENTIFIER=!0,h.HEREDOC_STRING_ALTERNATIVE="parameter";var Ve,Ke,ve,Xe,We,je,Qe,Ze,ze,ts,rs,es,ss,ns,is,as,S,T=class extends(as=_chunk2Z3O2CFMcjs.za,is=[_chunk2Z3O2CFMcjs.r],ns=[_chunk2Z3O2CFMcjs.r],ss=[_chunk2Z3O2CFMcjs.r],es=[_chunk2Z3O2CFMcjs.r],rs=[_chunk2Z3O2CFMcjs.r],ts=[_chunk2Z3O2CFMcjs.r],ze=[_chunk2Z3O2CFMcjs.r],Ze=[_chunk2Z3O2CFMcjs.r],Qe=[_chunk2Z3O2CFMcjs.r],je=[_chunk2Z3O2CFMcjs.r],We=[_chunk2Z3O2CFMcjs.r],Xe=[_chunk2Z3O2CFMcjs.r],ve=[_chunk2Z3O2CFMcjs.r],Ke=[_chunk2Z3O2CFMcjs.r],Ve=[_chunk2Z3O2CFMcjs.r],as){static get NO_PAREN_FUNCTIONS(){let t={..._chunk2Z3O2CFMcjs.za.NO_PAREN_FUNCTIONS};return t.currentSchema=_chunk2Z3O2CFMcjs.jh,t.sessionUser=_chunk2Z3O2CFMcjs.qh,t.currentCatalog=_chunk2Z3O2CFMcjs.lh,t}static get PROPERTY_PARSERS(){return(()=>{let t={..._chunk2Z3O2CFMcjs.za.PROPERTY_PARSERS,SET:function(){return this.expression(_chunk2Z3O2CFMcjs.Gd,{this:this.parseSet()})}};return delete t.INPUT,t})()}static get PLACEHOLDER_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.PLACEHOLDER_PARSERS,placeholder:function(){return this.expression(_chunk2Z3O2CFMcjs._d,{jdbc:!0})},mod:function(){return this.parseQueryParameter()}}}static get FUNCTIONS(){return{..._chunk2Z3O2CFMcjs.za.FUNCTIONS,ARRAY_PREPEND:t=>new (0, _chunk2Z3O2CFMcjs.gg)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,1),expression:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0)}),BIT_AND:t=>_chunk2Z3O2CFMcjs.om.fromArgList(t),BIT_OR:t=>_chunk2Z3O2CFMcjs.pm.fromArgList(t),BIT_XOR:t=>_chunk2Z3O2CFMcjs.qm.fromArgList(t),VERSION:t=>_chunk2Z3O2CFMcjs.Yg.fromArgList(t),DATE_TRUNC:_chunk2Z3O2CFMcjs.jq,DIV:t=>new (0, _chunk2Z3O2CFMcjs.Cg)({this:_chunk2Z3O2CFMcjs.iq.call(void 0, (0, _chunk2Z3O2CFMcjs.Je))(t),to:_chunk2Z3O2CFMcjs.ac.build("decimal")}),GENERATE_SERIES:Is,GET_BIT:t=>new (0, _chunk2Z3O2CFMcjs.Pi)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),expression:_chunk2Z3O2CFMcjs.ca.call(void 0, t,1),zeroIsMsb:!0}),JSON_EXTRACT_PATH:_chunk2Z3O2CFMcjs.zq.call(void 0, _chunk2Z3O2CFMcjs.uj),JSON_EXTRACT_PATH_TEXT:_chunk2Z3O2CFMcjs.zq.call(void 0, _chunk2Z3O2CFMcjs.wj),LENGTH:t=>new (0, _chunk2Z3O2CFMcjs.Oj)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),encoding:_chunk2Z3O2CFMcjs.ca.call(void 0, t,1)}),MAKE_TIME:t=>_chunk2Z3O2CFMcjs.ii.fromArgList(t),MAKE_TIMESTAMP:t=>_chunk2Z3O2CFMcjs.dm.fromArgList(t),NOW:t=>_chunk2Z3O2CFMcjs.fh.fromArgList(t),REGEXP_REPLACE:Os,TO_CHAR:_chunk2Z3O2CFMcjs.Kp.call(void 0, _chunk2Z3O2CFMcjs.Hl,{dialect:"postgres"}),TO_DATE:_chunk2Z3O2CFMcjs.Kp.call(void 0, _chunk2Z3O2CFMcjs.wl,{dialect:"postgres"}),TO_TIMESTAMP:Ns,UNNEST:t=>_chunk2Z3O2CFMcjs.yi.fromArgList(t),SHA256:t=>new (0, _chunk2Z3O2CFMcjs.gl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),length:_chunk2Z3O2CFMcjs.$c.number(256)}),SHA384:t=>new (0, _chunk2Z3O2CFMcjs.gl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),length:_chunk2Z3O2CFMcjs.$c.number(384)}),SHA512:t=>new (0, _chunk2Z3O2CFMcjs.gl)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),length:_chunk2Z3O2CFMcjs.$c.number(512)}),LEVENSHTEIN_LESS_EQUAL:ds,JSON_OBJECT_AGG:t=>_chunk2Z3O2CFMcjs.nn.fromArgList(t),JSONB_OBJECT_AGG:t=>_chunk2Z3O2CFMcjs.on.fromArgList(t),WIDTH_BUCKET:t=>t.length===2?new (0, _chunk2Z3O2CFMcjs.gm)({this:_chunk2Z3O2CFMcjs.ca.call(void 0, t,0),threshold:_chunk2Z3O2CFMcjs.ca.call(void 0, t,1)}):_chunk2Z3O2CFMcjs.gm.fromArgList(t)}}static get NO_PAREN_FUNCTION_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.NO_PAREN_FUNCTION_PARSERS,VARIADIC:function(){return this.expression(_chunk2Z3O2CFMcjs.Ec,{this:this.parseBitwise()})}}}static get FUNCTION_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.FUNCTION_PARSERS,DATE_PART:function(){return this.parseDatePart()},JSON_AGG:function(){return this.expression(_chunk2Z3O2CFMcjs.pn,{this:this.parseLambda(),order:this.parseOrder()})},JSONB_EXISTS:function(){return this.parseJsonbExists()}}}static get BITWISE(){return{..._chunk2Z3O2CFMcjs.za.BITWISE,hash:_chunk2Z3O2CFMcjs.ye}}static get EXPONENT(){return{caret:_chunk2Z3O2CFMcjs.zk}}static get RANGE_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.RANGE_PARSERS,damp:_chunk2Z3O2CFMcjs.ta.call(void 0, _chunk2Z3O2CFMcjs.wg),dat:function(t){return this.expression(_chunk2Z3O2CFMcjs.fk,{this:this.parseBitwise(),expressions:[t]})}}}static get STATEMENT_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.STATEMENT_PARSERS,end:function(){return this.parseCommitOrRollback()}}}static get UNARY_PARSERS(){return{..._chunk2Z3O2CFMcjs.za.UNARY_PARSERS,rlike:function(){return this.expression(_chunk2Z3O2CFMcjs.Te,{this:this.parseUnary()})}}}static get COLUMN_OPERATORS(){return{..._chunk2Z3O2CFMcjs.za.COLUMN_OPERATORS,arrow:function(t,r){return this.validateExpression(_chunk2Z3O2CFMcjs.zq.call(void 0, _chunk2Z3O2CFMcjs.uj,{arrowReqJsonType:this.constructor.JSON_ARROWS_REQUIRE_JSON_TYPE})([t,r]))},darrow:function(t,r){return this.validateExpression(_chunk2Z3O2CFMcjs.zq.call(void 0, _chunk2Z3O2CFMcjs.wj,{arrowReqJsonType:this.constructor.JSON_ARROWS_REQUIRE_JSON_TYPE})([t,r]))}}}static get ARG_MODE_TOKENS(){return new Set(["in","out","inout","variadic"])}parseParameterMode(){if(!this.matchSet(this.constructor.ARG_MODE_TOKENS,{advance:!1})||!this.next)return;let t=this.curr;if(this.tryParse(()=>(this.advance(),this.parseTypes({checkFunc:!1,allowIdentifiers:!1})),{retreat:!0})||!this.next||!this.constructor.ID_VAR_TOKENS.has(this.next.tokenType))return;if(this.tryParse(()=>(this.advance(2),this.parseTypes({checkFunc:!1,allowIdentifiers:!0})),{retreat:!0}))return _optionalChain([t, 'optionalAccess', _12 => _12.tokenType])}createModeConstraint(t){return this.expression(_chunk2Z3O2CFMcjs.Zc,{input:t==="in"||t==="inout",output:t==="out"||t==="inout",variadic:t==="variadic"})}parseFunctionParameter(){let t=this.parseParameterMode();t&&this.advance();let r=this.parseIdVar(),s=this.parseColumnDef(r,{computedColumn:!1});if(t&&s instanceof _chunk2Z3O2CFMcjs.Za){let i=this.createModeConstraint(t);s.args.constraints||s.setArgKey("constraints",[]),_optionalChain([s, 'access', _13 => _13.args, 'access', _14 => _14.constraints, 'optionalAccess', _15 => _15.unshift, 'call', _16 => _16(new (0, _chunk2Z3O2CFMcjs.db)({kind:i}))])}return s}parseQueryParameter(){let t=this.match("lParen",{advance:!1})?this.parseWrapped(()=>this.parseIdVar()):void 0;return this.matchTextSeq("S"),this.expression(_chunk2Z3O2CFMcjs._d,{this:t})}parseDatePart(){let t=this.parseType();this.match("comma");let r=this.parseBitwise();return t&&(t instanceof _chunk2Z3O2CFMcjs.Ic||t instanceof _chunk2Z3O2CFMcjs.$c)&&(t=_chunk2Z3O2CFMcjs.Eo.call(void 0, t.name)),this.expression(_chunk2Z3O2CFMcjs.Wh,{this:t,expression:r})}parseUniqueKey(){}parseJsonbExists(){return this.expression(_chunk2Z3O2CFMcjs.tj,{this:this.parseBitwise(),path:this.match("comma")&&this.dialect.toJsonPath(this.parseBitwise())})}parseGeneratedAsIdentity(){let t=super.parseGeneratedAsIdentity();return this.matchTextSeq("STORED")&&(t=this.expression(_chunk2Z3O2CFMcjs.Yc,{this:t.args.expression})),t}parseUserDefinedType(t){let r=t;for(;this.match("dot");){let s=this.parseIdVar();s&&(r=new (0, _chunk2Z3O2CFMcjs.Ae)({this:r,expression:s}))}return _chunk2Z3O2CFMcjs.ac.build(r,{udt:!0})}static get ID_VAR_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.ID_VAR_TOKENS,"straightJoin"])}static get TABLE_ALIAS_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.TABLE_ALIAS_TOKENS,"straightJoin"])}};S=_chunk2Z3O2CFMcjs.a.call(void 0, as),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"NO_PAREN_FUNCTIONS",is,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"PROPERTY_PARSERS",ns,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"PLACEHOLDER_PARSERS",ss,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"FUNCTIONS",es,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"NO_PAREN_FUNCTION_PARSERS",rs,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"FUNCTION_PARSERS",ts,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"BITWISE",ze,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"EXPONENT",Ze,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"RANGE_PARSERS",Qe,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"STATEMENT_PARSERS",je,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"UNARY_PARSERS",We,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"COLUMN_OPERATORS",Xe,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"ARG_MODE_TOKENS",ve,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"ID_VAR_TOKENS",Ke,T),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"TABLE_ALIAS_TOKENS",Ve,T),_chunk2Z3O2CFMcjs.b.call(void 0, S,T),_chunk2Z3O2CFMcjs.c.call(void 0, S,3,T),T.SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT=!0,T.JSON_ARROWS_REQUIRE_JSON_TYPE=!0;var Es,os,ps,Ts,cs,us,I,a=class extends(us=_chunk2Z3O2CFMcjs.lp,cs=[_chunk2Z3O2CFMcjs.r],Ts=[_chunk2Z3O2CFMcjs.r],ps=[_chunk2Z3O2CFMcjs.r],os=[_chunk2Z3O2CFMcjs.r],Es=[_chunk2Z3O2CFMcjs.r],us){static get AFTER_HAVING_MODIFIER_TRANSFORMS(){let t=new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);return["cluster","distribute","sort"].forEach(r=>t.delete(r)),t}static get SUPPORTED_JSON_PATH_PARTS(){return new Set([_chunk2Z3O2CFMcjs.ie,_chunk2Z3O2CFMcjs.je,_chunk2Z3O2CFMcjs.ke])}static get TYPE_MAPPING(){return new Map([..._chunk2Z3O2CFMcjs.lp.TYPE_MAPPING,["tinyint","SMALLINT"],["float","REAL"],["double","DOUBLE PRECISION"],["binary","BYTEA"],["varbinary","BYTEA"],["rowversion","BYTEA"],["datetime","TIMESTAMP"],["timestampntz","TIMESTAMP"],["blob","BYTEA"]])}lateralSql(t){let r=super.lateralSql(t);return t.args.crossApply!==void 0&&(r=`${r} ON TRUE`),r}jsonbExtractSql(t){return this.binary(t,"#>")}jsonbExtractScalarSql(t){return this.binary(t,"#>>")}explodeSql(t){return this.func("UNNEST",[t.args.this,...t.args.expressions||[]])}static get ORIGINAL_TRANSFORMS(){let t=new Map([..._chunk2Z3O2CFMcjs.lp.TRANSFORMS,[_chunk2Z3O2CFMcjs.Um,ms],[_chunk2Z3O2CFMcjs.hg,_chunk2Z3O2CFMcjs.Hp.call(void 0, "ARRAY_CAT")],[_chunk2Z3O2CFMcjs.ng,_chunk2Z3O2CFMcjs.Cq],[_chunk2Z3O2CFMcjs.fg,_chunk2Z3O2CFMcjs.Gp.call(void 0, "ARRAY_APPEND")],[_chunk2Z3O2CFMcjs.gg,_chunk2Z3O2CFMcjs.Gp.call(void 0, "ARRAY_PREPEND",{swapParams:!0})],[_chunk2Z3O2CFMcjs.om,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_AND")],[_chunk2Z3O2CFMcjs.pm,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_OR")],[_chunk2Z3O2CFMcjs.ye,function(r){return this.binary(r,"#")}],[_chunk2Z3O2CFMcjs.qm,_chunk2Z3O2CFMcjs.pp.call(void 0, "BIT_XOR")],[_chunk2Z3O2CFMcjs.Za,_chunk2Z3O2CFMcjs.Po.call(void 0, [xs,fs])],[_chunk2Z3O2CFMcjs.$g,_chunk2Z3O2CFMcjs.wp],[_chunk2Z3O2CFMcjs.fh,()=>"CURRENT_TIMESTAMP"],[_chunk2Z3O2CFMcjs.kh,()=>"CURRENT_USER"],[_chunk2Z3O2CFMcjs.Yg,_chunk2Z3O2CFMcjs.pp.call(void 0, "VERSION")],[_chunk2Z3O2CFMcjs.uh,mt("+")],[_chunk2Z3O2CFMcjs.xh,Ue],[_chunk2Z3O2CFMcjs.ji,_chunk2Z3O2CFMcjs.Xp],[_chunk2Z3O2CFMcjs.wh,mt("-")],[_chunk2Z3O2CFMcjs.yi,_chunk2Z3O2CFMcjs.pp.call(void 0, "UNNEST")],[_chunk2Z3O2CFMcjs.Mm,_chunk2Z3O2CFMcjs.pp.call(void 0, "GENERATE_SERIES")],[_chunk2Z3O2CFMcjs.Pi,_chunk2Z3O2CFMcjs.Uq],[_chunk2Z3O2CFMcjs.in,function(r){return _chunk2Z3O2CFMcjs.Qq.call(this,r,{funcName:"STRING_AGG",withinGroup:!1})}],[_chunk2Z3O2CFMcjs.Je,_chunk2Z3O2CFMcjs.pp.call(void 0, "DIV")],[_chunk2Z3O2CFMcjs.pn,function(r){let s=this.sql(r,"this"),i=this.sql(r,"order");return`JSON_AGG(${i?`${s}${i}`:s})`}],[_chunk2Z3O2CFMcjs.uj,Ge("JSON_EXTRACT_PATH","->")],[_chunk2Z3O2CFMcjs.wj,Ge("JSON_EXTRACT_PATH_TEXT","->>")],[_chunk2Z3O2CFMcjs.xj,function(r){return this.binary(r,"#>")}],[_chunk2Z3O2CFMcjs.yj,function(r){return this.binary(r,"#>>")}],[_chunk2Z3O2CFMcjs.sj,function(r){return this.binary(r,"?")}],[_chunk2Z3O2CFMcjs.Fj,function(r){return this.sql(new (0, _chunk2Z3O2CFMcjs.Cg)({this:r.args.this,to:_chunk2Z3O2CFMcjs.ac.build("json")}))}],[_chunk2Z3O2CFMcjs.ie,_chunk2Z3O2CFMcjs.Bq],[_chunk2Z3O2CFMcjs.je,()=>""],[_chunk2Z3O2CFMcjs.ke,function(r){return this.jsonPathPart(r.args.this)}],[_chunk2Z3O2CFMcjs.Qh,_chunk2Z3O2CFMcjs.xq],[_chunk2Z3O2CFMcjs.qn,_chunk2Z3O2CFMcjs.pp.call(void 0, "BOOL_OR")],[_chunk2Z3O2CFMcjs.rn,_chunk2Z3O2CFMcjs.pp.call(void 0, "BOOL_AND")],[_chunk2Z3O2CFMcjs.sn,_chunk2Z3O2CFMcjs.$p],[_chunk2Z3O2CFMcjs.Xj,_chunk2Z3O2CFMcjs.Cp],[_chunk2Z3O2CFMcjs.vn,_chunk2Z3O2CFMcjs._p],[_chunk2Z3O2CFMcjs.me,_chunk2Z3O2CFMcjs.yq],[_chunk2Z3O2CFMcjs.ud,function(r){return`PARTITION BY ${this.sql(r,"this")}`}],[_chunk2Z3O2CFMcjs.xn,_chunk2Z3O2CFMcjs.Po.call(void 0, [_chunk2Z3O2CFMcjs.Zo])],[_chunk2Z3O2CFMcjs.yn,_chunk2Z3O2CFMcjs.Po.call(void 0, [_chunk2Z3O2CFMcjs.Zo])],[_chunk2Z3O2CFMcjs.Yb,_chunk2Z3O2CFMcjs.zp],[_chunk2Z3O2CFMcjs.Ck,_chunk2Z3O2CFMcjs.pp.call(void 0, "RANDOM")],[_chunk2Z3O2CFMcjs.Lk,function(r){return this.binary(r,"~")}],[_chunk2Z3O2CFMcjs.Mk,function(r){return this.binary(r,"~*")}],[_chunk2Z3O2CFMcjs.Kk,function(r){return this.func("REGEXP_REPLACE",[r.args.this,r.args.expression,r.args.replacement,r.args.position,r.args.occurrence,_chunk2Z3O2CFMcjs.Tq.call(void 0, r)])}],[_chunk2Z3O2CFMcjs.Uk,gs],[_chunk2Z3O2CFMcjs.Wd,_chunk2Z3O2CFMcjs.Po.call(void 0, [_chunk2Z3O2CFMcjs.bp,_chunk2Z3O2CFMcjs.To])],[_chunk2Z3O2CFMcjs.gl,_chunk2Z3O2CFMcjs.Hq],[_chunk2Z3O2CFMcjs.il,_chunk2Z3O2CFMcjs.Iq],[_chunk2Z3O2CFMcjs.tl,function(r){return _chunk2Z3O2CFMcjs.Ep.call(this,r,{funcName:"POSITION"})}],[_chunk2Z3O2CFMcjs.wl,function(r){return this.func("TO_DATE",[r.args.this,this.formatTime(r)])}],[_chunk2Z3O2CFMcjs.xl,function(r){return this.func("TO_TIMESTAMP",[r.args.this,this.formatTime(r)])}],[_chunk2Z3O2CFMcjs.Dl,_chunk2Z3O2CFMcjs.Fp],[_chunk2Z3O2CFMcjs.pl,hs],[_chunk2Z3O2CFMcjs.ii,_chunk2Z3O2CFMcjs.pp.call(void 0, "MAKE_TIME")],[_chunk2Z3O2CFMcjs.dm,_chunk2Z3O2CFMcjs.pp.call(void 0, "MAKE_TIMESTAMP")],[_chunk2Z3O2CFMcjs.bi,_chunk2Z3O2CFMcjs.Qp.call(void 0, {zone:!0})],[_chunk2Z3O2CFMcjs.Kl,_chunk2Z3O2CFMcjs.Wp],[_chunk2Z3O2CFMcjs.Hl,function(r){return typeof r.args.format=="string"||_optionalChain([r, 'access', _17 => _17.args, 'access', _18 => _18.format, 'optionalAccess', _19 => _19.isString])?this.func("TO_CHAR",[r.args.this,this.formatTime(r)]):this.func("TO_CHAR",[r.args.this,r.args.format])}],[_chunk2Z3O2CFMcjs.Qf,function(r){return r.args.format?this.functionFallbackSql(r):this.toCharSql(r)}],[_chunk2Z3O2CFMcjs.Ml,_chunk2Z3O2CFMcjs.bq],[_chunk2Z3O2CFMcjs.bn,_chunk2Z3O2CFMcjs.Ap],[_chunk2Z3O2CFMcjs.Nl,mt("+")],[_chunk2Z3O2CFMcjs.Ol,Ue],[_chunk2Z3O2CFMcjs.Zl,_s],[_chunk2Z3O2CFMcjs.cm,()=>"GEN_RANDOM_UUID()"],[_chunk2Z3O2CFMcjs.Il,function(r){return this.func("DATE_PART",[_chunk2Z3O2CFMcjs.$c.string("epoch"),r.args.this])}],[_chunk2Z3O2CFMcjs.Sn,_chunk2Z3O2CFMcjs.pp.call(void 0, "VAR_POP")],[_chunk2Z3O2CFMcjs.Rn,_chunk2Z3O2CFMcjs.pp.call(void 0, "VAR_SAMP")],[_chunk2Z3O2CFMcjs.mn,_chunk2Z3O2CFMcjs.mq],[_chunk2Z3O2CFMcjs.Vl,_chunk2Z3O2CFMcjs.pp.call(void 0, "ASCII")],[_chunk2Z3O2CFMcjs.Rj,Cs],[_chunk2Z3O2CFMcjs.nn,_chunk2Z3O2CFMcjs.pp.call(void 0, "JSON_OBJECT_AGG")],[_chunk2Z3O2CFMcjs.on,_chunk2Z3O2CFMcjs.pp.call(void 0, "JSONB_OBJECT_AGG")],[_chunk2Z3O2CFMcjs.fn,_chunk2Z3O2CFMcjs.aq],[_chunk2Z3O2CFMcjs.ob,function(r){r.args.expressions&&0<r.args.expressions.length&&this.unsupported("Oracle-style SELECT INTO with variables is not supported in PostgreSQL");let s=r.args.temporary?" TEMPORARY":"",i=r.args.unlogged?" UNLOGGED":"",p=s||i;return`${this.seg("INTO")}${p} ${this.sql(r,"this")}`}]]);return t.delete(_chunk2Z3O2CFMcjs.Nc),t}static get PROPERTIES_LOCATION(){let t=new Map(_chunk2Z3O2CFMcjs.lp.PROPERTIES_LOCATION);return t.set(_chunk2Z3O2CFMcjs.ud,"postSchema"),t.set(_chunk2Z3O2CFMcjs.Md,"unsupported"),t.set(_chunk2Z3O2CFMcjs.Od,"unsupported"),t}schemaCommentPropertySql(t){return this.unsupported("Table comments are not supported in the CREATE statement"),""}commentColumnConstraintSql(t){return this.unsupported("Column comments are not supported in the CREATE statement"),""}columnDefSql(t,r={}){let{sep:s=" "}=r,i=t.find(_chunk2Z3O2CFMcjs.Zc);if(i){let p=this.sql(i);i.pop();let N=super.columnDefSql(t,{sep:s});return`${p} ${N}`}return super.columnDefSql(t,{sep:s})}unnestSql(t){if(_optionalChain([t, 'access', _20 => _20.args, 'access', _21 => _21.expressions, 'optionalAccess', _22 => _22.length])===1){let r=t.args.expressions[0];if(r instanceof _chunk2Z3O2CFMcjs.Mi){let i=new (0, _chunk2Z3O2CFMcjs.bg)({...r.args});return(t.parent instanceof _chunk2Z3O2CFMcjs.pb||t.parent instanceof _chunk2Z3O2CFMcjs.Bb)&&(i=_chunk2Z3O2CFMcjs.jo.call(void 0, "value::date").from(new (0, _chunk2Z3O2CFMcjs.Tb)({this:i}).as("_t",{table:["value"]})).subquery(t.args.alias instanceof _chunk2Z3O2CFMcjs.Ca||typeof t.args.alias=="string"?t.args.alias:"_unnested_generate_series")),this.sql(i)}let s=r instanceof _chunk2Z3O2CFMcjs.Ca?_chunk2Z3O2CFMcjs.Y.call(void 0, r,{dialect:this.dialect}):r;if(_chunk2Z3O2CFMcjs.Lo.call(void 0, s,"array<json>")){let i=s;for(;i instanceof _chunk2Z3O2CFMcjs.Cg;){let gt=i.args.this;if(gt instanceof _chunk2Z3O2CFMcjs.Ca)i=gt;else break}let p=this.sql(new (0, _chunk2Z3O2CFMcjs.Cg)({this:i,to:_chunk2Z3O2CFMcjs.ac.build("json")})),N=this.sql(t,"alias");return N=N?` AS ${N}`:"",t.args.offset&&this.unsupported("Unsupported JSON_ARRAY_ELEMENTS with offset"),`JSON_ARRAY_ELEMENTS(${p})${N}`}}return super.unnestSql(t)}bracketSql(t){return t.args.this instanceof _chunk2Z3O2CFMcjs.Mf&&t.setArgKey("this",new (0, _chunk2Z3O2CFMcjs.Ve)({this:t.args.this})),super.bracketSql(t)}matchAgainstSql(t){let r=this.sql(t,"this"),s=(_nullishCoalesce(t.args.expressions, () => ([]))).map(p=>`${this.sql(p)} @@ ${r}`),i=s.join(" OR ");return 1<s.length?`(${i})`:i}alterSetSql(t){let r=this.expressions(t,{flat:!0});r=r?`(${r})`:"";let s=this.sql(t,"accessMethod");s=s?`ACCESS METHOD ${s}`:"";let i=this.sql(t,"tablespace");i=i?`TABLESPACE ${i}`:"";let p=this.sql(t,"option");return`SET ${r}${s}${i}${p}`}dataTypeSql(t){if(t.isType("array")){if(t.args.expressions&&0<t.args.expressions.length){let r=this.expressions(t,{key:"values",flat:!0});return`${this.expressions(t,{flat:!0})}[${r}]`}return"ARRAY"}return t.isType(["double","float"])&&t.args.expressions&&0<t.args.expressions.length?`FLOAT(${this.expressions(t,{flat:!0})})`:super.dataTypeSql(t)}castSql(t,r={}){let{safePrefix:s}=r,i=t.args.this;return i instanceof _chunk2Z3O2CFMcjs.Je&&t.args.to instanceof _chunk2Z3O2CFMcjs.ac&&t.args.to.isType("decimal")&&!_optionalChain([t, 'access', _23 => _23.args, 'access', _24 => _24.to, 'access', _25 => _25.args, 'access', _26 => _26.expressions, 'optionalAccess', _27 => _27.length])?this.sql(i):super.castSql(t,{safePrefix:s})}arraySql(t){let r=t.args.expressions||[],s=this.normalizeFunc("ARRAY");return r[0]instanceof _chunk2Z3O2CFMcjs.Wd?`${s}(${this.sql(r[0])})`:`${s}${_chunk2Z3O2CFMcjs.tp.call(this,t)}`}computedColumnConstraintSql(t){return`GENERATED ALWAYS AS (${this.sql(t,"this")}) STORED`}isAsciiSql(t){return`(${this.sql(t.args.this)} ~ '^[[:ascii:]]*$')`}ignoreNullsSql(t){return this.unsupported("PostgreSQL does not support IGNORE NULLS."),this.sql(t.args.this)}respectNullsSql(t){return this.unsupported("PostgreSQL does not support RESPECT NULLS."),this.sql(t.args.this)}currentSchemaSql(t){return t.args.this&&this.unsupported("Unsupported arg 'this' for CURRENT_SCHEMA"),"CURRENT_SCHEMA"}intervalSql(t){let r=t.text("unit").toLowerCase(),s=t.args.this;return r.startsWith("quarter")&&s instanceof _chunk2Z3O2CFMcjs.$c&&(s.setArgKey("this",(parseInt(_nullishCoalesce(s.args.this, () => ("0")))*3).toString()),_optionalChain([t, 'access', _28 => _28.args, 'access', _29 => _29.unit, 'optionalAccess', _30 => _30.replace, 'call', _31 => _31(new (0, _chunk2Z3O2CFMcjs.rb)({this:"MONTH"}))])),super.intervalSql(t)}placeholderSql(t){if(t.args.jdbc)return"?";let r=t.args.this?`(${t.name})`:"";return`${this.constructor.NAMED_PLACEHOLDER_TOKEN}${r}s`}arrayContainsSql(t){let r=t.args.expression,s=t.args.this;if(!r)return"";let i=new (0, _chunk2Z3O2CFMcjs.Jg)({this:r.eq(new (0, _chunk2Z3O2CFMcjs.nm)({this:new (0, _chunk2Z3O2CFMcjs.Ve)({this:s})})),expressions:[new (0, _chunk2Z3O2CFMcjs.ae)({this:!1})]}),p=new (0, _chunk2Z3O2CFMcjs.Bg)({ifs:[]}).when(new (0, _chunk2Z3O2CFMcjs.Ke)({this:r,expression:_chunk2Z3O2CFMcjs.Bo.call(void 0, )}),_chunk2Z3O2CFMcjs.Bo.call(void 0, )).else(i);return this.sql(p)}};I=_chunk2Z3O2CFMcjs.a.call(void 0, us),_chunk2Z3O2CFMcjs.d.call(void 0, I,10,"AFTER_HAVING_MODIFIER_TRANSFORMS",cs,a),_chunk2Z3O2CFMcjs.d.call(void 0, I,10,"SUPPORTED_JSON_PATH_PARTS",Ts,a),_chunk2Z3O2CFMcjs.d.call(void 0, I,10,"TYPE_MAPPING",ps,a),_chunk2Z3O2CFMcjs.d.call(void 0, I,10,"ORIGINAL_TRANSFORMS",os,a),_chunk2Z3O2CFMcjs.d.call(void 0, I,10,"PROPERTIES_LOCATION",Es,a),_chunk2Z3O2CFMcjs.b.call(void 0, I,a),_chunk2Z3O2CFMcjs.c.call(void 0, I,3,a),a.SUPPORTS_DECODE_CASE=!1,a.SELECT_KINDS=[],a.TRY_SUPPORTED=!1,a.SUPPORTS_UESCAPE=!1,a.SINGLE_STRING_INTERVAL=!0,a.RENAME_TABLE_WITH_DB=!1,a.LOCKING_READS_SUPPORTED=!0,a.JOIN_HINTS=!1,a.TABLE_HINTS=!1,a.QUERY_HINTS=!1,a.NVL2_SUPPORTED=!1,a.PARAMETER_TOKEN="$",a.NAMED_PLACEHOLDER_TOKEN="%",a.TABLESAMPLE_SIZE_IS_ROWS=!1,a.TABLESAMPLE_SEED_KEYWORD="REPEATABLE",a.SUPPORTS_SELECT_INTO=!0,a.JSON_TYPE_REQUIRED_FOR_EXTRACTION=!0,a.SUPPORTS_UNLOGGED_TABLES=!0,a.LIKE_PROPERTY_INSIDE_SCHEMA=!0,a.MULTI_ARG_DISTINCT=!1,a.CAN_IMPLEMENT_ARRAY_ANY=!0,a.SUPPORTS_WINDOW_EXCLUDE=!0,a.COPY_HAS_INTO_KEYWORD=!1,a.ARRAY_CONCAT_IS_VAR_LEN=!1,a.SUPPORTS_MEDIAN=!1,a.ARRAY_SIZE_DIM_REQUIRED=!0,a.SUPPORTS_BETWEEN_FLAGS=!0,a.INOUT_SEPARATOR="";var Ss,ls,As,Y,l= exports.b =class extends(As=_chunk2Z3O2CFMcjs.op,ls=[_chunk2Z3O2CFMcjs.r],Ss=[_chunk2Z3O2CFMcjs.r],As){static get NULL_ORDERING(){return"nulls_are_large"}static get DEFAULT_FUNCTIONS_COLUMN_NAMES(){return new Map([[_chunk2Z3O2CFMcjs.Mm.name,"generate_series"]])}static get TIME_MAPPING(){return{d:"%u",D:"%u",dd:"%d",DD:"%d",ddd:"%j",DDD:"%j",FMDD:"%-d",FMDDD:"%-j",FMHH12:"%-I",FMHH24:"%-H",FMMI:"%-M",FMMM:"%-m",FMSS:"%-S",HH12:"%I",HH24:"%H",mi:"%M",MI:"%M",mm:"%m",MM:"%m",OF:"%z",ss:"%S",SS:"%S",TMDay:"%A",TMDy:"%a",TMMon:"%b",TMMonth:"%B",TZ:"%Z",US:"%f",ww:"%U",WW:"%U",yy:"%y",YY:"%y",yyyy:"%Y",YYYY:"%Y"}}};Y=_chunk2Z3O2CFMcjs.a.call(void 0, As),_chunk2Z3O2CFMcjs.d.call(void 0, Y,10,"DEFAULT_FUNCTIONS_COLUMN_NAMES",ls,l),_chunk2Z3O2CFMcjs.d.call(void 0, Y,10,"TIME_MAPPING",Ss,l),_chunk2Z3O2CFMcjs.b.call(void 0, Y,l),_chunk2Z3O2CFMcjs.c.call(void 0, Y,3,l),l.DIALECT_NAME="postgres",l.INDEX_OFFSET=1,l.TYPED_DIVISION=!0,l.CONCAT_COALESCE=!0,l.TIME_FORMAT="'YYYY-MM-DD HH24:MI:SS'",l.TABLESAMPLE_SIZE_IS_PERCENT=!0,l.TABLES_REFERENCEABLE_AS_COLUMNS=!0,l.Tokenizer=h,l.Parser=T,l.Generator=a;_chunk2Z3O2CFMcjs.op.register("postgres",l);exports.a = h; exports.b = l;
2
+ //# sourceMappingURL=chunk-WRNYJ54A.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/huydna/projects/sqlingo.js/dist/chunk-WRNYJ54A.cjs","../src/dialects/postgres.ts"],"names":["DATE_DIFF_FACTOR","dateAddSql","kind","expression","expr","TsOrDsAddExpr","tsOrDsAddCast","thisSql","unit","e","LiteralExpr"],"mappings":"AAAA,yuBAAujD,ICgNjjDA,EAAAA,CAA2C,CAC/C,WAAA,CAAa,YAAA,CACb,WAAA,CAAa,SAAA,CACb,MAAA,CAAQ,EAAA,CACR,MAAA,CAAQ,OAAA,CACR,IAAA,CAAM,SAAA,CACN,GAAA,CAAK,UACP,CAAA,CAEA,SAASC,EAAAA,CAAYC,CAAAA,CAAc,CACjC,OAAO,QAAA,CAA2BC,CAAAA,CAA+D,CAC/F,IAAIC,CAAAA,CAAOD,CAAAA,CACPC,EAAAA,WAAgBC,oBAAAA,EAAAA,CAClBD,CAAAA,CAAOE,kCAAAA,CAAkB,CAAA,CAAA,CAG3B,IAAMC,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAIH,CAAAA,CAAM,MAAM,CAAA,CAC/BI,CAAAA,CAAOJ,CAAAA,CAAK,IAAA,CAAK,IAAA,CAEnBK,CAAAA,CAAIL,CAAAA,CAAK,IAAA,CAAK,UAAA,EAAc,IAAA,CAAK,qBAAA,CAAsBA,CAAAA,CAAK,IAAA,CAAK,UAAU,CAAA,CAC/E,OAAIK,EAAAA,WAAaC,oBAAAA,CACfD,CAAAA,CAAE,SAAA,CAAU,UAAA,CAAY,CAAA,CAAI,CAAA,CACnBA,CAAAA,EAAKA,CAAAA,CAAE,QAAA,CAChBA,CAAAA,CAAIC,oBAAAA,CAAY,MAAA,CAAOD,CAAAA,CAAE,OAAA,CAAQ,CAAE,CAAA,CAEnC,IAAA,CAAK,WAAA,CAAY,wBAAwB,CAAA,CAGpC,CAAA,EAAA","file":"/home/huydna/projects/sqlingo.js/dist/chunk-WRNYJ54A.cjs","sourcesContent":[null,"import {\n cache,\n} from '../port_internals';\nimport {\n Generator,\n} from '../generator';\nimport {\n Parser, binaryRangeParser,\n} from '../parser';\nimport type {\n TokenPair,\n} from '../tokens';\nimport {\n Tokenizer, TokenType,\n} from '../tokens';\nimport type {\n BracketExpr,\n LateralExpr,\n ArrayContainsExpr,\n IsAsciiExpr,\n RespectNullsExpr,\n IgnoreNullsExpr,\n AlterSetExpr,\n SchemaCommentPropertyExpr,\n UnnestExpr,\n GeneratedAsRowColumnConstraintExpr,\n} from '../expressions';\nimport {\n DataTypeExprKind,\n CastExpr,\n Expression,\n DataTypeExpr,\n DateAddExpr,\n DateSubExpr,\n DateDiffExpr,\n AnyValueExpr,\n RoundExpr,\n SubstringExpr,\n IdentifierExpr,\n BooleanExpr,\n ParenExpr,\n DotExpr,\n ComputedColumnConstraintExpr,\n DivExpr,\n select,\n CurrentTimestampExpr,\n GenerateSeriesExpr,\n ArrayExpr,\n SelectExpr,\n StrToTimeExpr,\n TimeToStrExpr,\n TryCastExpr,\n ArrayPrependExpr,\n BitwiseAndAggExpr,\n BitwiseOrAggExpr,\n BitwiseXorAggExpr,\n BitwiseXorExpr,\n CurrentVersionExpr,\n GetbitExpr,\n LevenshteinExpr,\n StrToDateExpr,\n UnixToTimeExpr,\n Sha2Expr,\n Sha2DigestExpr,\n TsOrDsAddExpr,\n TsOrDsDiffExpr,\n IntDivExpr,\n GroupConcatExpr,\n LogicalOrExpr,\n LogicalAndExpr,\n RandExpr,\n RegexpReplaceExpr,\n RegexpILikeExpr,\n RegexpLikeExpr,\n StrPositionExpr,\n TimeStrToTimeExpr,\n TimestampTruncExpr,\n VarianceExpr,\n VariancePopExpr,\n CountIfExpr,\n TimeFromPartsExpr,\n TimestampFromPartsExpr,\n DateStrToDateExpr,\n ExplodeExpr,\n ArrayAppendExpr,\n ArrayConcatExpr,\n ArrayFilterExpr,\n JsonExtractExpr,\n JsonExtractScalarExpr,\n XorExpr,\n MergeExpr,\n MinExpr,\n MaxExpr,\n PercentileContExpr,\n PercentileDiscExpr,\n JsonObjectAggExpr,\n TrimExpr,\n StructExtractExpr,\n ColumnDefExpr,\n CurrentDateExpr,\n CurrentUserExpr,\n JsonArrayAggExpr,\n JsonbObjectAggExpr,\n WidthBucketExpr,\n PlaceholderExpr,\n VariadicExpr,\n CurrentSchemaExpr,\n BitwiseNotExpr,\n IntervalExpr,\n ArrayOverlapsExpr,\n ExplodingGenerateSeriesExpr,\n AutoIncrementColumnConstraintExpr,\n GeneratedAsIdentityColumnConstraintExpr,\n ColumnConstraintExpr,\n NotNullColumnConstraintExpr,\n LiteralExpr,\n CaseExpr,\n IsExpr,\n CoalesceExpr,\n AnyExpr,\n JsonbExtractExpr,\n JsonbExtractScalarExpr,\n JsonbContainsExpr,\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n UuidExpr,\n TimeToUnixExpr,\n UnicodeExpr,\n PowExpr,\n MatchAgainstExpr,\n ColumnExpr,\n ExtractExpr,\n JsonbExistsExpr,\n null_,\n toInterval,\n SetConfigPropertyExpr,\n LengthExpr,\n ParseJsonExpr,\n LastDayExpr,\n MapFromEntriesExpr,\n PivotExpr,\n PartitionedByPropertyExpr,\n ToCharExpr,\n CommentColumnConstraintExpr,\n PropertiesLocation,\n TransientPropertyExpr,\n VolatilePropertyExpr,\n InOutColumnConstraintExpr,\n GenerateDateArrayExpr,\n JoinExpr,\n FromExpr,\n TableExpr,\n IntoExpr,\n isType,\n var_,\n CurrentCatalogExpr,\n SessionUserExpr,\n} from '../expressions';\nimport {\n seqGet,\n} from '../helper';\nimport {\n eliminateSemiAndAntiJoins, eliminateQualify,\n addWithinGroupForPercentiles, preprocess,\n} from '../transforms';\nimport {\n annotateTypes,\n} from '../optimizer';\nimport {\n anyValueToMaxSql,\n arrayConcatSql,\n arrayAppendSql,\n binaryFromFunction,\n boolXorSql,\n buildFormattedTime,\n buildJsonExtractPath,\n buildTimestampTrunc,\n countIfToSum,\n dateStrToDateSql,\n filterArrayUsingUnnest,\n getBitSql,\n groupConcatSql,\n maxOrGreatest,\n mergeWithoutTargetSql,\n minOrLeast,\n noTrycastSql,\n regexpReplaceGlobalModifier,\n renameFunc,\n sha256Sql,\n sha2DigestSql,\n strPositionSql,\n structExtractSql,\n timeStrToTimeSql,\n timestampTruncSql,\n trimSql,\n noParenCurrentDateSql,\n jsonExtractSegments,\n jsonPathKeyOnlyName,\n noLastDaySql,\n noMapFromEntriesSql,\n noPivotSql,\n inlineArraySql,\n tsOrDsAddCast,\n Dialect, Dialects,\n NullOrdering,\n} from './dialect';\n\nconst DATE_DIFF_FACTOR: Record<string, string> = {\n MICROSECOND: ' * 1000000',\n MILLISECOND: ' * 1000',\n SECOND: '',\n MINUTE: ' / 60',\n HOUR: ' / 3600',\n DAY: ' / 86400',\n};\n\nfunction dateAddSql (kind: string) {\n return function (this: Generator, expression: DateAddExpr | DateSubExpr | TsOrDsAddExpr): string {\n let expr = expression;\n if (expr instanceof TsOrDsAddExpr) {\n expr = tsOrDsAddCast(expr);\n }\n\n const thisSql = this.sql(expr, 'this');\n const unit = expr.args.unit;\n\n let e = expr.args.expression && this.simplifyUnlessLiteral(expr.args.expression);\n if (e instanceof LiteralExpr) {\n e.setArgKey('isString', true);\n } else if (e && e.isNumber) {\n e = LiteralExpr.string(e.toValue()!);\n } else {\n this.unsupported('Cannot add non-literal');\n }\n\n return `${thisSql} ${kind} ${this.sql(new IntervalExpr({\n this: e,\n unit,\n }))}`;\n };\n}\n\nfunction dateDiffSql (this: Generator, expression: DateDiffExpr): string {\n const unit = expression.text('unit').toUpperCase();\n const factor = DATE_DIFF_FACTOR[unit];\n\n const end = `CAST(${this.sql(expression, 'this')} AS TIMESTAMP)`;\n const start = `CAST(${this.sql(expression, 'expression')} AS TIMESTAMP)`;\n\n if (factor !== undefined) {\n return `CAST(EXTRACT(epoch FROM ${end} - ${start})${factor} AS BIGINT)`;\n }\n\n const age = `AGE(${end}, ${start})`;\n let unitSql: string;\n\n if (unit === 'WEEK') {\n unitSql = `EXTRACT(days FROM (${end} - ${start})) / 7`;\n } else if (unit === 'MONTH') {\n unitSql = `EXTRACT(year FROM ${age}) * 12 + EXTRACT(month FROM ${age})`;\n } else if (unit === 'QUARTER') {\n unitSql = `EXTRACT(year FROM ${age}) * 4 + EXTRACT(month FROM ${age}) / 3`;\n } else if (unit === 'YEAR') {\n unitSql = `EXTRACT(year FROM ${age})`;\n } else {\n unitSql = age;\n }\n\n return `CAST(${unitSql} AS BIGINT)`;\n}\n\nfunction substringSql (this: Generator, expression: SubstringExpr): string {\n const thisSql = this.sql(expression, 'this');\n const start = this.sql(expression, 'start');\n const length = this.sql(expression, 'length');\n\n const fromPart = start ? ` FROM ${start}` : '';\n const forPart = length ? ` FOR ${length}` : '';\n\n return `SUBSTRING(${thisSql}${fromPart}${forPart})`;\n}\n\nfunction autoIncrementToSerial (expression: Expression): Expression {\n const auto = expression.find(AutoIncrementColumnConstraintExpr);\n\n if (auto && expression instanceof ColumnDefExpr) {\n const constraints = expression.args.constraints || [\n ];\n expression.setArgKey('constraints', constraints.filter((c) => c !== auto.parent));\n\n const kind = expression.args.kind;\n if (kind instanceof DataTypeExpr) {\n if (kind.isType(DataTypeExprKind.INT)) {\n kind.replace(new DataTypeExpr({\n this: DataTypeExprKind.SERIAL,\n }));\n } else if (kind.isType(DataTypeExprKind.SMALLINT)) {\n kind.replace(new DataTypeExpr({\n this: DataTypeExprKind.SMALLSERIAL,\n }));\n } else if (kind.isType(DataTypeExprKind.BIGINT)) {\n kind.replace(new DataTypeExpr({\n this: DataTypeExprKind.BIGSERIAL,\n }));\n }\n }\n }\n\n return expression;\n}\n\nfunction serialToGenerated (expression: Expression): Expression {\n if (!(expression instanceof ColumnDefExpr)) return expression;\n\n const kind = expression.args.kind;\n if (!(kind instanceof DataTypeExpr)) return expression;\n\n let dataType: DataTypeExpr | undefined;\n if (kind.isType(DataTypeExprKind.SERIAL)) {\n dataType = new DataTypeExpr({\n this: DataTypeExprKind.INT,\n });\n } else if (kind.isType(DataTypeExprKind.SMALLSERIAL)) {\n dataType = new DataTypeExpr({\n this: DataTypeExprKind.SMALLINT,\n });\n } else if (kind.isType(DataTypeExprKind.BIGSERIAL)) {\n dataType = new DataTypeExpr({\n this: DataTypeExprKind.BIGINT,\n });\n }\n\n if (dataType) {\n kind.replace(dataType);\n const constraints = expression.args.constraints || [\n ];\n const generated = new ColumnConstraintExpr({\n kind: new GeneratedAsIdentityColumnConstraintExpr({\n this: false,\n }),\n });\n const notNull = new ColumnConstraintExpr({\n kind: new NotNullColumnConstraintExpr({}),\n });\n\n if (!constraints.some((c) => c instanceof ColumnConstraintExpr && c.args.kind instanceof NotNullColumnConstraintExpr)) {\n constraints.unshift(notNull);\n }\n if (!constraints.some((c) => c instanceof ColumnConstraintExpr && c.args.kind instanceof GeneratedAsIdentityColumnConstraintExpr)) {\n constraints.unshift(generated);\n }\n expression.setArgKey('constraints', constraints);\n }\n\n return expression;\n}\n\nfunction buildGenerateSeries (args: Expression[]): ExplodingGenerateSeriesExpr {\n const step = seqGet(args, 2);\n if (step) {\n if (step instanceof LiteralExpr && step.isString) {\n args[2] = toInterval(step.args.this);\n } else if (step instanceof IntervalExpr && !step.args.unit) {\n args[2] = toInterval(step.args.this?.args.this as string | LiteralExpr);\n }\n }\n\n return ExplodingGenerateSeriesExpr.fromArgList(args);\n}\n\nfunction buildToTimestamp (args: Expression[]): UnixToTimeExpr | StrToTimeExpr {\n if (args.length === 1) {\n return UnixToTimeExpr.fromArgList(args);\n }\n return buildFormattedTime(StrToTimeExpr, {\n dialect: 'postgres',\n })(args);\n}\n\nfunction jsonExtractSql (name: string, op: string) {\n return function (this: Generator, expression: JsonExtractExpr | JsonExtractScalarExpr): string {\n const onlyJsonTypes = expression.args.onlyJsonTypes;\n if (onlyJsonTypes) {\n return jsonExtractSegments(name, {\n quotedIndex: false,\n op,\n }).call(this, expression);\n }\n return jsonExtractSegments(name).call(this, expression);\n };\n}\n\nfunction buildRegexpReplace (args: Expression[]): RegexpReplaceExpr {\n let regexpReplace: RegexpReplaceExpr | undefined;\n\n if (3 < args.length) {\n const last = args[args.length - 1];\n if (!(last instanceof LiteralExpr && last.isNumber)) {\n // In TS we skip the complex type annotation check unless necessary,\n // but we assume if it's a string literal, it's the modifiers\n if (last instanceof LiteralExpr && last.isString) {\n regexpReplace = RegexpReplaceExpr.fromArgList(args.slice(0, -1));\n regexpReplace.setArgKey('modifiers', last);\n }\n }\n }\n\n regexpReplace = regexpReplace || RegexpReplaceExpr.fromArgList(args);\n regexpReplace.setArgKey('singleReplace', true);\n return regexpReplace;\n}\n\nfunction unixToTimeSql (this: Generator, expression: UnixToTimeExpr): string {\n const scale = expression.args.scale;\n const timestamp = expression.args.this;\n\n if (scale === undefined || scale?.toValue() === UnixToTimeExpr.SECONDS.toValue()) {\n return this.func('TO_TIMESTAMP', [\n timestamp,\n this.formatTime(expression),\n ]);\n }\n\n const div = new DivExpr({\n this: timestamp?.copy(),\n expression: new PowExpr({\n this: LiteralExpr.number(10),\n expression: scale?.copy(),\n }),\n });\n\n return this.func('TO_TIMESTAMP', [\n div,\n this.formatTime(expression),\n ]);\n}\n\nfunction buildLevenshteinLessEqual (args: Expression[]): LevenshteinExpr {\n const maxDist = args.pop();\n\n return new LevenshteinExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n insCost: seqGet(args, 2),\n delCost: seqGet(args, 3),\n subCost: seqGet(args, 4),\n maxDist: maxDist,\n });\n}\n\nfunction levenshteinSql (this: Generator, expression: LevenshteinExpr): string {\n const name = expression.args.maxDist ? 'LEVENSHTEIN_LESS_EQUAL' : 'LEVENSHTEIN';\n return renameFunc(name).call(this, expression);\n}\n\nfunction versionedAnyValueSql (this: Generator, expression: AnyValueExpr): string {\n if (this.dialect.version.major < 16) {\n return anyValueToMaxSql.call(this, expression);\n }\n return renameFunc('ANY_VALUE').call(this, expression);\n}\n\nfunction roundSql (this: Generator, expression: RoundExpr): string {\n const thisSql = this.sql(expression, 'this');\n const decimals = this.sql(expression, 'decimals');\n\n if (!decimals) {\n return this.func('ROUND', [\n thisSql,\n ]);\n }\n\n let currentThis = thisSql;\n // If the input is double precision, we must cast to decimal in Postgres\n if (expression.args.this instanceof Expression && expression.args.this.isType(DataTypeExprKind.DOUBLE)) {\n const decimalType = DataTypeExpr.build(DataTypeExprKind.DECIMAL, {\n expressions: expression.args.expressions,\n });\n currentThis = this.sql(new CastExpr({\n this: thisSql,\n to: decimalType,\n }));\n }\n\n return this.func('ROUND', [\n currentThis,\n decimals,\n ]);\n}\n\nexport class PostgresTokenizer extends Tokenizer {\n @cache\n static get BIT_STRINGS (): TokenPair[] {\n return [\n [\n 'b\\'',\n '\\'',\n ],\n [\n 'B\\'',\n '\\'',\n ],\n '0b',\n ];\n }\n\n @cache\n static get HEX_STRINGS (): TokenPair[] {\n return [\n [\n 'x\\'',\n '\\'',\n ],\n [\n 'X\\'',\n '\\'',\n ],\n '0x',\n ];\n }\n\n @cache\n static get BYTE_STRINGS (): TokenPair[] {\n return [\n [\n 'e\\'',\n '\\'',\n ],\n [\n 'E\\'',\n '\\'',\n ],\n ];\n }\n\n @cache\n static get BYTE_STRING_ESCAPES () {\n return [\n '\\'',\n '\\\\',\n ];\n }\n\n @cache\n static get HEREDOC_STRINGS (): TokenPair[] {\n return [\n '$',\n ];\n }\n\n static HEREDOC_TAG_IS_IDENTIFIER = true;\n static HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER;\n\n @cache\n static get ORIGINAL_KEYWORDS (): Record<string, TokenType> {\n const {\n '/*+': _1, DIV: _2, ...kw\n } = Tokenizer.KEYWORDS;\n return {\n ...kw,\n '~': TokenType.RLIKE,\n '@@': TokenType.DAT,\n '@>': TokenType.AT_GT,\n '<@': TokenType.LT_AT,\n '?&': TokenType.QMARK_AMP,\n '?|': TokenType.QMARK_PIPE,\n '#-': TokenType.HASH_DASH,\n '|/': TokenType.PIPE_SLASH,\n '||/': TokenType.DPIPE_SLASH,\n 'BEGIN': TokenType.BEGIN,\n 'BIGSERIAL': TokenType.BIGSERIAL,\n 'CONSTRAINT TRIGGER': TokenType.COMMAND,\n 'CSTRING': TokenType.PSEUDO_TYPE,\n 'DECLARE': TokenType.COMMAND,\n 'DO': TokenType.COMMAND,\n 'EXEC': TokenType.COMMAND,\n 'HSTORE': TokenType.HSTORE,\n 'INT8': TokenType.BIGINT,\n 'MONEY': TokenType.MONEY,\n 'NAME': TokenType.NAME,\n 'OID': TokenType.OBJECT_IDENTIFIER,\n 'ONLY': TokenType.ONLY,\n 'POINT': TokenType.POINT,\n 'REFRESH': TokenType.COMMAND,\n 'REINDEX': TokenType.COMMAND,\n 'RESET': TokenType.COMMAND,\n 'SERIAL': TokenType.SERIAL,\n 'SMALLSERIAL': TokenType.SMALLSERIAL,\n 'TEMP': TokenType.TEMPORARY,\n 'REGCLASS': TokenType.OBJECT_IDENTIFIER,\n 'REGCOLLATION': TokenType.OBJECT_IDENTIFIER,\n 'REGCONFIG': TokenType.OBJECT_IDENTIFIER,\n 'REGDICTIONARY': TokenType.OBJECT_IDENTIFIER,\n 'REGNAMESPACE': TokenType.OBJECT_IDENTIFIER,\n 'REGOPER': TokenType.OBJECT_IDENTIFIER,\n 'REGOPERATOR': TokenType.OBJECT_IDENTIFIER,\n 'REGPROC': TokenType.OBJECT_IDENTIFIER,\n 'REGPROCEDURE': TokenType.OBJECT_IDENTIFIER,\n 'REGROLE': TokenType.OBJECT_IDENTIFIER,\n 'REGTYPE': TokenType.OBJECT_IDENTIFIER,\n 'FLOAT': TokenType.DOUBLE,\n 'XML': TokenType.XML,\n 'VARIADIC': TokenType.VARIADIC,\n 'INOUT': TokenType.INOUT,\n };\n }\n\n @cache\n static get SINGLE_TOKENS (): Record<string, TokenType> {\n return {\n ...Tokenizer.SINGLE_TOKENS,\n $: TokenType.HEREDOC_STRING,\n };\n }\n\n @cache\n static get VAR_SINGLE_TOKENS () {\n return new Set([\n '$',\n ]);\n }\n}\n\nclass PostgresParser extends Parser {\n // port from _Dialect metaclass logic\n @cache\n static get NO_PAREN_FUNCTIONS () {\n const noParenFunctions = {\n ...Parser.NO_PAREN_FUNCTIONS,\n };\n noParenFunctions[TokenType.CURRENT_SCHEMA] = CurrentSchemaExpr;\n noParenFunctions[TokenType.SESSION_USER] = SessionUserExpr;\n noParenFunctions[TokenType.CURRENT_CATALOG] = CurrentCatalogExpr;\n return noParenFunctions;\n }\n\n static SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT = true;\n\n @cache\n static get PROPERTY_PARSERS (): Record<string, (this: Parser, ...args: unknown[]) => Expression | Expression[] | undefined> {\n return (() => {\n const parsers: Record<string, (this: Parser, ...args: unknown[]) => Expression | Expression[] | undefined> = {\n ...Parser.PROPERTY_PARSERS,\n SET: function (this: Parser) {\n return this.expression(SetConfigPropertyExpr, {\n this: (this as PostgresParser).parseSet(),\n });\n },\n };\n delete parsers['INPUT'];\n return parsers;\n })();\n }\n\n @cache\n static get PLACEHOLDER_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.PLACEHOLDER_PARSERS,\n [TokenType.PLACEHOLDER]: function (this: Parser) {\n return this.expression(PlaceholderExpr, {\n jdbc: true,\n });\n },\n [TokenType.MOD]: function (this: Parser) {\n return (this as PostgresParser).parseQueryParameter();\n },\n };\n }\n\n @cache\n static get FUNCTIONS (): Record<string, (args: Expression[], options: {dialect: Dialect}) => Expression> {\n return {\n ...Parser.FUNCTIONS,\n ARRAY_PREPEND: (args: Expression[]) => new ArrayPrependExpr({\n this: seqGet(args, 1),\n expression: seqGet(args, 0),\n }),\n BIT_AND: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BIT_OR: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BIT_XOR: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n VERSION: (args: unknown[]) => CurrentVersionExpr.fromArgList(args),\n DATE_TRUNC: buildTimestampTrunc,\n DIV: (args: Expression[]) => new CastExpr({\n this: binaryFromFunction(IntDivExpr)(args),\n to: DataTypeExpr.build('decimal'),\n }),\n GENERATE_SERIES: buildGenerateSeries,\n GET_BIT: (args: Expression[]) => new GetbitExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n zeroIsMsb: true,\n }),\n JSON_EXTRACT_PATH: buildJsonExtractPath(JsonExtractExpr),\n JSON_EXTRACT_PATH_TEXT: buildJsonExtractPath(JsonExtractScalarExpr),\n LENGTH: (args: Expression[]) => new LengthExpr({\n this: seqGet(args, 0),\n encoding: seqGet(args, 1),\n }),\n MAKE_TIME: (args: unknown[]) => TimeFromPartsExpr.fromArgList(args),\n MAKE_TIMESTAMP: (args: unknown[]) => TimestampFromPartsExpr.fromArgList(args),\n NOW: (args: unknown[]) => CurrentTimestampExpr.fromArgList(args),\n REGEXP_REPLACE: buildRegexpReplace,\n TO_CHAR: buildFormattedTime(TimeToStrExpr, {\n dialect: 'postgres',\n }),\n TO_DATE: buildFormattedTime(StrToDateExpr, {\n dialect: 'postgres',\n }),\n TO_TIMESTAMP: buildToTimestamp,\n UNNEST: (args: unknown[]) => ExplodeExpr.fromArgList(args),\n SHA256: (args: Expression[]) => new Sha2Expr({\n this: seqGet(args, 0),\n length: LiteralExpr.number(256),\n }),\n SHA384: (args: Expression[]) => new Sha2Expr({\n this: seqGet(args, 0),\n length: LiteralExpr.number(384),\n }),\n SHA512: (args: Expression[]) => new Sha2Expr({\n this: seqGet(args, 0),\n length: LiteralExpr.number(512),\n }),\n LEVENSHTEIN_LESS_EQUAL: buildLevenshteinLessEqual,\n JSON_OBJECT_AGG: (args: unknown[]) => JsonObjectAggExpr.fromArgList(args),\n JSONB_OBJECT_AGG: (args: unknown[]) => JsonbObjectAggExpr.fromArgList(args),\n WIDTH_BUCKET: (args: Expression[]) => args.length === 2\n ? new WidthBucketExpr({\n this: seqGet(args, 0),\n threshold: seqGet(args, 1),\n })\n : WidthBucketExpr.fromArgList(args),\n };\n }\n\n @cache\n static get NO_PAREN_FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.NO_PAREN_FUNCTION_PARSERS,\n VARIADIC: function (this: Parser) {\n return this.expression(VariadicExpr, {\n this: (this as PostgresParser).parseBitwise(),\n });\n },\n };\n }\n\n @cache\n static get FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.FUNCTION_PARSERS,\n DATE_PART: function (this: Parser) {\n return (this as PostgresParser).parseDatePart();\n },\n JSON_AGG: function (this: Parser) {\n return this.expression(JsonArrayAggExpr, {\n this: (this as PostgresParser).parseLambda(),\n order: (this as PostgresParser).parseOrder(),\n });\n },\n JSONB_EXISTS: function (this: Parser) {\n return (this as PostgresParser).parseJsonbExists();\n },\n };\n }\n\n @cache\n static get BITWISE (): Partial<Record<TokenType, typeof Expression>> {\n return {\n ...Parser.BITWISE,\n [TokenType.HASH]: BitwiseXorExpr,\n };\n }\n\n @cache\n static get EXPONENT () {\n return {\n [TokenType.CARET]: PowExpr,\n };\n }\n\n @cache\n static get RANGE_PARSERS (): Partial<Record<TokenType, (this: Parser, this_: Expression) => Expression | undefined>> {\n return {\n ...Parser.RANGE_PARSERS,\n [TokenType.DAMP]: binaryRangeParser(ArrayOverlapsExpr),\n [TokenType.DAT]: function (this: Parser, thisNode: Expression) {\n return this.expression(MatchAgainstExpr, {\n this: (this as PostgresParser).parseBitwise(),\n expressions: [\n thisNode,\n ],\n });\n },\n };\n }\n\n @cache\n static get STATEMENT_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.STATEMENT_PARSERS,\n [TokenType.END]: function (this: Parser) {\n return (this as PostgresParser).parseCommitOrRollback();\n },\n };\n }\n\n @cache\n static get UNARY_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.UNARY_PARSERS,\n [TokenType.RLIKE]: function (this: Parser) {\n return this.expression(BitwiseNotExpr, {\n this: (this as PostgresParser).parseUnary(),\n });\n },\n };\n }\n\n static JSON_ARROWS_REQUIRE_JSON_TYPE = true;\n @cache\n static get COLUMN_OPERATORS (): Partial<Record<TokenType, undefined | ((this: Parser, this_?: Expression, to?: Expression) => Expression)>> {\n return {\n ...Parser.COLUMN_OPERATORS,\n [TokenType.ARROW]: function (this: Parser, thisNode?: Expression, path?: Expression) {\n return this.validateExpression(\n buildJsonExtractPath(JsonExtractExpr, {\n arrowReqJsonType: (this.constructor as typeof PostgresParser).JSON_ARROWS_REQUIRE_JSON_TYPE,\n })([\n thisNode,\n path,\n ]),\n );\n },\n [TokenType.DARROW]: function (this: Parser, thisNode?: Expression, path?: Expression) {\n return this.validateExpression(\n buildJsonExtractPath(JsonExtractScalarExpr, {\n arrowReqJsonType: (this.constructor as typeof PostgresParser).JSON_ARROWS_REQUIRE_JSON_TYPE,\n })([\n thisNode,\n path,\n ]),\n );\n },\n };\n }\n\n @cache\n static get ARG_MODE_TOKENS () {\n return new Set([\n TokenType.IN,\n TokenType.OUT,\n TokenType.INOUT,\n TokenType.VARIADIC,\n ]);\n }\n\n parseParameterMode (): TokenType | undefined {\n if (!this.matchSet((this.constructor as typeof PostgresParser).ARG_MODE_TOKENS, {\n advance: false,\n }) || !this.next) {\n return undefined;\n }\n\n const modeToken = this.curr;\n\n // Check Pattern 1: MODE TYPE\n const isFollowedByBuiltinType = this.tryParse(\n () => {\n this.advance();\n return this.parseTypes({\n checkFunc: false,\n allowIdentifiers: false,\n });\n },\n {\n retreat: true,\n },\n );\n\n if (isFollowedByBuiltinType) {\n return undefined;\n }\n\n // Check Pattern 2: MODE NAME TYPE\n if (!this.next || !(this.constructor as typeof PostgresParser).ID_VAR_TOKENS.has(this.next.tokenType)) {\n return undefined;\n }\n\n const isFollowedByAnyType = this.tryParse(\n () => {\n this.advance(2);\n return this.parseTypes({\n checkFunc: false,\n allowIdentifiers: true,\n });\n },\n {\n retreat: true,\n },\n );\n\n if (isFollowedByAnyType) {\n return modeToken?.tokenType;\n }\n\n return undefined;\n }\n\n createModeConstraint (paramMode: TokenType): InOutColumnConstraintExpr {\n return this.expression(InOutColumnConstraintExpr, {\n input: paramMode === TokenType.IN || paramMode === TokenType.INOUT,\n output: paramMode === TokenType.OUT || paramMode === TokenType.INOUT,\n variadic: paramMode === TokenType.VARIADIC,\n });\n }\n\n parseFunctionParameter (): Expression | undefined {\n const paramMode = this.parseParameterMode();\n\n if (paramMode) {\n this.advance();\n }\n\n const paramName = this.parseIdVar();\n const columnDef = this.parseColumnDef(paramName, {\n computedColumn: false,\n });\n\n if (paramMode && columnDef instanceof ColumnDefExpr) {\n const constraint = this.createModeConstraint(paramMode);\n if (!columnDef.args.constraints) {\n columnDef.setArgKey('constraints', [\n ]);\n }\n columnDef.args.constraints?.unshift(new ColumnConstraintExpr({\n kind: constraint,\n }));\n }\n\n return columnDef;\n }\n\n parseQueryParameter (): Expression | undefined {\n const thisNode = this.match(TokenType.L_PAREN, {\n advance: false,\n })\n ? this.parseWrapped(() => this.parseIdVar())\n : undefined;\n\n this.matchTextSeq('S');\n return this.expression(PlaceholderExpr, {\n this: thisNode,\n });\n }\n\n parseDatePart (): Expression {\n let part = this.parseType();\n this.match(TokenType.COMMA);\n const value = this.parseBitwise();\n\n if (part && (part instanceof ColumnExpr || part instanceof LiteralExpr)) {\n part = var_(part.name);\n }\n\n return this.expression(ExtractExpr, {\n this: part,\n expression: value,\n });\n }\n\n parseUniqueKey (): Expression | undefined {\n return undefined;\n }\n\n parseJsonbExists (): JsonbExistsExpr {\n return this.expression(JsonbExistsExpr, {\n this: this.parseBitwise(),\n path: this.match(TokenType.COMMA) && this.dialect.toJsonPath(this.parseBitwise()),\n });\n }\n\n parseGeneratedAsIdentity (): GeneratedAsIdentityColumnConstraintExpr | ComputedColumnConstraintExpr | GeneratedAsRowColumnConstraintExpr {\n let thisNode = super.parseGeneratedAsIdentity();\n\n if (this.matchTextSeq('STORED')) {\n thisNode = this.expression(ComputedColumnConstraintExpr, {\n this: thisNode.args.expression,\n });\n }\n\n return thisNode;\n }\n\n parseUserDefinedType (identifier: IdentifierExpr): Expression | undefined {\n let udtType: IdentifierExpr | DotExpr = identifier;\n\n while (this.match(TokenType.DOT)) {\n const part = this.parseIdVar();\n if (part) {\n udtType = new DotExpr({\n this: udtType,\n expression: part,\n });\n }\n }\n\n return DataTypeExpr.build(udtType, {\n udt: true,\n });\n }\n\n // port from _Dialect metaclass logic\n @cache\n static get ID_VAR_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.ID_VAR_TOKENS,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n\n // port from _Dialect metaclass logic\n @cache\n static get TABLE_ALIAS_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.TABLE_ALIAS_TOKENS,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n}\nclass PostgresGenerator extends Generator {\n // port from _Dialect metaclass logic\n @cache\n static get AFTER_HAVING_MODIFIER_TRANSFORMS () {\n const modifiers = new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);\n [\n 'cluster',\n 'distribute',\n 'sort',\n ].forEach((m) => modifiers.delete(m));\n return modifiers;\n }\n\n // port from _Dialect metaclass logic\n static SUPPORTS_DECODE_CASE = false;\n // port from _Dialect metaclass logic\n static readonly SELECT_KINDS: string[] = [\n ];\n // port from _Dialect metaclass logic\n static TRY_SUPPORTED = false;\n // port from _Dialect metaclass logic\n static SUPPORTS_UESCAPE = false;\n static SINGLE_STRING_INTERVAL = true;\n static RENAME_TABLE_WITH_DB = false;\n static LOCKING_READS_SUPPORTED = true;\n static JOIN_HINTS = false;\n static TABLE_HINTS = false;\n static QUERY_HINTS = false;\n static NVL2_SUPPORTED = false;\n static PARAMETER_TOKEN = '$';\n static NAMED_PLACEHOLDER_TOKEN = '%';\n static TABLESAMPLE_SIZE_IS_ROWS = false;\n static TABLESAMPLE_SEED_KEYWORD = 'REPEATABLE';\n static SUPPORTS_SELECT_INTO = true;\n static JSON_TYPE_REQUIRED_FOR_EXTRACTION = true;\n static SUPPORTS_UNLOGGED_TABLES = true;\n static LIKE_PROPERTY_INSIDE_SCHEMA = true;\n static MULTI_ARG_DISTINCT = false;\n static CAN_IMPLEMENT_ARRAY_ANY = true;\n static SUPPORTS_WINDOW_EXCLUDE = true;\n static COPY_HAS_INTO_KEYWORD = false;\n static ARRAY_CONCAT_IS_VAR_LEN = false;\n static SUPPORTS_MEDIAN = false;\n static ARRAY_SIZE_DIM_REQUIRED = true;\n static SUPPORTS_BETWEEN_FLAGS = true;\n static INOUT_SEPARATOR = '';\n\n @cache\n static get SUPPORTED_JSON_PATH_PARTS (): Set<typeof Expression> {\n return new Set([\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n ]);\n }\n\n @cache\n static get TYPE_MAPPING (): Map<DataTypeExprKind | string, string> {\n return new Map<DataTypeExprKind | string, string>([\n ...Generator.TYPE_MAPPING,\n [\n DataTypeExprKind.TINYINT,\n 'SMALLINT',\n ],\n [\n DataTypeExprKind.FLOAT,\n 'REAL',\n ],\n [\n DataTypeExprKind.DOUBLE,\n 'DOUBLE PRECISION',\n ],\n [\n DataTypeExprKind.BINARY,\n 'BYTEA',\n ],\n [\n DataTypeExprKind.VARBINARY,\n 'BYTEA',\n ],\n [\n DataTypeExprKind.ROWVERSION,\n 'BYTEA',\n ],\n [\n DataTypeExprKind.DATETIME,\n 'TIMESTAMP',\n ],\n [\n DataTypeExprKind.TIMESTAMPNTZ,\n 'TIMESTAMP',\n ],\n [\n DataTypeExprKind.BLOB,\n 'BYTEA',\n ],\n ]);\n }\n\n lateralSql (expression: LateralExpr): string {\n let sql = super.lateralSql(expression);\n\n if (expression.args.crossApply !== undefined) {\n sql = `${sql} ON TRUE`;\n }\n\n return sql;\n }\n\n jsonbExtractSql (e: JsonbExtractExpr): string {\n return this.binary(e, '#>');\n }\n\n jsonbExtractScalarSql (e: JsonbExtractScalarExpr): string {\n return this.binary(e, '#>>');\n }\n\n explodeSql (e: ExplodeExpr): string {\n return this.func('UNNEST', [\n e.args.this,\n ...e.args.expressions || [\n ],\n ]);\n }\n\n @cache\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get ORIGINAL_TRANSFORMS (): Map<typeof Expression, (this: Generator, e: any) => string> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transforms = new Map<typeof Expression, (this: Generator, e: any) => string>([\n ...Generator.TRANSFORMS,\n [\n AnyValueExpr,\n versionedAnyValueSql,\n ],\n [\n ArrayConcatExpr,\n arrayConcatSql('ARRAY_CAT'),\n ],\n [\n ArrayFilterExpr,\n filterArrayUsingUnnest,\n ],\n [\n ArrayAppendExpr,\n arrayAppendSql('ARRAY_APPEND'),\n ],\n [\n ArrayPrependExpr,\n arrayAppendSql('ARRAY_PREPEND', {\n swapParams: true,\n }),\n ],\n [\n BitwiseAndAggExpr,\n renameFunc('BIT_AND'),\n ],\n [\n BitwiseOrAggExpr,\n renameFunc('BIT_OR'),\n ],\n [\n BitwiseXorExpr,\n function (this: Generator, e: BitwiseXorExpr) {\n return this.binary(e, '#');\n },\n ],\n [\n BitwiseXorAggExpr,\n renameFunc('BIT_XOR'),\n ],\n [\n ColumnDefExpr,\n preprocess([\n autoIncrementToSerial,\n serialToGenerated,\n ]),\n ],\n [\n CurrentDateExpr,\n noParenCurrentDateSql,\n ],\n [\n CurrentTimestampExpr,\n () => 'CURRENT_TIMESTAMP',\n ],\n [\n CurrentUserExpr,\n () => 'CURRENT_USER',\n ],\n [\n CurrentVersionExpr,\n renameFunc('VERSION'),\n ],\n [\n DateAddExpr,\n dateAddSql('+'),\n ],\n [\n DateDiffExpr,\n dateDiffSql,\n ],\n [\n DateStrToDateExpr,\n dateStrToDateSql,\n ],\n [\n DateSubExpr,\n dateAddSql('-'),\n ],\n [\n ExplodeExpr,\n renameFunc('UNNEST'),\n ],\n [\n ExplodingGenerateSeriesExpr,\n renameFunc('GENERATE_SERIES'),\n ],\n [\n GetbitExpr,\n getBitSql,\n ],\n [\n GroupConcatExpr,\n function (this: Generator, e: GroupConcatExpr) {\n return groupConcatSql.call(this, e, {\n funcName: 'STRING_AGG',\n withinGroup: false,\n });\n },\n ],\n [\n IntDivExpr,\n renameFunc('DIV'),\n ],\n [\n JsonArrayAggExpr,\n function (this: Generator, e: JsonArrayAggExpr) {\n const thisSql = this.sql(e, 'this');\n const orderSql = this.sql(e, 'order');\n const inner = orderSql ? `${thisSql}${orderSql}` : thisSql;\n return `JSON_AGG(${inner})`;\n },\n ],\n [\n JsonExtractExpr,\n jsonExtractSql('JSON_EXTRACT_PATH', '->'),\n ],\n [\n JsonExtractScalarExpr,\n jsonExtractSql('JSON_EXTRACT_PATH_TEXT', '->>'),\n ],\n [\n JsonbExtractExpr,\n function (this: Generator, e: JsonbExtractExpr) {\n return this.binary(e, '#>');\n },\n ],\n [\n JsonbExtractScalarExpr,\n function (this: Generator, e: JsonbExtractScalarExpr) {\n return this.binary(e, '#>>');\n },\n ],\n [\n JsonbContainsExpr,\n function (this: Generator, e: JsonbContainsExpr) {\n return this.binary(e, '?');\n },\n ],\n [\n ParseJsonExpr,\n function (this: Generator, e: ParseJsonExpr) {\n return this.sql(new CastExpr({\n this: e.args.this,\n to: DataTypeExpr.build('json'),\n }));\n },\n ],\n [\n JsonPathKeyExpr,\n jsonPathKeyOnlyName,\n ],\n [\n JsonPathRootExpr,\n () => '',\n ],\n [\n JsonPathSubscriptExpr,\n function (this: Generator, e: JsonPathSubscriptExpr) {\n return this.jsonPathPart(e.args.this);\n },\n ],\n [\n LastDayExpr,\n noLastDaySql,\n ],\n [\n LogicalOrExpr,\n renameFunc('BOOL_OR'),\n ],\n [\n LogicalAndExpr,\n renameFunc('BOOL_AND'),\n ],\n [\n MaxExpr,\n maxOrGreatest,\n ],\n [\n MapFromEntriesExpr,\n noMapFromEntriesSql,\n ],\n [\n MinExpr,\n minOrLeast,\n ],\n [\n MergeExpr,\n mergeWithoutTargetSql,\n ],\n [\n PartitionedByPropertyExpr,\n function (this: Generator, e: PartitionedByPropertyExpr) {\n return `PARTITION BY ${this.sql(e, 'this')}`;\n },\n ],\n [\n PercentileContExpr,\n preprocess([\n addWithinGroupForPercentiles,\n ]),\n ],\n [\n PercentileDiscExpr,\n preprocess([\n addWithinGroupForPercentiles,\n ]),\n ],\n [\n PivotExpr,\n noPivotSql,\n ],\n [\n RandExpr,\n renameFunc('RANDOM'),\n ],\n [\n RegexpLikeExpr,\n function (this: Generator, e: RegexpLikeExpr) {\n return this.binary(e, '~');\n },\n ],\n [\n RegexpILikeExpr,\n function (this: Generator, e: RegexpILikeExpr) {\n return this.binary(e, '~*');\n },\n ],\n [\n RegexpReplaceExpr,\n function (this: Generator, e: RegexpReplaceExpr) {\n return this.func('REGEXP_REPLACE', [\n e.args.this,\n e.args.expression,\n e.args.replacement,\n e.args.position,\n e.args.occurrence,\n regexpReplaceGlobalModifier(e),\n ]);\n },\n ],\n [\n RoundExpr,\n roundSql,\n ],\n [\n SelectExpr,\n preprocess([\n eliminateSemiAndAntiJoins,\n eliminateQualify,\n ]),\n ],\n [\n Sha2Expr,\n sha256Sql,\n ],\n [\n Sha2DigestExpr,\n sha2DigestSql,\n ],\n [\n StrPositionExpr,\n function (this: Generator, e: StrPositionExpr) {\n return strPositionSql.call(this, e, {\n funcName: 'POSITION',\n });\n },\n ],\n [\n StrToDateExpr,\n function (this: Generator, e: StrToDateExpr) {\n return this.func('TO_DATE', [\n e.args.this,\n this.formatTime(e),\n ]);\n },\n ],\n [\n StrToTimeExpr,\n function (this: Generator, e: StrToTimeExpr) {\n return this.func('TO_TIMESTAMP', [\n e.args.this,\n this.formatTime(e),\n ]);\n },\n ],\n [\n StructExtractExpr,\n structExtractSql,\n ],\n [\n SubstringExpr,\n substringSql,\n ],\n [\n TimeFromPartsExpr,\n renameFunc('MAKE_TIME'),\n ],\n [\n TimestampFromPartsExpr,\n renameFunc('MAKE_TIMESTAMP'),\n ],\n [\n TimestampTruncExpr,\n timestampTruncSql({\n zone: true,\n }),\n ],\n [\n TimeStrToTimeExpr,\n timeStrToTimeSql,\n ],\n [\n TimeToStrExpr,\n function (this: Generator, e: TimeToStrExpr) {\n if (typeof e.args.format === 'string' || e.args.format?.isString) {\n return this.func('TO_CHAR', [\n e.args.this,\n this.formatTime(e),\n ]);\n }\n return this.func('TO_CHAR', [\n e.args.this,\n e.args.format,\n ]);\n },\n ],\n [\n ToCharExpr,\n function (this: Generator, e: ToCharExpr) {\n return e.args.format ? this.functionFallbackSql(e) : (this as PostgresGenerator).toCharSql(e);\n },\n ],\n [\n TrimExpr,\n trimSql,\n ],\n [\n TryCastExpr,\n noTrycastSql,\n ],\n [\n TsOrDsAddExpr,\n dateAddSql('+'),\n ],\n [\n TsOrDsDiffExpr,\n dateDiffSql,\n ],\n [\n UnixToTimeExpr,\n unixToTimeSql,\n ],\n [\n UuidExpr,\n () => 'GEN_RANDOM_UUID()',\n ],\n [\n TimeToUnixExpr,\n function (this: Generator, e: TimeToUnixExpr) {\n return this.func('DATE_PART', [\n LiteralExpr.string('epoch'),\n e.args.this,\n ]);\n },\n ],\n [\n VariancePopExpr,\n renameFunc('VAR_POP'),\n ],\n [\n VarianceExpr,\n renameFunc('VAR_SAMP'),\n ],\n [\n XorExpr,\n boolXorSql,\n ],\n [\n UnicodeExpr,\n renameFunc('ASCII'),\n ],\n [\n LevenshteinExpr,\n levenshteinSql,\n ],\n [\n JsonObjectAggExpr,\n renameFunc('JSON_OBJECT_AGG'),\n ],\n [\n JsonbObjectAggExpr,\n renameFunc('JSONB_OBJECT_AGG'),\n ],\n [\n CountIfExpr,\n countIfToSum,\n ],\n [\n IntoExpr,\n function (this: Generator, e: IntoExpr) {\n // PostgreSQL SELECT INTO only supports INTO <table>, not INTO with variable list (Oracle syntax)\n if (e.args.expressions && 0 < e.args.expressions.length) {\n this.unsupported('Oracle-style SELECT INTO with variables is not supported in PostgreSQL');\n }\n const temporary = e.args.temporary ? ' TEMPORARY' : '';\n const unlogged = e.args.unlogged ? ' UNLOGGED' : '';\n const modifier = temporary || unlogged;\n return `${this.seg('INTO')}${modifier} ${this.sql(e, 'this')}`;\n },\n ],\n ]);\n transforms.delete(CommentColumnConstraintExpr);\n return transforms;\n }\n\n @cache\n static get PROPERTIES_LOCATION () {\n const m = new Map(Generator.PROPERTIES_LOCATION);\n m.set(PartitionedByPropertyExpr, PropertiesLocation.POST_SCHEMA);\n m.set(TransientPropertyExpr, PropertiesLocation.UNSUPPORTED);\n m.set(VolatilePropertyExpr, PropertiesLocation.UNSUPPORTED);\n return m;\n }\n\n schemaCommentPropertySql (_expression: SchemaCommentPropertyExpr): string {\n this.unsupported('Table comments are not supported in the CREATE statement');\n return '';\n }\n\n commentColumnConstraintSql (_expression: CommentColumnConstraintExpr): string {\n this.unsupported('Column comments are not supported in the CREATE statement');\n return '';\n }\n\n columnDefSql (expression: ColumnDefExpr, options: {sep?: string} = {}): string {\n const {\n sep = ' ',\n } = options;\n const paramConstraint = expression.find(InOutColumnConstraintExpr);\n\n if (paramConstraint) {\n const modeSql = this.sql(paramConstraint);\n paramConstraint.pop();\n const baseSql = super.columnDefSql(expression, {\n sep,\n });\n return `${modeSql} ${baseSql}`;\n }\n\n return super.columnDefSql(expression, {\n sep,\n });\n }\n\n unnestSql (expression: UnnestExpr): string {\n if (expression.args.expressions?.length === 1) {\n const arg = expression.args.expressions[0];\n if (arg instanceof GenerateDateArrayExpr) {\n let generateSeries: Expression = new GenerateSeriesExpr({\n ...arg.args,\n });\n if (expression.parent instanceof FromExpr || expression.parent instanceof JoinExpr) {\n generateSeries = select('value::date')\n .from(new TableExpr({\n this: generateSeries,\n }).as('_t', {\n table: [\n 'value',\n ],\n }))\n .subquery(expression.args.alias instanceof Expression ? expression.args.alias : (typeof expression.args.alias === 'string' ? expression.args.alias : '_unnested_generate_series'));\n }\n return this.sql(generateSeries);\n }\n\n const thisNode = arg instanceof Expression\n ? annotateTypes(arg, {\n dialect: this.dialect,\n })\n : arg;\n if (isType(thisNode, 'array<json>')) {\n let current = thisNode;\n while (current instanceof CastExpr) {\n const inner = current.args.this;\n if (inner instanceof Expression) {\n current = inner;\n } else {\n break;\n }\n }\n\n const argAsJson = this.sql(new CastExpr({\n this: current,\n to: DataTypeExpr.build('json'),\n }));\n let alias = this.sql(expression, 'alias');\n alias = alias ? ` AS ${alias}` : '';\n\n if (expression.args.offset) {\n this.unsupported('Unsupported JSON_ARRAY_ELEMENTS with offset');\n }\n\n return `JSON_ARRAY_ELEMENTS(${argAsJson})${alias}`;\n }\n }\n\n return super.unnestSql(expression);\n }\n\n bracketSql (expression: BracketExpr): string {\n if (expression.args.this instanceof ArrayExpr) {\n expression.setArgKey('this', new ParenExpr({\n this: expression.args.this,\n }));\n }\n\n return super.bracketSql(expression);\n }\n\n matchAgainstSql (expression: MatchAgainstExpr): string {\n const thisSql = this.sql(expression, 'this');\n const expressions = (expression.args.expressions ?? [\n ]).map((e) => `${this.sql(e)} @@ ${thisSql}`);\n const sql = expressions.join(' OR ');\n return 1 < expressions.length ? `(${sql})` : sql;\n }\n\n alterSetSql (expression: AlterSetExpr): string {\n let exprs = this.expressions(expression, {\n flat: true,\n });\n exprs = exprs ? `(${exprs})` : '';\n\n let accessMethod = this.sql(expression, 'accessMethod');\n accessMethod = accessMethod ? `ACCESS METHOD ${accessMethod}` : '';\n let tablespace = this.sql(expression, 'tablespace');\n tablespace = tablespace ? `TABLESPACE ${tablespace}` : '';\n const option = this.sql(expression, 'option');\n\n return `SET ${exprs}${accessMethod}${tablespace}${option}`;\n }\n\n dataTypeSql (expression: DataTypeExpr): string {\n if (expression.isType(DataTypeExprKind.ARRAY)) {\n if (expression.args.expressions && 0 < expression.args.expressions.length) {\n const values = this.expressions(expression, {\n key: 'values',\n flat: true,\n });\n return `${this.expressions(expression, {\n flat: true,\n })}[${values}]`;\n }\n return 'ARRAY';\n }\n\n if (\n expression.isType([\n DataTypeExprKind.DOUBLE,\n DataTypeExprKind.FLOAT,\n ])\n && expression.args.expressions\n && 0 < expression.args.expressions.length\n ) {\n return `FLOAT(${this.expressions(expression, {\n flat: true,\n })})`;\n }\n\n return super.dataTypeSql(expression);\n }\n\n castSql (expression: CastExpr, options: {safePrefix?: string} = {}): string {\n const {\n safePrefix,\n } = options;\n const thisNode = expression.args.this;\n\n if (\n thisNode instanceof IntDivExpr\n && expression.args.to instanceof DataTypeExpr\n && expression.args.to.isType(DataTypeExprKind.DECIMAL)\n && !expression.args.to.args.expressions?.length\n ) {\n return this.sql(thisNode);\n }\n\n return super.castSql(expression, {\n safePrefix,\n });\n }\n\n arraySql (expression: ArrayExpr): string {\n const exprs = expression.args.expressions || [\n ];\n const funcName = this.normalizeFunc('ARRAY');\n\n if (exprs[0] instanceof SelectExpr) {\n return `${funcName}(${this.sql(exprs[0])})`;\n }\n\n return `${funcName}${inlineArraySql.call(this, expression)}`;\n }\n\n computedColumnConstraintSql (expression: ComputedColumnConstraintExpr): string {\n return `GENERATED ALWAYS AS (${this.sql(expression, 'this')}) STORED`;\n }\n\n isAsciiSql (expression: IsAsciiExpr): string {\n return `(${this.sql(expression.args.this)} ~ '^[[:ascii:]]*$')`;\n }\n\n ignoreNullsSql (expression: IgnoreNullsExpr): string {\n this.unsupported('PostgreSQL does not support IGNORE NULLS.');\n return this.sql(expression.args.this);\n }\n\n respectNullsSql (expression: RespectNullsExpr): string {\n this.unsupported('PostgreSQL does not support RESPECT NULLS.');\n return this.sql(expression.args.this);\n }\n\n currentSchemaSql (expression: CurrentSchemaExpr): string {\n if (expression.args.this) {\n this.unsupported('Unsupported arg \\'this\\' for CURRENT_SCHEMA');\n }\n return 'CURRENT_SCHEMA';\n }\n\n intervalSql (expression: IntervalExpr): string {\n const unit = expression.text('unit').toLowerCase();\n const thisNode = expression.args.this;\n\n if (unit.startsWith('quarter') && thisNode instanceof LiteralExpr) {\n thisNode.setArgKey('this', (parseInt(thisNode.args.this ?? '0') * 3).toString());\n expression.args.unit?.replace(new IdentifierExpr({\n this: 'MONTH',\n }));\n }\n\n return super.intervalSql(expression);\n }\n\n placeholderSql (expression: PlaceholderExpr): string {\n if (expression.args.jdbc) {\n return '?';\n }\n\n const thisPart = expression.args.this ? `(${expression.name})` : '';\n return `${(this.constructor as typeof PostgresGenerator).NAMED_PLACEHOLDER_TOKEN}${thisPart}s`;\n }\n\n arrayContainsSql (expression: ArrayContainsExpr): string {\n const value = expression.args.expression;\n const array = expression.args.this;\n\n if (!value) return '';\n\n const coalesceExpr = new CoalesceExpr({\n this: value.eq(new AnyExpr({\n this: new ParenExpr({\n this: array,\n }),\n })),\n expressions: [\n new BooleanExpr({\n this: false,\n }),\n ],\n });\n\n const caseExpr = new CaseExpr({\n ifs: [\n ],\n })\n .when(new IsExpr({\n this: value,\n expression: null_(),\n }), null_())\n .else(coalesceExpr);\n\n return this.sql(caseExpr);\n }\n}\n\nexport class Postgres extends Dialect {\n static DIALECT_NAME = Dialects.POSTGRES;\n static INDEX_OFFSET = 1;\n static TYPED_DIVISION = true;\n static CONCAT_COALESCE = true;\n\n static get NULL_ORDERING () {\n return NullOrdering.NULLS_ARE_LARGE;\n }\n\n static TIME_FORMAT = '\\'YYYY-MM-DD HH24:MI:SS\\'';\n static TABLESAMPLE_SIZE_IS_PERCENT = true;\n static TABLES_REFERENCEABLE_AS_COLUMNS = true;\n\n @cache\n static get DEFAULT_FUNCTIONS_COLUMN_NAMES () {\n return new Map([\n [\n ExplodingGenerateSeriesExpr.name,\n 'generate_series',\n ],\n ]);\n }\n\n @cache\n static get TIME_MAPPING () {\n return {\n d: '%u',\n D: '%u',\n dd: '%d',\n DD: '%d',\n ddd: '%j',\n DDD: '%j',\n FMDD: '%-d',\n FMDDD: '%-j',\n FMHH12: '%-I',\n FMHH24: '%-H',\n FMMI: '%-M',\n FMMM: '%-m',\n FMSS: '%-S',\n HH12: '%I',\n HH24: '%H',\n mi: '%M',\n MI: '%M',\n mm: '%m',\n MM: '%m',\n OF: '%z',\n ss: '%S',\n SS: '%S',\n TMDay: '%A',\n TMDy: '%a',\n TMMon: '%b',\n TMMonth: '%B',\n TZ: '%Z',\n US: '%f',\n ww: '%U',\n WW: '%U',\n yy: '%y',\n YY: '%y',\n yyyy: '%Y',\n YYYY: '%Y',\n };\n }\n\n static Tokenizer = PostgresTokenizer;\n static Parser = PostgresParser;\n static Generator = PostgresGenerator;\n}\n\nDialect.register(Dialects.POSTGRES, Postgres);\n"]}