rawsql-ts 0.11.39-beta → 0.11.41-beta

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 (126) hide show
  1. package/README.md +3 -6
  2. package/dist/esm/index.min.js +61 -59
  3. package/dist/esm/index.min.js.map +4 -4
  4. package/dist/esm/src/models/BinarySelectQuery.d.ts +11 -1
  5. package/dist/esm/src/models/BinarySelectQuery.js +11 -1
  6. package/dist/esm/src/models/BinarySelectQuery.js.map +1 -1
  7. package/dist/esm/src/models/SelectQuery.d.ts +29 -0
  8. package/dist/esm/src/models/SelectQuery.js.map +1 -1
  9. package/dist/esm/src/models/SimpleSelectQuery.d.ts +12 -1
  10. package/dist/esm/src/models/SimpleSelectQuery.js +12 -1
  11. package/dist/esm/src/models/SimpleSelectQuery.js.map +1 -1
  12. package/dist/esm/src/parsers/ParenExpressionParser.js +59 -13
  13. package/dist/esm/src/parsers/ParenExpressionParser.js.map +1 -1
  14. package/dist/esm/src/parsers/SqlPrintTokenParser.js +1 -0
  15. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  16. package/dist/esm/src/parsers/UnaryExpressionParser.js +10 -1
  17. package/dist/esm/src/parsers/UnaryExpressionParser.js.map +1 -1
  18. package/dist/esm/src/parsers/ValuesQueryParser.d.ts +2 -0
  19. package/dist/esm/src/parsers/ValuesQueryParser.js +83 -17
  20. package/dist/esm/src/parsers/ValuesQueryParser.js.map +1 -1
  21. package/dist/esm/src/parsers/WhereClauseParser.js +11 -1
  22. package/dist/esm/src/parsers/WhereClauseParser.js.map +1 -1
  23. package/dist/esm/src/transformers/AliasRenamer.d.ts +1 -0
  24. package/dist/esm/src/transformers/AliasRenamer.js +1 -0
  25. package/dist/esm/src/transformers/AliasRenamer.js.map +1 -1
  26. package/dist/esm/src/transformers/CTERenamer.d.ts +4 -2
  27. package/dist/esm/src/transformers/CTERenamer.js +4 -2
  28. package/dist/esm/src/transformers/CTERenamer.js.map +1 -1
  29. package/dist/esm/src/transformers/DynamicQueryBuilder.d.ts +19 -55
  30. package/dist/esm/src/transformers/DynamicQueryBuilder.js +7 -55
  31. package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
  32. package/dist/esm/src/transformers/FormatOptionResolver.d.ts +12 -0
  33. package/dist/esm/src/transformers/FormatOptionResolver.js +62 -0
  34. package/dist/esm/src/transformers/FormatOptionResolver.js.map +1 -0
  35. package/dist/esm/src/transformers/LinePrinter.d.ts +6 -4
  36. package/dist/esm/src/transformers/LinePrinter.js +2 -2
  37. package/dist/esm/src/transformers/LinePrinter.js.map +1 -1
  38. package/dist/esm/src/transformers/SchemaCollector.d.ts +9 -1
  39. package/dist/esm/src/transformers/SchemaCollector.js +9 -1
  40. package/dist/esm/src/transformers/SchemaCollector.js.map +1 -1
  41. package/dist/esm/src/transformers/SelectableColumnCollector.d.ts +1 -0
  42. package/dist/esm/src/transformers/SelectableColumnCollector.js +1 -0
  43. package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
  44. package/dist/esm/src/transformers/SmartRenamer.d.ts +10 -30
  45. package/dist/esm/src/transformers/SmartRenamer.js +10 -30
  46. package/dist/esm/src/transformers/SmartRenamer.js.map +1 -1
  47. package/dist/esm/src/transformers/SqlFormatter.d.ts +34 -11
  48. package/dist/esm/src/transformers/SqlFormatter.js +15 -3
  49. package/dist/esm/src/transformers/SqlFormatter.js.map +1 -1
  50. package/dist/esm/src/transformers/SqlIdentifierRenamer.d.ts +9 -2
  51. package/dist/esm/src/transformers/SqlIdentifierRenamer.js +9 -2
  52. package/dist/esm/src/transformers/SqlIdentifierRenamer.js.map +1 -1
  53. package/dist/esm/src/transformers/SqlPrinter.d.ts +2 -0
  54. package/dist/esm/src/transformers/SqlPrinter.js +51 -20
  55. package/dist/esm/src/transformers/SqlPrinter.js.map +1 -1
  56. package/dist/esm/src/transformers/TableColumnResolver.d.ts +8 -0
  57. package/dist/esm/src/utils/SchemaManager.d.ts +20 -3
  58. package/dist/esm/src/utils/SchemaManager.js +20 -3
  59. package/dist/esm/src/utils/SchemaManager.js.map +1 -1
  60. package/dist/esm/src/utils/SqlSchemaValidator.d.ts +13 -0
  61. package/dist/esm/src/utils/SqlSchemaValidator.js +13 -0
  62. package/dist/esm/src/utils/SqlSchemaValidator.js.map +1 -1
  63. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  64. package/dist/index.min.js +61 -59
  65. package/dist/index.min.js.map +4 -4
  66. package/dist/src/models/BinarySelectQuery.d.ts +11 -1
  67. package/dist/src/models/BinarySelectQuery.js +11 -1
  68. package/dist/src/models/BinarySelectQuery.js.map +1 -1
  69. package/dist/src/models/SelectQuery.d.ts +29 -0
  70. package/dist/src/models/SelectQuery.js.map +1 -1
  71. package/dist/src/models/SimpleSelectQuery.d.ts +12 -1
  72. package/dist/src/models/SimpleSelectQuery.js +12 -1
  73. package/dist/src/models/SimpleSelectQuery.js.map +1 -1
  74. package/dist/src/parsers/ParenExpressionParser.js +59 -13
  75. package/dist/src/parsers/ParenExpressionParser.js.map +1 -1
  76. package/dist/src/parsers/SqlPrintTokenParser.js +1 -0
  77. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  78. package/dist/src/parsers/UnaryExpressionParser.js +10 -1
  79. package/dist/src/parsers/UnaryExpressionParser.js.map +1 -1
  80. package/dist/src/parsers/ValuesQueryParser.d.ts +2 -0
  81. package/dist/src/parsers/ValuesQueryParser.js +83 -17
  82. package/dist/src/parsers/ValuesQueryParser.js.map +1 -1
  83. package/dist/src/parsers/WhereClauseParser.js +11 -1
  84. package/dist/src/parsers/WhereClauseParser.js.map +1 -1
  85. package/dist/src/transformers/AliasRenamer.d.ts +1 -0
  86. package/dist/src/transformers/AliasRenamer.js +1 -0
  87. package/dist/src/transformers/AliasRenamer.js.map +1 -1
  88. package/dist/src/transformers/CTERenamer.d.ts +4 -2
  89. package/dist/src/transformers/CTERenamer.js +4 -2
  90. package/dist/src/transformers/CTERenamer.js.map +1 -1
  91. package/dist/src/transformers/DynamicQueryBuilder.d.ts +19 -55
  92. package/dist/src/transformers/DynamicQueryBuilder.js +7 -55
  93. package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
  94. package/dist/src/transformers/FormatOptionResolver.d.ts +12 -0
  95. package/dist/src/transformers/FormatOptionResolver.js +67 -0
  96. package/dist/src/transformers/FormatOptionResolver.js.map +1 -0
  97. package/dist/src/transformers/LinePrinter.d.ts +6 -4
  98. package/dist/src/transformers/LinePrinter.js +2 -2
  99. package/dist/src/transformers/LinePrinter.js.map +1 -1
  100. package/dist/src/transformers/SchemaCollector.d.ts +9 -1
  101. package/dist/src/transformers/SchemaCollector.js +9 -1
  102. package/dist/src/transformers/SchemaCollector.js.map +1 -1
  103. package/dist/src/transformers/SelectableColumnCollector.d.ts +1 -0
  104. package/dist/src/transformers/SelectableColumnCollector.js +1 -0
  105. package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
  106. package/dist/src/transformers/SmartRenamer.d.ts +10 -30
  107. package/dist/src/transformers/SmartRenamer.js +10 -30
  108. package/dist/src/transformers/SmartRenamer.js.map +1 -1
  109. package/dist/src/transformers/SqlFormatter.d.ts +34 -11
  110. package/dist/src/transformers/SqlFormatter.js +15 -3
  111. package/dist/src/transformers/SqlFormatter.js.map +1 -1
  112. package/dist/src/transformers/SqlIdentifierRenamer.d.ts +9 -2
  113. package/dist/src/transformers/SqlIdentifierRenamer.js +9 -2
  114. package/dist/src/transformers/SqlIdentifierRenamer.js.map +1 -1
  115. package/dist/src/transformers/SqlPrinter.d.ts +2 -0
  116. package/dist/src/transformers/SqlPrinter.js +51 -20
  117. package/dist/src/transformers/SqlPrinter.js.map +1 -1
  118. package/dist/src/transformers/TableColumnResolver.d.ts +8 -0
  119. package/dist/src/utils/SchemaManager.d.ts +20 -3
  120. package/dist/src/utils/SchemaManager.js +20 -3
  121. package/dist/src/utils/SchemaManager.js.map +1 -1
  122. package/dist/src/utils/SqlSchemaValidator.d.ts +13 -0
  123. package/dist/src/utils/SqlSchemaValidator.js +13 -0
  124. package/dist/src/utils/SqlSchemaValidator.js.map +1 -1
  125. package/dist/tsconfig.tsbuildinfo +1 -1
  126. package/package.json +3 -2
@@ -1,42 +1,44 @@
1
- var v=class{constructor(){this.comments=null;this.positionedComments=null}getKind(){return this.constructor.kind}accept(e){return e.visit(this)}toSqlString(e){return this.accept(e)}addPositionedComments(e,t){if(!t||t.length===0)return;this.positionedComments||(this.positionedComments=[]);let n=this.positionedComments.find(i=>i.position===e);n?n.comments.push(...t):this.positionedComments.push({position:e,comments:[...t]})}getPositionedComments(e){if(!this.positionedComments)return[];let t=this.positionedComments.find(n=>n.position===e);return t?t.comments:[]}getAllPositionedComments(){if(!this.positionedComments)return[];let e=[],t=this.getPositionedComments("before");e.push(...t);let n=this.getPositionedComments("after");return e.push(...n),e}},Ti=class{constructor(){this.parameterSymbol=":";this.identifierEscape={start:'"',end:'"'};this.exportComment=!0}};var ot=class extends v{static{this.kind=Symbol("InsertQuery")}constructor(e){super(),this.insertClause=e.insertClause,this.selectQuery=e.selectQuery??null}};var ge=class extends v{static{this.kind=Symbol("InlineQuery")}constructor(e){super(),this.selectQuery=e}},D=class extends v{static{this.kind=Symbol("ValueList")}constructor(e){super(),this.values=e}},b=class extends v{get namespaces(){return this.qualifiedName.namespaces}get column(){return this.qualifiedName.name instanceof I?this.qualifiedName.name:new I(this.qualifiedName.name.value)}static{this.kind=Symbol("ColumnReference")}constructor(e,t){super();let n=typeof t=="string"?new I(t):t;this.qualifiedName=new De(Pi(e),n)}toString(){return this.qualifiedName.toString()}getNamespace(){return this.qualifiedName.namespaces?this.qualifiedName.namespaces.map(e=>e.name).join("."):""}},U=class extends v{static{this.kind=Symbol("FunctionCall")}constructor(e,t,n,i,s=null,r=!1,o=null){super(),this.qualifiedName=new De(e,t),this.argument=n,this.over=i,this.withinGroup=s,this.withOrdinality=r,this.internalOrderBy=o}get namespaces(){return this.qualifiedName.namespaces}get name(){return this.qualifiedName.name}},ki=(n=>(n.Rows="rows",n.Range="range",n.Groups="groups",n))(ki||{}),Ii=(n=>(n.UnboundedPreceding="unbounded preceding",n.UnboundedFollowing="unbounded following",n.CurrentRow="current row",n))(Ii||{}),Et=class extends v{static{this.kind=Symbol("WindowFrameStaticBound")}constructor(e){super(),this.bound=e}},xt=class extends v{static{this.kind=Symbol("WindowFrameBoundary")}constructor(e,t){super(),this.value=e,this.isFollowing=t}},He=class extends v{static{this.kind=Symbol("WindowFrameSpec")}constructor(e,t,n){super(),this.frameType=e,this.startBound=t,this.endBound=n}},Ve=class extends v{static{this.kind=Symbol("WindowFrameExpression")}constructor(e,t,n=null){super(),this.partition=e,this.order=t,this.frameSpec=n}},ne=class extends v{static{this.kind=Symbol("UnaryExpression")}constructor(e,t){super(),this.operator=new V(e),this.expression=t}},S=class extends v{static{this.kind=Symbol("BinaryExpression")}constructor(e,t,n){super(),this.left=e,this.operator=new V(t),this.right=n}},Y=class extends v{static{this.kind=Symbol("LiteralExpression")}constructor(e,t,n){super(),this.value=e,this.isStringLiteral=n}},L=class extends v{static{this.kind=Symbol("ParameterExpression")}constructor(e,t=null){super(),this.name=new V(e),this.value=t,this.index=null}},Ee=class extends v{static{this.kind=Symbol("SwitchCaseArgument")}constructor(e,t=null){super(),this.cases=e,this.elseValue=t}},xe=class extends v{static{this.kind=Symbol("CaseKeyValuePair")}constructor(e,t){super(),this.key=e,this.value=t}},V=class extends v{static{this.kind=Symbol("RawString")}constructor(e){super(),this.value=e}},I=class extends v{static{this.kind=Symbol("IdentifierString")}constructor(e){super(),this.name=e}},Z=class extends v{static{this.kind=Symbol("ParenExpression")}constructor(e){super(),this.expression=e}},ce=class extends v{static{this.kind=Symbol("CastExpression")}constructor(e,t){super(),this.input=e,this.castType=t}},se=class extends v{static{this.kind=Symbol("CaseExpression")}constructor(e,t){super(),this.condition=e,this.switchCase=t}},ye=class extends v{static{this.kind=Symbol("ArrayExpression")}constructor(e){super(),this.expression=e}},ve=class extends v{static{this.kind=Symbol("ArrayQueryExpression")}constructor(e){super(),this.query=e}},we=class extends v{static{this.kind=Symbol("BetweenExpression")}constructor(e,t,n,i){super(),this.expression=e,this.lower=t,this.upper=n,this.negated=i}},je=class extends v{static{this.kind=Symbol("StringSpecifierExpression")}constructor(e,t){super(),this.specifier=new V(e),this.value=new Y(t)}},Re=class extends v{static{this.kind=Symbol("TypeValue")}constructor(e,t,n=null){super(),this.qualifiedName=new De(e,t),this.argument=n}get namespaces(){return this.qualifiedName.namespaces}get name(){return this.qualifiedName.name}getTypeName(){let e=this.qualifiedName.name instanceof V?this.qualifiedName.name.value:this.qualifiedName.name.name;return this.qualifiedName.namespaces&&this.qualifiedName.namespaces.length>0?this.qualifiedName.namespaces.map(t=>t.name).join(".")+"."+e:e}},Ie=class extends v{static{this.kind=Symbol("TupleExpression")}constructor(e){super(),this.values=e}},et=class extends v{static{this.kind=Symbol("ArraySliceExpression")}constructor(e,t,n){super(),this.array=e,this.startIndex=t,this.endIndex=n}},tt=class extends v{static{this.kind=Symbol("ArrayIndexExpression")}constructor(e,t){super(),this.array=e,this.index=t}};function Pi(a){if(a==null)return null;if(typeof a=="string")return a.trim()===""?null:[new I(a)];if(Array.isArray(a)){if(a.length===0)return null;if(typeof a[0]=="string"){let e=a.filter(t=>t.trim()!=="");return e.length===0?null:e.map(t=>new I(t))}else{let e=a.filter(t=>t.name.trim()!=="");return e.length===0?null:e}}return null}var De=class extends v{static{this.kind=Symbol("QualifiedName")}constructor(e,t){super(),this.namespaces=Pi(e),typeof t=="string"?this.name=new V(t):this.name=t}toString(){let e=this.name instanceof V?this.name.value:this.name.name;return this.namespaces&&this.namespaces.length>0?this.namespaces.map(t=>t.name).join(".")+"."+e:e}};var _=class extends v{static{this.kind=Symbol("SelectItem")}constructor(e,t=null){super(),this.value=e,this.identifier=t?new I(t):null}},q=class extends v{static{this.kind=Symbol("SelectClause")}constructor(e,t=null,n=[]){super(),this.items=e,this.distinct=t,this.hints=n}},Tt=class extends v{static{this.kind=Symbol("Distinct")}constructor(){super()}},kt=class extends v{static{this.kind=Symbol("DistinctOn")}constructor(e){super(),this.value=e}},re=class extends v{static{this.kind=Symbol("WhereClause")}constructor(e){super(),this.condition=e}},Ue=class extends v{static{this.kind=Symbol("PartitionByClause")}constructor(e){super(),this.value=e}},Pe=class extends v{static{this.kind=Symbol("WindowFrameClause")}constructor(e,t){super(),this.name=new I(e),this.expression=t}},nt=class extends v{static{this.kind=Symbol("WindowsClause")}constructor(e){super(),this.windows=e}};var pe=class extends v{static{this.kind=Symbol("OrderByClause")}constructor(e){super(),this.order=e}},Le=class extends v{static{this.kind=Symbol("OrderByItem")}constructor(e,t,n){super(),this.value=e,this.sortDirection=t===null?"asc":t,this.nullsPosition=n}},me=class extends v{static{this.kind=Symbol("GroupByClause")}constructor(e){super(),this.grouping=e}},de=class extends v{static{this.kind=Symbol("HavingClause")}constructor(e){super(),this.condition=e}},O=class extends v{static{this.kind=Symbol("TableSource")}get namespaces(){return this.qualifiedName.namespaces}get table(){return this.qualifiedName.name instanceof I?this.qualifiedName.name:new I(this.qualifiedName.name.value)}get identifier(){return this.table}constructor(e,t){super();let n=typeof t=="string"?new I(t):t;this.qualifiedName=new De(e,n)}getSourceName(){return this.qualifiedName.namespaces&&this.qualifiedName.namespaces.length>0?this.qualifiedName.namespaces.map(e=>e.name).join(".")+"."+(this.qualifiedName.name instanceof V?this.qualifiedName.name.value:this.qualifiedName.name.name):this.qualifiedName.name instanceof V?this.qualifiedName.name.value:this.qualifiedName.name.name}},ze=class extends v{static{this.kind=Symbol("FunctionSource")}constructor(e,t){if(super(),typeof e=="object"&&e!==null&&"name"in e){let n=e;this.qualifiedName=new De(n.namespaces,n.name)}else this.qualifiedName=new De(null,e);this.argument=t}get namespaces(){return this.qualifiedName.namespaces}get name(){return this.qualifiedName.name}},$e=class extends v{static{this.kind=Symbol("ParenSource")}constructor(e){super(),this.source=e}},M=class extends v{static{this.kind=Symbol("SubQuerySource")}constructor(e){super(),this.query=e}},B=class extends v{static{this.kind=Symbol("SourceExpression")}constructor(e,t){super(),this.datasource=e,this.aliasExpression=t}getAliasName(){return this.aliasExpression?this.aliasExpression.table.name:this.datasource instanceof O?this.datasource.getSourceName():null}},he=class extends v{static{this.kind=Symbol("JoinOnClause")}constructor(e){super(),this.condition=e}},Se=class extends v{static{this.kind=Symbol("JoinUsingClause")}constructor(e){super(),this.condition=e}},fe=class extends v{static{this.kind=Symbol("JoinItem")}constructor(e,t,n,i){super(),this.joinType=new V(e),this.source=t,this.condition=n,this.lateral=i}getSourceAliasName(){return this.source.aliasExpression?this.source.aliasExpression.table.name:this.source instanceof O?this.source.table.name:null}},K=class extends v{static{this.kind=Symbol("FromClause")}constructor(e,t){super(),this.source=e,this.joins=t}getSourceAliasName(){return this.source.aliasExpression?this.source.aliasExpression.table.name:this.source.datasource instanceof O?this.source.datasource.table.name:null}getSources(){let e=[this.source];if(this.joins)for(let t of this.joins)e.push(t.source);return e}},ie=class extends v{static{this.kind=Symbol("CommonTable")}constructor(e,t,n){super(),this.query=e,this.materialized=n,typeof t=="string"?this.aliasExpression=new ee(t,null):this.aliasExpression=t}getSourceAliasName(){return this.aliasExpression.table.name}},ae=class extends v{constructor(t,n){super();this.trailingComments=null;this.globalComments=null;this.recursive=t,this.tables=n}static{this.kind=Symbol("WithClause")}},oe=class extends v{static{this.kind=Symbol("LimitClause")}constructor(e){super(),this.value=e}};var Fe=class extends v{static{this.kind=Symbol("OffsetClause")}constructor(e){super(),this.value=e}},Ke=class extends v{static{this.kind=Symbol("FetchClause")}constructor(e){super(),this.expression=e}},gt=class extends v{static{this.kind=Symbol("FetchExpression")}constructor(e,t,n){super(),this.type=e,this.count=t,this.unit=n}};var Ae=class extends v{static{this.kind=Symbol("ForClause")}constructor(e){super(),this.lockMode=e}},ee=class extends v{static{this.kind=Symbol("SourceAliasExpression")}constructor(e,t){super(),this.table=new I(e),this.columns=t!==null?t.map(n=>new I(n)):null}},ln=class extends v{static{this.kind=Symbol("ReturningClause")}constructor(e){super(),this.columns=e.map(t=>typeof t=="string"?new I(t):t)}},at=class extends v{static{this.kind=Symbol("SetClause")}constructor(e){super(),this.items=e.map(t=>t instanceof ut?t:new ut(t.column,t.value))}},ut=class extends v{static{this.kind=Symbol("SetClauseItem")}constructor(e,t){if(super(),typeof e=="object"&&e!==null&&"column"in e){let n=e,i=typeof n.column=="string"?new I(n.column):n.column;this.qualifiedName=new De(n.namespaces,i)}else{let n=typeof e=="string"?new I(e):e;this.qualifiedName=new De(null,n)}this.value=t}get namespaces(){return this.qualifiedName.namespaces}get column(){return this.qualifiedName.name instanceof I?this.qualifiedName.name:new I(this.qualifiedName.name.value)}getFullName(){return this.qualifiedName.toString()}},It=class extends v{static{this.kind=Symbol("UpdateClause")}constructor(e){super(),this.source=e}getSourceAliasName(){return this.source.aliasExpression?this.source.aliasExpression.table.name:this.source.datasource instanceof O?this.source.datasource.table.name:null}},ct=class extends v{constructor(e,t){super(),this.source=e,this.columns=t.map(n=>new I(n))}};var $=(f=>(f[f.None=0]="None",f[f.Literal=1]="Literal",f[f.Operator=2]="Operator",f[f.OpenParen=4]="OpenParen",f[f.CloseParen=8]="CloseParen",f[f.Comma=16]="Comma",f[f.Dot=32]="Dot",f[f.Identifier=64]="Identifier",f[f.Command=128]="Command",f[f.Parameter=256]="Parameter",f[f.OpenBracket=512]="OpenBracket",f[f.CloseBracket=1024]="CloseBracket",f[f.Function=2048]="Function",f[f.StringSpecifier=4096]="StringSpecifier",f[f.Type=8192]="Type",f))($||{});var te=class{static isWhitespace(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t===32||t===9||t===10||t===13}static isDigit(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t>=48&&t<=57}static isHexChar(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t>=48&&t<=57||t>=97&&t<=102||t>=65&&t<=70}static isOperatorSymbol(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t===43||t===45||t===42||t===47||t===37||t===126||t===64||t===35||t===94||t===38||t===58||t===33||t===60||t===62||t===61||t===124||t===63}static isDelimiter(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t===46||t===44||t===40||t===41||t===91||t===93||t===123||t===125||t===59||t===32||t===9||t===10||t===13?!0:t===43||t===45||t===42||t===47||t===37||t===126||t===64||t===35||t===94||t===38||t===58||t===33||t===60||t===62||t===61||t===124||t===63}static isNamedParameterPrefix(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t===64||t===58||t===36}};var le=class a{static getDebugPositionInfo(e,t){let n=Math.max(0,t-5),i=Math.min(e.length,t+5),s=e.slice(n,i),r=" ".repeat(t-n)+"^";return`${s}
2
- ${r}`}static skipWhiteSpace(e,t){let n=e.length;for(;t+4<=n&&e.slice(t,t+4)===" ";)t+=4;for(;t<n;){let i=e.charCodeAt(t);if(i!==32&&i!==9&&i!==10&&i!==13)break;t++}return t}static readLineComment(e,t){if(t+1>=e.length)return{newPosition:t,comment:null};if(e.charCodeAt(t)===45&&e.charCodeAt(t+1)===45){let n=t;for(t+=2;t<e.length&&e.charCodeAt(t)!==10;)t++;let i=e.slice(n+2,t).trim();return{newPosition:t,comment:i}}return{newPosition:t,comment:null}}static readBlockComment(e,t){if(t+1>=e.length)return{newPosition:t,comments:null};if(e.charCodeAt(t)!==47||e.charCodeAt(t+1)!==42)return{newPosition:t,comments:null};if(t+2<e.length&&e.charCodeAt(t+2)===43)return{newPosition:t,comments:null};let i=t;for(t+=2;t+1<e.length;){if(e.charCodeAt(t)===42&&e.charCodeAt(t+1)===47){t+=2;let r=this.processBlockCommentContent(e.slice(i+2,t-2));return{newPosition:t,comments:r}}t++}let s=this.processBlockCommentContent(e.slice(i+2));return{newPosition:e.length,comments:s}}static processBlockCommentContent(e){let t=e.replace(/\r/g,"").split(`
3
- `),n=[];for(let i of t){let s=i.trim(),r=/^\s*[-=_+*#]+\s*$/.test(i);s!==""||r?n.push(r?i.trim():s):n.push("")}for(;n.length>0&&n[0]==="";)n.shift();for(;n.length>0&&n[n.length-1]==="";)n.pop();return n}static readWhiteSpaceAndComment(e,t){let n=[],i=e.length;for(;t<i;){let s=t;if(t=a.skipWhiteSpace(e,t),t!==s)continue;let r=e.charCodeAt(t);if(r===45){let o=a.readLineComment(e,t);if(o.newPosition!==t){t=o.newPosition,o.comment&&n.push(o.comment.trim());continue}}else if(r===47){let o=a.readBlockComment(e,t);if(o.newPosition!==t){t=o.newPosition,o.comments&&n.push(...o.comments);continue}}break}return{position:t,lines:n}}static readRegularIdentifier(e,t){let n=this.tryReadRegularIdentifier(e,t);if(!n)throw new Error(`Unexpected character. position: ${t}
4
- ${a.getDebugPositionInfo(e,t)}`);return n}static tryReadRegularIdentifier(e,t){let n=t;for(;t<e.length&&!te.isDelimiter(e[t]);)t++;if(n===t)return null;for(;t+1<e.length&&e[t]==="["&&e[t+1]==="]";){let i=e.slice(0,n).trim();if(i===""||/[)]$/.test(i)||/\b(select|from|where|and|or|set|values|insert|update|delete)\s*$/i.test(i))break;t+=2}return{identifier:e.slice(n,t),newPosition:t}}};var ue=class{constructor(e,t=0){this.input=e,this.position=t}getPosition(){return this.position}setPosition(e){this.position=e}isEndOfInput(e=0){return this.position+e>=this.input.length}canRead(e=0){return!this.isEndOfInput(e)}read(e){if(this.isEndOfInput())throw new Error(`Unexpected character. expect: ${e}, actual: EndOfInput, position: ${this.position}`);let t=this.input[this.position];if(t!==e)throw new Error(`Unexpected character. expect: ${e}, actual: ${t}, position: ${this.position}`);return this.position++,t}createLexeme(e,t,n=null,i,s){let r={type:e,value:e===128||e===2||e===2048?t.toLowerCase():t,comments:n};return i!==void 0&&s!==void 0&&(r.position={startPosition:i,endPosition:s}),r}createLexemeWithPosition(e,t,n,i=null){return this.createLexeme(e,t,i,n,n+t.length)}getDebugPositionInfo(e){return le.getDebugPositionInfo(this.input,e)}};var un=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=this.input[this.position];if(t==="*")return this.position++,this.createLexeme(64,t);let n=le.readRegularIdentifier(this.input,this.position);return this.position=n.newPosition,this.createLexeme(64,n.identifier)}};var Te=class{constructor(e){this.trie=e}isEndOfInput(e,t,n=0){return t+n>=e.length}canParse(e,t,n=0){return!this.isEndOfInput(e,t,n)}parse(e,t){if(this.isEndOfInput(e,t))return null;this.trie.reset();let n=le.tryReadRegularIdentifier(e,t);if(n===null)return null;let i=this.trie.pushLexeme(n.identifier.toLowerCase());if(i===0)return null;if(i===3)return{keyword:n.identifier,newPosition:n.newPosition};let s=n.identifier,r=le.readWhiteSpaceAndComment(e,n.newPosition);t=r.position;let o=[...r.lines];if(this.isEndOfInput(e,t))return i===2?{keyword:s,newPosition:t,comments:o.length>0?o:void 0}:null;for(;this.canParse(e,t);){let l=i,u=le.tryReadRegularIdentifier(e,t);if(u!==null){if(i=this.trie.pushLexeme(u.identifier.toLowerCase()),i===0){if(l===2)break;return null}s+=" "+u.identifier;let c=le.readWhiteSpaceAndComment(e,u.newPosition);if(t=c.position,o.push(...c.lines),i===3)break}else{if(l===2)break;return null}}return{keyword:s,newPosition:t,comments:o.length>0?o:void 0}}};var Je=class{constructor(e){this.root=new Map;this.hasEndProperty=!1;this.hasMoreProperties=!1;for(let t of e)this.addKeyword(t);this.currentNode=this.root}addKeyword(e){let t=this.root;for(let n of e)t.has(n)||t.set(n,new Map),t=t.get(n);t.set("__end__",!0)}reset(){this.currentNode=this.root,this.hasEndProperty=!1,this.hasMoreProperties=!1}pushLexeme(e){return this.currentNode.has(e)?(this.currentNode=this.currentNode.get(e),this.hasEndProperty=this.currentNode.has("__end__"),this.hasMoreProperties=this.currentNode.size>(this.hasEndProperty?1:0),this.hasEndProperty&&!this.hasMoreProperties?3:this.hasEndProperty&&this.hasMoreProperties?2:1):0}};var zi=[["null"],["true"],["false"],["current_date"],["current_time"],["current_timestamp"],["localtime"],["localtimestamp"],["unbounded"],["normalized"],["nfc","normalized"],["nfd","normalized"],["nfkc","normalized"],["nfkd","normalized"],["nfc"],["nfd"],["nfkc"],["nfkd"]],Hi=new Je(zi),fi=new Te(Hi),cn=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=this.input[this.position];if(t==="'"){let i=this.readSingleQuotedString();return this.createLexeme(1,i)}let n=this.tryReadKeyword();if(n)return n;if(t==="."&&this.canRead(1)&&te.isDigit(this.input[this.position+1]))return this.createLexeme(1,this.readDigit());if(te.isDigit(t))return this.createLexeme(1,this.readDigit());if(t==="$"&&this.isDollarQuotedString())return this.createLexeme(1,this.readDollarQuotedString());if(t==="$"&&this.canRead(1)&&te.isDigit(this.input[this.position+1])){let i=this.position+1,s=!1;for(;i<this.input.length&&(te.isDigit(this.input[i])||this.input[i]===","||this.input[i]===".");){if(this.input[i]==="."||this.input[i]===","){s=!0;break}i++}if(s){this.position++;let r=this.readMoneyDigit();return this.createLexeme(1,"$"+r)}}if((t==="+"||t==="-")&&this.determineSignOrOperator(e)==="sign"){let i=t;this.position++;let s=this.position;for(;this.canRead()&&te.isWhitespace(this.input[this.position]);)this.position++;if(this.canRead()&&(te.isDigit(this.input[this.position])||this.input[this.position]==="."&&this.canRead(1)&&te.isDigit(this.input[this.position+1])))return this.createLexeme(1,i==="-"?i+this.readDigit():this.readDigit());this.position=s-1}return null}tryReadKeyword(){let e=fi.parse(this.input,this.position);return e?(this.position=e.newPosition,this.createLexeme(1,e.keyword)):null}determineSignOrOperator(e){return e===null?"sign":e.type&1||e.type&64||e.type&256||e.type&8?"operator":"sign"}readDigit(){let e=this.position,t=!1,n=!1;if(this.canRead(1)&&this.input[this.position]==="0"&&"xbo".includes(this.input[this.position+1].toLowerCase())){let i=this.input[this.position+1].toLowerCase();this.position+=2;let s=i==="x";for(;this.canRead();){let r=this.input[this.position];if(te.isDigit(r)||s&&te.isHexChar(r))this.position++;else break}return this.input.slice(e,this.position)}for(this.input[e]==="."&&(t=!0,this.position++);this.canRead();){let i=this.input[this.position];if(i==="."&&!t)t=!0;else if((i==="e"||i==="E")&&!n)n=!0,this.canRead(1)&&(this.input[this.position+1]==="+"||this.input[this.position+1]==="-")&&this.position++;else if(!te.isDigit(i))break;this.position++}if(e===this.position)throw new Error(`Unexpected character. position: ${e}
5
- ${this.getDebugPositionInfo(e)}`);return this.input[e]==="."?"0"+this.input.slice(e,this.position):this.input.slice(e,this.position)}readMoneyDigit(){let e=this.position,t=!1;for(;this.canRead();){let n=this.input[this.position];if(n==="."&&!t)t=!0;else if(!(n===","&&!t)){if(!te.isDigit(n))break}this.position++}if(e===this.position)throw new Error(`Unexpected character. position: ${e}
6
- ${this.getDebugPositionInfo(e)}`);return this.input.slice(e,this.position)}readSingleQuotedString(){let e=this.position,t=!1;for(this.read("'");this.canRead();){let n=this.input[this.position];if(this.position++,n==="\\"&&this.canRead(1)){this.position++;continue}else if(n==="'"){t=!0;break}}if(t===!1)throw new Error(`Single quote is not closed. position: ${e}
7
- ${this.getDebugPositionInfo(e)}`);return this.input.slice(e,this.position)}isDollarQuotedString(){if(!this.canRead(1))return!1;if(this.input[this.position+1]==="$")return!0;let e=this.position+1;for(;e<this.input.length;){let t=this.input[e];if(t==="$")return!0;if(!this.isAlphanumeric(t)&&t!=="_")return!1;e++}return!1}readDollarQuotedString(){let e=this.position;this.position++;let t="";for(;this.canRead()&&this.input[this.position]!=="$";)t+=this.input[this.position],this.position++;if(!this.canRead())throw new Error(`Unexpected end of input while reading dollar-quoted string tag at position ${e}`);this.position++;let n="$"+t+"$",i=n,s="";for(;this.canRead();){if(this.input.substring(this.position,this.position+i.length)===i)return this.position+=i.length,n+s+i;s+=this.input[this.position],this.position++}throw new Error(`Unclosed dollar-quoted string starting at position ${e}. Expected closing tag: ${i}`)}isAlphanumeric(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122}};var pn=class extends ue{constructor(e){super(e)}tryRead(e){if(this.isEndOfInput())return null;if(this.canRead(1)&&this.input[this.position]==="$"&&this.input[this.position+1]==="{"){this.position+=2;let n=this.position;for(;this.canRead()&&this.input[this.position]!=="}";)this.position++;if(this.isEndOfInput())throw new Error(`Unexpected end of input. Expected closing '}' for parameter at position ${n}`);let i=this.input.slice(n,this.position);if(i.length===0)throw new Error("Empty parameter name is not allowed: found ${} at position "+(n-2));return this.position++,this.createLexeme(256,"${"+i+"}")}let t=this.input[this.position];if(te.isNamedParameterPrefix(t)){if(this.canRead(1)&&te.isOperatorSymbol(this.input[this.position+1])||t===":"&&this.isInArraySliceContext()||t==="$"&&this.isDollarQuotedString())return null;if(t==="$"&&this.canRead(1)&&te.isDigit(this.input[this.position+1])){let s=this.position+1,r=!1;for(;s<this.input.length&&(te.isDigit(this.input[s])||this.input[s]===","||this.input[s]===".");){if(this.input[s]==="."||this.input[s]===","){r=!0;break}s++}if(r)return null}this.position++;let n=this.position;for(;this.canRead()&&!te.isDelimiter(this.input[this.position]);)this.position++;let i=this.input.slice(n,this.position);return this.createLexeme(256,t+i)}if(t==="?"){if(this.canRead(1)){let n=this.input[this.position+1];if(n==="|"||n==="&")return null}return e&&(e.type&64||e.type&1)?null:(this.position++,this.createLexeme(256,t))}return null}isInArraySliceContext(){let e=this.position-1,t=0,n=0;for(;e>=0;){let i=this.input[e];if(i==="]")t++;else if(i==="["){if(t--,t<0){if(e>0){let s=this.input[e-1];if(/[a-zA-Z0-9_)\]]/.test(s))return!0}if(e===0)return!1;break}}else i===")"?n++:i==="("&&n--;e--}return!1}isDollarQuotedString(){if(!this.canRead(1))return!1;if(this.input[this.position+1]==="$")return!0;let e=this.position+1;for(;e<this.input.length;){let t=this.input[e];if(t==="$")return!0;if(!this.isAlphanumeric(t)&&t!=="_")return!1;e++}return!1}isAlphanumeric(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122}};var mn=class a extends ue{static{this.SPECIAL_SYMBOL_TOKENS={".":32,",":16,"(":4,")":8,"[":512,"]":1024}}tryRead(e){if(this.isEndOfInput())return null;let t=this.input[this.position];return t in a.SPECIAL_SYMBOL_TOKENS?(this.position++,this.createLexeme(a.SPECIAL_SYMBOL_TOKENS[t],t)):null}};var dn=class{constructor(e,t=0){this.cacheHits=0;this.cacheMisses=0;this.input=e,this.position=t,this.readers=[],this.tokenCache=new Map}register(e){return this.readers.push(e),this}registerAll(e){return e.forEach(t=>this.register(t)),this}setPosition(e){this.position=e;for(let t of this.readers)t.setPosition(e)}tryRead(e,t){if(this.tokenCache.has(e))return this.cacheHits++,this.tokenCache.get(e)||null;this.cacheMisses++,this.setPosition(e);let n=null;for(let i of this.readers)if(n=i.tryRead(t),n){this.position=i.getPosition();break}for(let i of this.readers)i.setPosition(this.position);return this.tokenCache.set(e,n),n}getMaxPosition(){let e=this.position;for(let t of this.readers){let n=t.getPosition();n>e&&(e=n)}return e}getInput(){return this.input}getCacheStats(){let e=this.cacheHits+this.cacheMisses,t=e>0?this.cacheHits/e:0;return{hits:this.cacheHits,misses:this.cacheMisses,ratio:t}}};var Gi=new Je([["and"],["or"],["is"],["is","not"],["is","distinct","from"],["is","not","distinct","from"],["like"],["ilike"],["in"],["exists"],["between"],["not","like"],["not","ilike"],["not","in"],["not","exists"],["not","between"],["escape"],["uescape"],["similar","to"],["not","similar","to"],["similar"],["placing"],["rlike"],["regexp"],["mod"],["xor"],["not"],["both"],["leading"],["trailing"],["both","from"],["leading","from"],["trailing","from"],["year","from"],["month","from"],["day","from"],["hour","from"],["minute","from"],["second","from"],["dow","from"],["doy","from"],["isodow","from"],["quarter","from"],["week","from"],["epoch","from"],["at","time","zone"]]),Yi=new Je([["date"],["time"],["timestamp"],["timestamptz"],["timetz"],["interval"],["boolean"],["integer"],["bigint"],["smallint"],["numeric"],["decimal"],["real"],["double","precision"],["double","precision"],["character","varying"],["time","without","time","zone"],["time","with","time","zone"],["timestamp","without","time","zone"],["timestamp","with","time","zone"]]),Zi=new Te(Gi),Xi=new Te(Yi);var hn=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=this.input[this.position];if(te.isOperatorSymbol(t)){let i=this.position;for(;this.canRead()&&te.isOperatorSymbol(this.input[this.position])&&(this.position++,!!this.canRead());){let r=this.input[this.position-1],o=this.input[this.position];if(r==="-"&&o==="-"||r==="/"&&o==="*")break}this.position===i&&this.position++;let s=this.input.slice(i,this.position);return this.createLexeme(2,s)}let n=Xi.parse(this.input,this.position);return n!==null?(this.position=n.newPosition,this.createLexeme(8258,n.keyword)):(n=Zi.parse(this.input,this.position),n!==null?(this.position=n.newPosition,this.createLexeme(2,n.keyword)):null)}};var es=new Je([["join"],["inner","join"],["cross","join"],["left","join"],["left","outer","join"],["right","join"],["right","outer","join"],["full","join"],["full","outer","join"],["natural","join"],["natural","inner","join"],["natural","left","join"],["natural","left","outer","join"],["natural","right","join"],["natural","right","outer","join"],["natural","full","join"],["natural","full","outer","join"],["lateral","join"],["lateral","inner","join"],["lateral","left","join"],["lateral","left","outer","join"]]),Kt=new Je([["with"],["recursive"],["materialized"],["not","materialized"],["select"],["from"],["distinct"],["distinct","on"],["where"],["group","by"],["having"],["order","by"],["limit"],["offset"],["fetch"],["first"],["next"],["row"],["row","only"],["rows","only"],["percent"],["percent","with","ties"],["for"],["update"],["share"],["key","share"],["no","key","update"],["union"],["union","all"],["intersect"],["intersect","all"],["except"],["except","all"],["beteen"],["window"],["over"],["partition","by"],["range"],["rows"],["groups"],["within","group"],["with","ordinality"],["current","row"],["unbounded","preceding"],["unbounded","following"],["preceding"],["following"],["on"],["using"],["lateral"],["case"],["case","when"],["when"],["then"],["else"],["end"],["insert","into"],["update"],["delete","from"],["merge","into"],["matched"],["not","matched"],["update","set"],["do","nothing"],["values"],["set"],["returning"],["create","table"],["create","temporary","table"],["tablesample"],["as"],["asc"],["desc"],["nulls","first"],["nulls","last"]]),ts=new Te(Kt),Jt=new Te(es);var fn=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=Jt.parse(this.input,this.position);if(t!==null)return this.position=t.newPosition,this.createLexeme(128,t.keyword);let n=ts.parse(this.input,this.position);if(n!==null){this.position=n.newPosition;let i=this.createLexeme(128,n.keyword,n.comments);return n.comments&&n.comments.length>0&&(i.positionedComments=[{position:"after",comments:n.comments}]),i}if(this.canRead(2)&&this.input[this.position]==="/"&&this.input[this.position+1]==="*"&&this.input[this.position+2]==="+"){this.position+=3;let i=this.position;for(;this.position+1<this.input.length;){if(this.input[this.position]==="*"&&this.input[this.position+1]==="/")return this.position+=2,this.createLexeme(128,"/*+ "+this.input.slice(i,this.position-2).trim()+" */");this.position++}throw new Error(`Block comment is not closed. position: ${this.position}`)}return null}};var ns=new Set(["e'","E'","x'","X'","b'","B'"]),is=new Set(["u&'","U&'"]),Cn=class extends ue{tryRead(e){let t=this.position;return this.canRead(1)&&ns.has(this.input.slice(t,t+2))?(this.position+=1,this.createLexeme(4096,this.input.slice(t,this.position))):this.canRead(2)&&is.has(this.input.slice(t,t+3))?(this.position+=2,this.createLexeme(4096,this.input.slice(t,this.position))):null}};var ss=new Je([["grouping","sets"],["array"]]),rs=new Te(ss),gn=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=rs.parse(this.input,this.position);if(t!==null)return this.position=t.newPosition,this.createLexeme(2048,t.keyword);let n=le.tryReadRegularIdentifier(this.input,this.position);if(!n)return null;this.position=n.newPosition;var i=le.readWhiteSpaceAndComment(this.input,this.position).position-this.position;return this.canRead(i)&&this.input[this.position+i]==="("?this.createLexeme(2048,n.identifier):null}};var os=new Je([["double","precision"],["character","varying"],["time","without","time","zone"],["time","with","time","zone"],["timestamp","without","time","zone"],["timestamp","with","time","zone"]]),as=new Te(os),yn=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=as.parse(this.input,this.position);if(t!==null)return this.position=t.newPosition,this.createLexeme(8192,t.keyword);if(e===null)return null;let n=le.tryReadRegularIdentifier(this.input,this.position);return n?(this.position=n.newPosition,e.type&128&&e.value==="as"?this.createLexeme(8256,n.identifier):e.type&2&&e.value==="::"?this.createLexeme(8192,n.identifier):null):null}};var vn=class extends ue{tryRead(e){if(this.isEndOfInput())return null;let t=this.input[this.position];if(t==="`"){let n=this.readEscapedIdentifier("`");return this.createLexeme(64,n)}if(t==='"'){let n=this.readEscapedIdentifier('"');return this.createLexeme(64,n)}if(t==="["&&this.isSqlServerBracketIdentifier(e)){let n=this.readEscapedIdentifier("]");return this.createLexeme(64,n)}return null}isSqlServerBracketIdentifier(e){if(e?.value==="array")return!1;let t=this.position+1,n=t;for(;n<this.input.length&&this.input[n]!=="]";){let s=this.input[n];if(s===":"||s===","||s==="+"||s==="-"||s==="*"||s==="/"||s==="("||s===")")return!1;n++}if(n>=this.input.length)return!1;let i=this.input.slice(t,n).trim();return i===""?!1:/^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*$/.test(i)}readEscapedIdentifier(e){let t=this.position;this.position++;let n=!1;for(;this.canRead();){if(this.input[this.position]===e){n=!0;break}this.position++}if(!n)throw new Error(`Closing delimiter is not found. position: ${t}, delimiter: ${e}
8
- ${this.getDebugPositionInfo(t)}`);if(t===this.position)throw new Error(`Closing delimiter is not found. position: ${t}, delimiter: ${e}
9
- ${this.getDebugPositionInfo(t)}`);return this.position++,this.input.slice(t+1,this.position-1)}};var R=class a{constructor(e){this.input=e,this.position=0,this.readerManager=new dn(e).register(new vn(e)).register(new pn(e)).register(new Cn(e)).register(new cn(e)).register(new mn(e)).register(new fn(e)).register(new hn(e)).register(new yn(e)).register(new gn(e)).register(new un(e))}isEndOfInput(e=0){return this.position+e>=this.input.length}canRead(e=0){return!this.isEndOfInput(e)}tokenize(e){return e?.preserveFormatting?this.tokenizeWithFormatting():new a(this.input).readLexmes()}readLexmes(){return this.tokenizeBasic()}tokenizeBasic(){this.position=0;let e=[],t=null;for(;this.canRead()&&this.input[this.position]!==";";){let i=this.readComment(),s=this.position=i.position,r=this.readerManager.tryRead(this.position,t);if(r===null)throw new Error(`Unexpected character. actual: ${this.input[this.position]}, position: ${this.position}
10
- ${this.getDebugPositionInfo(this.position)}`);let o=this.position=this.readerManager.getMaxPosition(),l=this.readComment();this.position=l.position,e.push({lexeme:r,startPos:s,endPos:o,prefixComments:i.lines,suffixComments:l.lines}),t=r}let n=new Array(e.length);for(let i=0;i<e.length;i++){let s=e[i],r=s.lexeme;if(r.value.toLowerCase()==="select"&&s.suffixComments.length>0){let o=i+1;for(;o<e.length;){let l=e[o];if(l.lexeme.type&64||l.lexeme.type&1||!(l.lexeme.type&128)&&!(l.lexeme.type&16)&&!(l.lexeme.type&2)){l.prefixComments.unshift(...s.suffixComments),s.suffixComments=[];break}o++}}if(r.type&16&&s.suffixComments.length>0){let o=i+1;o<e.length&&(e[o].prefixComments.unshift(...s.suffixComments),s.suffixComments=[])}if((r.value.toLowerCase()==="union"||r.value.toLowerCase()==="intersect"||r.value.toLowerCase()==="except")&&s.suffixComments.length>0){let o=i+1;for(;o<e.length;){let l=e[o];if(l.lexeme.value.toLowerCase()==="select"){l.prefixComments.unshift(...s.suffixComments),s.suffixComments=[];break}o++}}this.attachCommentsToLexeme(r,s),n[i]=r}return n}attachCommentsToLexeme(e,t){let n=[],i=[];e.positionedComments&&e.positionedComments.length>0&&n.push(...e.positionedComments),t.prefixComments.length>0&&(i.push(...t.prefixComments),n.push({position:"before",comments:[...t.prefixComments]})),t.suffixComments.length>0&&(i.push(...t.suffixComments),n.push({position:"after",comments:[...t.suffixComments]})),n.length>0?(e.positionedComments=n,e.comments=null):i.length>0?(e.comments=i,e.positionedComments=void 0):(e.comments=null,e.positionedComments=void 0)}readComment(){return le.readWhiteSpaceAndComment(this.input,this.position)}getDebugPositionInfo(e){return le.getDebugPositionInfo(this.input,e)}tokenizeWithFormatting(){let e=this.tokenizeBasic();return this.mapToFormattingLexemes(e)}mapToFormattingLexemes(e){if(e.length===0)return[];let t=[],n=0;for(let s of e){n=this.skipWhitespaceAndComments(n);let r=this.findLexemeAtPosition(s,n);if(r)t.push(r),n=r.endPosition;else{let o={startPosition:n,endPosition:n+s.value.length};t.push(o),n=o.endPosition}}let i=[];for(let s=0;s<e.length;s++){let r=e[s],o=t[s],l=s<e.length-1?t[s+1].startPosition:this.input.length,u=this.input.slice(o.endPosition,l),c=this.extractCommentsFromWhitespace(u),p={...r,followingWhitespace:u,inlineComments:c,position:{startPosition:o.startPosition,endPosition:o.endPosition,...this.getLineColumnInfo(o.startPosition,o.endPosition)}};i.push(p)}return i}findLexemeAtPosition(e,t){if(t>=this.input.length)return null;let n=[e.value,e.value.toUpperCase(),e.value.toLowerCase()];for(let i of n)if(t+i.length<=this.input.length&&this.input.substring(t,t+i.length)===i&&this.isValidLexemeMatch(i,t))return{startPosition:t,endPosition:t+i.length};return null}isValidLexemeMatch(e,t){if(t>0){let i=this.input[t-1];if(this.isAlphanumericUnderscore(i))return!1}let n=t+e.length;if(n<this.input.length){let i=this.input[n];if(this.isAlphanumericUnderscore(i))return!1}return!0}isAlphanumericUnderscore(e){let t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122||t===95}isWhitespace(e){let t=e.charCodeAt(0);return t===32||t===9||t===10||t===13}extractCommentsFromWhitespace(e){let t=[],n=0;for(;n<e.length;){let i=n,s=le.readWhiteSpaceAndComment(e,n);s.lines.length>0&&t.push(...s.lines),n=s.position,n===i&&n++}return t}skipWhitespaceAndComments(e){let t=e;for(;t<this.input.length;){let n=this.input[t];if(this.isWhitespace(n)){t++;continue}if(t<this.input.length-1&&this.input[t]==="-"&&this.input[t+1]==="-"){for(;t<this.input.length&&this.input[t]!==`
11
- `&&this.input[t]!=="\r";)t++;continue}if(t<this.input.length-1&&this.input[t]==="/"&&this.input[t+1]==="*"){for(t+=2;t<this.input.length-1;){if(this.input[t]==="*"&&this.input[t+1]==="/"){t+=2;break}t++}continue}break}return t}getLineColumnInfo(e,t){let n=this.getLineColumn(e),i=this.getLineColumn(t);return{startLine:n.line,startColumn:n.column,endLine:i.line,endColumn:i.column}}getLineColumn(e){let t=1,n=1;for(let i=0;i<Math.min(e,this.input.length);i++)this.input[i]===`
12
- `?(t++,n=1):n++;return{line:t,column:n}}};var Me=class a{static parseFromLexeme(e,t){let{identifiers:n,newIndex:i}=a.parseEscapedOrDotSeparatedIdentifiers(e,t),{namespaces:s,name:r}=a.extractNamespacesAndName(n),o=new I(r);if(i>t){let u=e[i-1];u.positionedComments&&u.positionedComments.length>0?o.positionedComments=u.positionedComments:u.comments&&u.comments.length>0}let l=0;return i>t&&(l=e[i-1].type),{namespaces:s,name:o,newIndex:i,lastTokenType:l}}static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The name is complete but additional tokens were found.`);return{namespaces:i.namespaces,name:i.name}}static parseEscapedOrDotSeparatedIdentifiers(e,t){let n=t,i=[];for(;n<e.length;){if(e[n].type&512){if(n++,n>=e.length||!(e[n].type&64||e[n].type&128))throw new Error(`Expected identifier after '[' at position ${n}`);if(i.push(e[n].value),n++,n>=e.length||e[n].value!=="]")throw new Error(`Expected closing ']' after identifier at position ${n}`);n++}else if(e[n].type&64)i.push(e[n].value),n++;else if(e[n].type&2048)i.push(e[n].value),n++;else if(e[n].type&8192)i.push(e[n].value),n++;else if(e[n].value==="*"){i.push(e[n].value),n++;break}if(n<e.length&&e[n].type&32)n++;else break}return{identifiers:i,newIndex:n}}static extractNamespacesAndName(e){if(!e||e.length===0)throw new Error("Identifier list is empty");return e.length===1?{namespaces:null,name:e[0]}:{namespaces:e.slice(0,-1),name:e[e.length-1]}}};var wn=class{static parseFromLexeme(e,t){let{namespaces:n,name:i,newIndex:s}=Me.parseFromLexeme(e,t);return{value:new b(n,i),newIndex:s}}};var _t=class{static parseFromLexeme(e,t){let n=t,i=e[n].value,s,r=fi.parse(i.toLowerCase(),0);if(r){let o=new V(r.keyword);return n++,{value:o,newIndex:n}}if(/^[+-]?\d+(\.\d+)?([eE][+-]?\d+)?$/.test(i))return s=Number(i),n++,{value:new Y(s),newIndex:n};{/^\$[^$]*\$[\s\S]*\$[^$]*\$$/.test(i)?s=i:i.startsWith("'")&&i.endsWith("'")?s=i.slice(1,-1):s=i;let o=i.startsWith("'")&&i.endsWith("'");return n++,{value:new Y(s,void 0,o),newIndex:n}}}};var Sn=class{static parseFromLexeme(e,t){let n=t;if(n+1<e.length&&e[n].type&4&&(e[n+1].value==="select"||e[n+1].value==="values"||e[n+1].value==="with")){n+=1;let i=A.parseFromLexeme(e,n);if(n=i.newIndex,n>=e.length||e[n].type!==8)throw new Error(`Expected ')' at index ${n}, but found ${e[n].value}`);let s=e[n].comments;n++;let r=new ge(i.value);return s&&s.length>0,{value:r,newIndex:n}}else{let i=k.parseArgument(4,8,e,t);return n=i.newIndex,{value:new Z(i.value),newIndex:n}}}};var bn=class{static parseFromLexeme(e,t){let n=t;if(n<e.length&&e[n].type&2){let i=e[n].value;if(n++,i==="*")return{value:new b(null,"*"),newIndex:n};let s=k.parseFromLexeme(e,n);return n=s.newIndex,{value:new ne(i,s.value),newIndex:n}}throw new Error(`Invalid unary expression at index ${t}: ${e[t].value}`)}};var En=class{static parseFromLexeme(e,t){let n=t,i=e[n].value;i.startsWith("${")&&i.endsWith("}")?i=i.slice(2,-1):i=i.slice(1);let s=new L(i);return n++,{value:s,newIndex:n}}};var xn=class{static parseFromLexeme(e,t){let n=t,i=e[n].value;if(n++,n>=e.length||e[n].type!==1)throw new Error(`Expected string literal after string specifier at index ${n}`);let s=e[n].value;return n++,{value:new je(i,s),newIndex:n}}};var Tn=class a{static parseFromLexeme(e,t){let n=t,i=e[n];if(i.value==="case"){let s=i.comments,r=i.positionedComments;return n++,this.parseCaseExpression(e,n,s,r)}else if(i.value==="case when"){let s=i.comments,r=i.positionedComments;return n++,this.parseCaseWhenExpression(e,n,s,r)}return this.parseModifierUnaryExpression(e,n)}static parseModifierUnaryExpression(e,t){let n=t;if(n<e.length&&e[n].type&128){let i=e[n].value;n++;let s=k.parseFromLexeme(e,n);return{value:new ne(i,s.value),newIndex:s.newIndex}}throw new Error(`Invalid modifier unary expression at index ${n}, Lexeme: ${e[n].value}`)}static parseCaseExpression(e,t,n,i){let s=t,r=k.parseFromLexeme(e,s);s=r.newIndex;let o=this.parseSwitchCaseArgument(e,s,[]);s=o.newIndex;let l=new se(r.value,o.value);return i&&i.length>0?l.positionedComments=i:n&&n.length>0&&(l.positionedComments=[a.convertLegacyToPositioned(n,"before")]),{value:l,newIndex:s}}static parseCaseWhenExpression(e,t,n,i){let s=t,r=this.parseCaseConditionValuePair(e,s);s=r.newIndex;let o=[r.value],l=this.parseSwitchCaseArgument(e,s,o);s=l.newIndex;let u=new se(null,l.value);return i&&i.length>0?u.positionedComments=i:n&&n.length>0&&(u.positionedComments=[a.convertLegacyToPositioned(n,"before")]),{value:u,newIndex:s}}static parseSwitchCaseArgument(e,t,n){let i=t,s=[...n];i=this.parseAdditionalWhenClauses(e,i,s);let{elseValue:r,elseComments:o,newIndex:l}=this.parseElseClause(e,i);i=l;let{endComments:u,newIndex:c}=this.parseEndClause(e,i);if(i=c,s.length===0)throw new Error(`The CASE expression requires at least one WHEN clause (index ${i})`);let p=new Ee(s,r);return this.applySwitchCaseComments(p,o,u),{value:p,newIndex:i}}static parseAdditionalWhenClauses(e,t,n){let i=t;for(;i<e.length&&this.isCommandWithValue(e[i],"when");){i++;let s=this.parseCaseConditionValuePair(e,i);i=s.newIndex,n.push(s.value)}return i}static parseElseClause(e,t){let n=null,i=null,s=t;if(s<e.length&&this.isCommandWithValue(e[s],"else")){i=this.extractKeywordComments(e[s]),s++;let r=k.parseFromLexeme(e,s);n=r.value,s=r.newIndex}return{elseValue:n,elseComments:i,newIndex:s}}static parseEndClause(e,t){let n=t,i=null;if(n<e.length&&this.isCommandWithValue(e[n],"end"))i=this.extractKeywordComments(e[n]),n++;else throw new Error(`The CASE expression requires 'end' keyword at the end (index ${n})`);return{endComments:i,newIndex:n}}static extractKeywordComments(e){return{legacy:e.comments,positioned:e.positionedComments}}static applySwitchCaseComments(e,t,n){let i=[],s=[];t?.positioned&&t.positioned.length>0&&i.push(...t.positioned),t?.legacy&&t.legacy.length>0&&s.push(...t.legacy),n?.positioned&&n.positioned.length>0&&i.push(...n.positioned),n?.legacy&&n.legacy.length>0&&s.push(...n.legacy),i.length>0?e.positionedComments=i:s.length>0&&(e.positionedComments=[a.convertLegacyToPositioned(s,"after")])}static isCommandWithValue(e,t){return(e.type&128)!==0&&e.value===t}static parseCaseConditionValuePair(e,t){let n=t,i=k.parseFromLexeme(e,n);if(n=i.newIndex,n>=e.length||!(e[n].type&128)||e[n].value!=="then")throw new Error(`Expected 'then' after WHEN condition at index ${n}`);let s=e[n].comments,r=e[n].positionedComments;n++;let o=k.parseFromLexeme(e,n);n=o.newIndex;let l=new xe(i.value,o.value);return r&&r.length>0?l.positionedComments=r:s&&s.length>0&&(l.positionedComments=[a.convertLegacyToPositioned(s,"after")]),{value:l,newIndex:n}}static convertLegacyToPositioned(e,t="before"){return{position:t,comments:e}}};var it=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The ORDER BY clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="order by")throw new Error(`Syntax error at position ${n}: Expected 'ORDER BY' keyword but found "${e[n].value}". ORDER BY clauses must start with the ORDER BY keywords.`);n++;let i=[],s=this.parseItem(e,n);for(i.push(s.value),n=s.newIndex;n<e.length&&e[n].type&16;){n++;let r=this.parseItem(e,n);i.push(r.value),n=r.newIndex}if(i.length===0)throw new Error(`Syntax error at position ${t}: No ordering expressions found. The ORDER BY clause requires at least one expression to order by.`);return{value:new pe(i),newIndex:n}}static parseItem(e,t){let n=t,i=k.parseFromLexeme(e,n),s=i.value;if(n=i.newIndex,n>=e.length)return{value:s,newIndex:n};let r=null,o=null;if(n<e.length){let u=e[n];if(u.value==="asc"?(o="asc",n++):u.value==="desc"&&(o="desc",n++),o!==null){if(u.positionedComments&&u.positionedComments.length>0){r=[];for(let c of u.positionedComments)c.comments&&c.comments.length>0&&r.push(...c.comments)}u.comments&&u.comments.length>0&&(r||(r=[]),r.push(...u.comments))}}let l=n>=e.length?null:e[n].value==="nulls first"?(n++,"first"):e[n].value==="nulls last"?(n++,"last"):null;return r&&r.length>0&&(s.comments?s.comments.push(...r):s.comments=r),o===null&&l===null?{value:s,newIndex:n}:{value:new Le(s,o,l),newIndex:n}}};var kn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The PARTITION BY clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="partition by")throw new Error(`Syntax error at position ${n}: Expected 'PARTITION BY' keyword but found "${e[n].value}". PARTITION BY clauses must start with the PARTITION BY keywords.`);n++;let i=[],s=k.parseFromLexeme(e,n);for(i.push(s.value),n=s.newIndex;n<e.length&&e[n].type&16;){n++;let r=k.parseFromLexeme(e,n);i.push(r.value),n=r.newIndex}if(i.length===0)throw new Error(`Syntax error at position ${t}: No partition expressions found. The PARTITION BY clause requires at least one expression to partition by.`);return i.length===1?{value:new Ue(i[0]),newIndex:n}:{value:new Ue(new D(i)),newIndex:n}}};var Pt=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The window frame expression is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].type!==4)throw new Error(`Syntax error at position ${n}: Expected opening parenthesis '(' but found "${e[n].value}".`);n++;let i=null,s=null,r=null;if(n<e.length&&e[n].value==="partition by"){let o=kn.parseFromLexeme(e,n);i=o.value,n=o.newIndex}if(n<e.length&&e[n].value==="order by"){let o=it.parseFromLexeme(e,n);s=o.value,n=o.newIndex}if(n<e.length&&this.isFrameTypeKeyword(e[n].value)){let o=this.parseFrameSpec(e,n);r=o.value,n=o.newIndex}if(n>=e.length||e[n].type!==8)throw new Error(`Syntax error at position ${n}: Missing closing parenthesis ')' for window frame. Each opening parenthesis must have a matching closing parenthesis.`);return n++,{value:new Ve(i,s,r),newIndex:n}}static isFrameTypeKeyword(e){let t=e;return t==="rows"||t==="range"||t==="groups"}static parseFrameSpec(e,t){let n=t,i=e[n].value,s;switch(i){case"rows":s="rows";break;case"range":s="range";break;case"groups":s="groups";break;default:throw new Error(`Syntax error at position ${n}: Invalid frame type "${e[n].value}". Expected one of: ROWS, RANGE, GROUPS.`)}if(n++,n<e.length&&e[n].value==="between"){n++;let r=this.parseFrameBoundary(e,n),o=r.value;if(n=r.newIndex,n>=e.length||e[n].value!=="and")throw new Error(`Syntax error at position ${n}: Expected 'AND' keyword in BETWEEN clause.`);n++;let l=this.parseFrameBoundary(e,n),u=l.value;return n=l.newIndex,{value:new He(s,o,u),newIndex:n}}else{let r=this.parseFrameBoundary(e,n),o=r.value;return n=r.newIndex,{value:new He(s,o,null),newIndex:n}}}static parseFrameBoundary(e,t){let n=t;if(n<e.length&&e[n].type&128){let i=e[n].value,s;switch(i){case"current row":s="current row";break;case"unbounded preceding":s="unbounded preceding";break;case"unbounded following":s="unbounded following";break;default:throw new Error(`Syntax error at position ${n}: Invalid frame type "${e[n].value}". Expected one of: ROWS, RANGE, GROUPS.`)}return{value:new Et(s),newIndex:n+1}}else if(n<e.length&&e[n].type&1){let i=k.parseFromLexeme(e,n);if(n=i.newIndex,n<e.length&&e[n].type&128){let s=e[n].value,r;if(s==="preceding")r=!1;else if(s==="following")r=!0;else throw new Error(`Syntax error at position ${n}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);return n++,{value:new xt(i.value,r),newIndex:n}}else throw new Error(`Syntax error at position ${n}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`)}throw new Error(`Syntax error at position ${n}: Expected a valid frame boundary component.`)}};var qt=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The OVER expression is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="over")throw new Error(`Syntax error at position ${n}: Expected 'OVER' keyword but found "${e[n].value}". OVER expressions must start with the OVER keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'OVER' keyword. Expected either a window name or an opening parenthesis '('.");if(e[n].type&64){let i=e[n].value;return n++,{value:new I(i),newIndex:n}}if(e[n].type&4)return Pt.parseFromLexeme(e,n);throw new Error(`Syntax error at position ${n}: Expected a window name or opening parenthesis '(' after OVER keyword, but found "${e[n].value}".`)}};var be=class a extends Error{constructor(t,n,i){super(t);this.index=n;this.context=i;this.name="ParseError"}static fromUnparsedLexemes(t,n,i){let s=Math.max(0,n-2),r=Math.min(t.length,n+3),o=t.slice(s,r).map((u,c)=>{let p=c+s===n?">":" ",d=$[u.type]||u.type;return`${p} ${c+s}:${u.value} [${d}]`}).join(`
13
- `),l=`${i} Unparsed lexeme remains at index ${n}: ${t[n].value}
1
+ var SqlComponent=class{constructor(){this.comments=null;this.positionedComments=null}getKind(){return this.constructor.kind}accept(visitor){return visitor.visit(this)}toSqlString(formatter){return this.accept(formatter)}addPositionedComments(position,comments){if(!comments||comments.length===0)return;this.positionedComments||(this.positionedComments=[]);let existing=this.positionedComments.find(pc=>pc.position===position);existing?existing.comments.push(...comments):this.positionedComments.push({position,comments:[...comments]})}getPositionedComments(position){if(!this.positionedComments)return[];let positioned=this.positionedComments.find(pc=>pc.position===position);return positioned?positioned.comments:[]}getAllPositionedComments(){if(!this.positionedComments)return[];let result=[],beforeComments=this.getPositionedComments("before");result.push(...beforeComments);let afterComments=this.getPositionedComments("after");return result.push(...afterComments),result}},SqlDialectConfiguration=class{constructor(){this.parameterSymbol=":";this.identifierEscape={start:'"',end:'"'};this.exportComment=!0}};var InsertQuery=class extends SqlComponent{static{this.kind=Symbol("InsertQuery")}constructor(params){super(),this.insertClause=params.insertClause,this.selectQuery=params.selectQuery??null}};var InlineQuery=class extends SqlComponent{static{this.kind=Symbol("InlineQuery")}constructor(selectQuery){super(),this.selectQuery=selectQuery}},ValueList=class extends SqlComponent{static{this.kind=Symbol("ValueList")}constructor(values){super(),this.values=values}},ColumnReference=class extends SqlComponent{get namespaces(){return this.qualifiedName.namespaces}get column(){return this.qualifiedName.name instanceof IdentifierString?this.qualifiedName.name:new IdentifierString(this.qualifiedName.name.value)}static{this.kind=Symbol("ColumnReference")}constructor(namespaces,column){super();let col=typeof column=="string"?new IdentifierString(column):column;this.qualifiedName=new QualifiedName(toIdentifierStringArray(namespaces),col)}toString(){return this.qualifiedName.toString()}getNamespace(){return this.qualifiedName.namespaces?this.qualifiedName.namespaces.map(namespace=>namespace.name).join("."):""}},FunctionCall=class extends SqlComponent{static{this.kind=Symbol("FunctionCall")}constructor(namespaces,name,argument,over,withinGroup=null,withOrdinality=!1,internalOrderBy=null){super(),this.qualifiedName=new QualifiedName(namespaces,name),this.argument=argument,this.over=over,this.withinGroup=withinGroup,this.withOrdinality=withOrdinality,this.internalOrderBy=internalOrderBy}get namespaces(){return this.qualifiedName.namespaces}get name(){return this.qualifiedName.name}},WindowFrameType=(WindowFrameType2=>(WindowFrameType2.Rows="rows",WindowFrameType2.Range="range",WindowFrameType2.Groups="groups",WindowFrameType2))(WindowFrameType||{}),WindowFrameBound=(WindowFrameBound2=>(WindowFrameBound2.UnboundedPreceding="unbounded preceding",WindowFrameBound2.UnboundedFollowing="unbounded following",WindowFrameBound2.CurrentRow="current row",WindowFrameBound2))(WindowFrameBound||{}),WindowFrameBoundStatic=class extends SqlComponent{static{this.kind=Symbol("WindowFrameStaticBound")}constructor(bound){super(),this.bound=bound}},WindowFrameBoundaryValue=class extends SqlComponent{static{this.kind=Symbol("WindowFrameBoundary")}constructor(value,isFollowing){super(),this.value=value,this.isFollowing=isFollowing}},WindowFrameSpec=class extends SqlComponent{static{this.kind=Symbol("WindowFrameSpec")}constructor(frameType,startBound,endBound){super(),this.frameType=frameType,this.startBound=startBound,this.endBound=endBound}},WindowFrameExpression=class extends SqlComponent{static{this.kind=Symbol("WindowFrameExpression")}constructor(partition,order,frameSpec=null){super(),this.partition=partition,this.order=order,this.frameSpec=frameSpec}},UnaryExpression=class extends SqlComponent{static{this.kind=Symbol("UnaryExpression")}constructor(operator,expression){super(),this.operator=new RawString(operator),this.expression=expression}},BinaryExpression=class extends SqlComponent{static{this.kind=Symbol("BinaryExpression")}constructor(left,operator,right){super(),this.left=left,this.operator=new RawString(operator),this.right=right}},LiteralValue=class extends SqlComponent{static{this.kind=Symbol("LiteralExpression")}constructor(value,_deprecated,isStringLiteral){super(),this.value=value,this.isStringLiteral=isStringLiteral}},ParameterExpression=class extends SqlComponent{static{this.kind=Symbol("ParameterExpression")}constructor(name,value=null){super(),this.name=new RawString(name),this.value=value,this.index=null}},SwitchCaseArgument=class extends SqlComponent{static{this.kind=Symbol("SwitchCaseArgument")}constructor(cases,elseValue=null){super(),this.cases=cases,this.elseValue=elseValue}},CaseKeyValuePair=class extends SqlComponent{static{this.kind=Symbol("CaseKeyValuePair")}constructor(key,value){super(),this.key=key,this.value=value}},RawString=class extends SqlComponent{static{this.kind=Symbol("RawString")}constructor(value){super(),this.value=value}},IdentifierString=class extends SqlComponent{static{this.kind=Symbol("IdentifierString")}constructor(alias){super(),this.name=alias}},ParenExpression=class extends SqlComponent{static{this.kind=Symbol("ParenExpression")}constructor(expression){super(),this.expression=expression}},CastExpression=class extends SqlComponent{static{this.kind=Symbol("CastExpression")}constructor(input,castType){super(),this.input=input,this.castType=castType}},CaseExpression=class extends SqlComponent{static{this.kind=Symbol("CaseExpression")}constructor(condition,switchCase){super(),this.condition=condition,this.switchCase=switchCase}},ArrayExpression=class extends SqlComponent{static{this.kind=Symbol("ArrayExpression")}constructor(expression){super(),this.expression=expression}},ArrayQueryExpression=class extends SqlComponent{static{this.kind=Symbol("ArrayQueryExpression")}constructor(query){super(),this.query=query}},BetweenExpression=class extends SqlComponent{static{this.kind=Symbol("BetweenExpression")}constructor(expression,lower,upper,negated){super(),this.expression=expression,this.lower=lower,this.upper=upper,this.negated=negated}},StringSpecifierExpression=class extends SqlComponent{static{this.kind=Symbol("StringSpecifierExpression")}constructor(specifier,value){super(),this.specifier=new RawString(specifier),this.value=new LiteralValue(value)}},TypeValue=class extends SqlComponent{static{this.kind=Symbol("TypeValue")}constructor(namespaces,name,argument=null){super(),this.qualifiedName=new QualifiedName(namespaces,name),this.argument=argument}get namespaces(){return this.qualifiedName.namespaces}get name(){return this.qualifiedName.name}getTypeName(){let nameValue=this.qualifiedName.name instanceof RawString?this.qualifiedName.name.value:this.qualifiedName.name.name;return this.qualifiedName.namespaces&&this.qualifiedName.namespaces.length>0?this.qualifiedName.namespaces.map(ns=>ns.name).join(".")+"."+nameValue:nameValue}},TupleExpression=class extends SqlComponent{static{this.kind=Symbol("TupleExpression")}constructor(values){super(),this.values=values}},ArraySliceExpression=class extends SqlComponent{static{this.kind=Symbol("ArraySliceExpression")}constructor(array,startIndex,endIndex){super(),this.array=array,this.startIndex=startIndex,this.endIndex=endIndex}},ArrayIndexExpression=class extends SqlComponent{static{this.kind=Symbol("ArrayIndexExpression")}constructor(array,index){super(),this.array=array,this.index=index}};function toIdentifierStringArray(input){if(input==null)return null;if(typeof input=="string")return input.trim()===""?null:[new IdentifierString(input)];if(Array.isArray(input)){if(input.length===0)return null;if(typeof input[0]=="string"){let filteredStrings=input.filter(ns=>ns.trim()!=="");return filteredStrings.length===0?null:filteredStrings.map(ns=>new IdentifierString(ns))}else{let filteredIdentifiers=input.filter(ns=>ns.name.trim()!=="");return filteredIdentifiers.length===0?null:filteredIdentifiers}}return null}var QualifiedName=class extends SqlComponent{static{this.kind=Symbol("QualifiedName")}constructor(namespaces,name){super(),this.namespaces=toIdentifierStringArray(namespaces),typeof name=="string"?this.name=new RawString(name):this.name=name}toString(){let nameValue=this.name instanceof RawString?this.name.value:this.name.name;return this.namespaces&&this.namespaces.length>0?this.namespaces.map(ns=>ns.name).join(".")+"."+nameValue:nameValue}};var SelectItem=class extends SqlComponent{static{this.kind=Symbol("SelectItem")}constructor(value,name=null){super(),this.value=value,this.identifier=name?new IdentifierString(name):null}},SelectClause=class extends SqlComponent{static{this.kind=Symbol("SelectClause")}constructor(items,distinct=null,hints=[]){super(),this.items=items,this.distinct=distinct,this.hints=hints}},Distinct=class extends SqlComponent{static{this.kind=Symbol("Distinct")}constructor(){super()}},DistinctOn=class extends SqlComponent{static{this.kind=Symbol("DistinctOn")}constructor(value){super(),this.value=value}},WhereClause=class extends SqlComponent{static{this.kind=Symbol("WhereClause")}constructor(condition){super(),this.condition=condition}},PartitionByClause=class extends SqlComponent{static{this.kind=Symbol("PartitionByClause")}constructor(value){super(),this.value=value}},WindowFrameClause=class extends SqlComponent{static{this.kind=Symbol("WindowFrameClause")}constructor(name,expression){super(),this.name=new IdentifierString(name),this.expression=expression}},WindowsClause=class extends SqlComponent{static{this.kind=Symbol("WindowsClause")}constructor(windows){super(),this.windows=windows}};var OrderByClause=class extends SqlComponent{static{this.kind=Symbol("OrderByClause")}constructor(items){super(),this.order=items}},OrderByItem=class extends SqlComponent{static{this.kind=Symbol("OrderByItem")}constructor(expression,sortDirection,nullsPosition){super(),this.value=expression,this.sortDirection=sortDirection===null?"asc":sortDirection,this.nullsPosition=nullsPosition}},GroupByClause=class extends SqlComponent{static{this.kind=Symbol("GroupByClause")}constructor(expression){super(),this.grouping=expression}},HavingClause=class extends SqlComponent{static{this.kind=Symbol("HavingClause")}constructor(condition){super(),this.condition=condition}},TableSource=class extends SqlComponent{static{this.kind=Symbol("TableSource")}get namespaces(){return this.qualifiedName.namespaces}get table(){return this.qualifiedName.name instanceof IdentifierString?this.qualifiedName.name:new IdentifierString(this.qualifiedName.name.value)}get identifier(){return this.table}constructor(namespaces,table){super();let tbl=typeof table=="string"?new IdentifierString(table):table;this.qualifiedName=new QualifiedName(namespaces,tbl)}getSourceName(){return this.qualifiedName.namespaces&&this.qualifiedName.namespaces.length>0?this.qualifiedName.namespaces.map(namespace=>namespace.name).join(".")+"."+(this.qualifiedName.name instanceof RawString?this.qualifiedName.name.value:this.qualifiedName.name.name):this.qualifiedName.name instanceof RawString?this.qualifiedName.name.value:this.qualifiedName.name.name}},FunctionSource=class extends SqlComponent{static{this.kind=Symbol("FunctionSource")}constructor(name,argument){if(super(),typeof name=="object"&&name!==null&&"name"in name){let nameObj=name;this.qualifiedName=new QualifiedName(nameObj.namespaces,nameObj.name)}else this.qualifiedName=new QualifiedName(null,name);this.argument=argument}get namespaces(){return this.qualifiedName.namespaces}get name(){return this.qualifiedName.name}},ParenSource=class extends SqlComponent{static{this.kind=Symbol("ParenSource")}constructor(source){super(),this.source=source}},SubQuerySource=class extends SqlComponent{static{this.kind=Symbol("SubQuerySource")}constructor(query){super(),this.query=query}},SourceExpression=class extends SqlComponent{static{this.kind=Symbol("SourceExpression")}constructor(datasource,aliasExpression){super(),this.datasource=datasource,this.aliasExpression=aliasExpression}getAliasName(){return this.aliasExpression?this.aliasExpression.table.name:this.datasource instanceof TableSource?this.datasource.getSourceName():null}},JoinOnClause=class extends SqlComponent{static{this.kind=Symbol("JoinOnClause")}constructor(condition){super(),this.condition=condition}},JoinUsingClause=class extends SqlComponent{static{this.kind=Symbol("JoinUsingClause")}constructor(condition){super(),this.condition=condition}},JoinClause=class extends SqlComponent{static{this.kind=Symbol("JoinItem")}constructor(joinType,source,condition,lateral){super(),this.joinType=new RawString(joinType),this.source=source,this.condition=condition,this.lateral=lateral}getSourceAliasName(){return this.source.aliasExpression?this.source.aliasExpression.table.name:this.source instanceof TableSource?this.source.table.name:null}},FromClause=class extends SqlComponent{static{this.kind=Symbol("FromClause")}constructor(source,join){super(),this.source=source,this.joins=join}getSourceAliasName(){return this.source.aliasExpression?this.source.aliasExpression.table.name:this.source.datasource instanceof TableSource?this.source.datasource.table.name:null}getSources(){let sources=[this.source];if(this.joins)for(let join of this.joins)sources.push(join.source);return sources}},CommonTable=class extends SqlComponent{static{this.kind=Symbol("CommonTable")}constructor(query,aliasExpression,materialized){super(),this.query=query,this.materialized=materialized,typeof aliasExpression=="string"?this.aliasExpression=new SourceAliasExpression(aliasExpression,null):this.aliasExpression=aliasExpression}getSourceAliasName(){return this.aliasExpression.table.name}},WithClause=class extends SqlComponent{constructor(recursive,tables){super();this.trailingComments=null;this.globalComments=null;this.recursive=recursive,this.tables=tables}static{this.kind=Symbol("WithClause")}},LimitClause=class extends SqlComponent{static{this.kind=Symbol("LimitClause")}constructor(limit){super(),this.value=limit}};var OffsetClause=class extends SqlComponent{static{this.kind=Symbol("OffsetClause")}constructor(value){super(),this.value=value}},FetchClause=class extends SqlComponent{static{this.kind=Symbol("FetchClause")}constructor(expression){super(),this.expression=expression}},FetchExpression=class extends SqlComponent{static{this.kind=Symbol("FetchExpression")}constructor(type,count,unit){super(),this.type=type,this.count=count,this.unit=unit}};var ForClause=class extends SqlComponent{static{this.kind=Symbol("ForClause")}constructor(lockMode){super(),this.lockMode=lockMode}},SourceAliasExpression=class extends SqlComponent{static{this.kind=Symbol("SourceAliasExpression")}constructor(alias,columnAlias){super(),this.table=new IdentifierString(alias),this.columns=columnAlias!==null?columnAlias.map(alias2=>new IdentifierString(alias2)):null}},ReturningClause=class extends SqlComponent{static{this.kind=Symbol("ReturningClause")}constructor(columns){super(),this.columns=columns.map(col=>typeof col=="string"?new IdentifierString(col):col)}},SetClause=class extends SqlComponent{static{this.kind=Symbol("SetClause")}constructor(items){super(),this.items=items.map(item=>item instanceof SetClauseItem?item:new SetClauseItem(item.column,item.value))}},SetClauseItem=class extends SqlComponent{static{this.kind=Symbol("SetClauseItem")}constructor(column,value){if(super(),typeof column=="object"&&column!==null&&"column"in column){let colObj=column,col=typeof colObj.column=="string"?new IdentifierString(colObj.column):colObj.column;this.qualifiedName=new QualifiedName(colObj.namespaces,col)}else{let col=typeof column=="string"?new IdentifierString(column):column;this.qualifiedName=new QualifiedName(null,col)}this.value=value}get namespaces(){return this.qualifiedName.namespaces}get column(){return this.qualifiedName.name instanceof IdentifierString?this.qualifiedName.name:new IdentifierString(this.qualifiedName.name.value)}getFullName(){return this.qualifiedName.toString()}},UpdateClause=class extends SqlComponent{static{this.kind=Symbol("UpdateClause")}constructor(source){super(),this.source=source}getSourceAliasName(){return this.source.aliasExpression?this.source.aliasExpression.table.name:this.source.datasource instanceof TableSource?this.source.datasource.table.name:null}},InsertClause=class extends SqlComponent{constructor(source,columns){super(),this.source=source,this.columns=columns.map(col=>new IdentifierString(col))}};var TokenType=(TokenType2=>(TokenType2[TokenType2.None=0]="None",TokenType2[TokenType2.Literal=1]="Literal",TokenType2[TokenType2.Operator=2]="Operator",TokenType2[TokenType2.OpenParen=4]="OpenParen",TokenType2[TokenType2.CloseParen=8]="CloseParen",TokenType2[TokenType2.Comma=16]="Comma",TokenType2[TokenType2.Dot=32]="Dot",TokenType2[TokenType2.Identifier=64]="Identifier",TokenType2[TokenType2.Command=128]="Command",TokenType2[TokenType2.Parameter=256]="Parameter",TokenType2[TokenType2.OpenBracket=512]="OpenBracket",TokenType2[TokenType2.CloseBracket=1024]="CloseBracket",TokenType2[TokenType2.Function=2048]="Function",TokenType2[TokenType2.StringSpecifier=4096]="StringSpecifier",TokenType2[TokenType2.Type=8192]="Type",TokenType2))(TokenType||{});var CharLookupTable=class{static isWhitespace(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code===32||code===9||code===10||code===13}static isDigit(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code>=48&&code<=57}static isHexChar(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=70}static isOperatorSymbol(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code===43||code===45||code===42||code===47||code===37||code===126||code===64||code===35||code===94||code===38||code===58||code===33||code===60||code===62||code===61||code===124||code===63}static isDelimiter(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code===46||code===44||code===40||code===41||code===91||code===93||code===123||code===125||code===59||code===32||code===9||code===10||code===13?!0:code===43||code===45||code===42||code===47||code===37||code===126||code===64||code===35||code===94||code===38||code===58||code===33||code===60||code===62||code===61||code===124||code===63}static isNamedParameterPrefix(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code===64||code===58||code===36}};var StringUtils=class _StringUtils{static getDebugPositionInfo(input,errPosition){let start=Math.max(0,errPosition-5),end=Math.min(input.length,errPosition+5),debugInfo=input.slice(start,end),caret=" ".repeat(errPosition-start)+"^";return`${debugInfo}
2
+ ${caret}`}static skipWhiteSpace(input,position){let length=input.length;for(;position+4<=length&&input.slice(position,position+4)===" ";)position+=4;for(;position<length;){let charCode=input.charCodeAt(position);if(charCode!==32&&charCode!==9&&charCode!==10&&charCode!==13)break;position++}return position}static readLineComment(input,position){if(position+1>=input.length)return{newPosition:position,comment:null};if(input.charCodeAt(position)===45&&input.charCodeAt(position+1)===45){let start=position;for(position+=2;position<input.length&&input.charCodeAt(position)!==10;)position++;let comment=input.slice(start+2,position).trim();return{newPosition:position,comment}}return{newPosition:position,comment:null}}static readBlockComment(input,position){if(position+1>=input.length)return{newPosition:position,comments:null};if(input.charCodeAt(position)!==47||input.charCodeAt(position+1)!==42)return{newPosition:position,comments:null};if(position+2<input.length&&input.charCodeAt(position+2)===43)return{newPosition:position,comments:null};let start=position;for(position+=2;position+1<input.length;){if(input.charCodeAt(position)===42&&input.charCodeAt(position+1)===47){position+=2;let processedLines=this.processBlockCommentContent(input.slice(start+2,position-2));return{newPosition:position,comments:processedLines}}position++}let processedLinesUnterminated=this.processBlockCommentContent(input.slice(start+2));return{newPosition:input.length,comments:processedLinesUnterminated}}static processBlockCommentContent(rawContent){let rawLines=rawContent.replace(/\r/g,"").split(`
3
+ `),processedLines=[];for(let rawLine of rawLines){let trimmedLine=rawLine.trim(),isSeparatorLine=/^\s*[-=_+*#]+\s*$/.test(rawLine);trimmedLine!==""||isSeparatorLine?processedLines.push(isSeparatorLine?rawLine.trim():trimmedLine):processedLines.push("")}for(;processedLines.length>0&&processedLines[0]==="";)processedLines.shift();for(;processedLines.length>0&&processedLines[processedLines.length-1]==="";)processedLines.pop();return processedLines}static readWhiteSpaceAndComment(input,position){let lines=[],length=input.length;for(;position<length;){let oldPosition=position;if(position=_StringUtils.skipWhiteSpace(input,position),position!==oldPosition)continue;let charCode=input.charCodeAt(position);if(charCode===45){let lineCommentResult=_StringUtils.readLineComment(input,position);if(lineCommentResult.newPosition!==position){position=lineCommentResult.newPosition,lineCommentResult.comment&&lines.push(lineCommentResult.comment.trim());continue}}else if(charCode===47){let blockCommentResult=_StringUtils.readBlockComment(input,position);if(blockCommentResult.newPosition!==position){position=blockCommentResult.newPosition,blockCommentResult.comments&&lines.push(...blockCommentResult.comments);continue}}break}return{position,lines}}static readRegularIdentifier(input,position){let result=this.tryReadRegularIdentifier(input,position);if(!result)throw new Error(`Unexpected character. position: ${position}
4
+ ${_StringUtils.getDebugPositionInfo(input,position)}`);return result}static tryReadRegularIdentifier(input,position){let start=position;for(;position<input.length&&!CharLookupTable.isDelimiter(input[position]);)position++;if(start===position)return null;for(;position+1<input.length&&input[position]==="["&&input[position+1]==="]";){let beforeIdentifier=input.slice(0,start).trim();if(beforeIdentifier===""||/[)]$/.test(beforeIdentifier)||/\b(select|from|where|and|or|set|values|insert|update|delete)\s*$/i.test(beforeIdentifier))break;position+=2}return{identifier:input.slice(start,position),newPosition:position}}};var BaseTokenReader=class{constructor(input,position=0){this.input=input,this.position=position}getPosition(){return this.position}setPosition(position){this.position=position}isEndOfInput(shift=0){return this.position+shift>=this.input.length}canRead(shift=0){return!this.isEndOfInput(shift)}read(expectChar){if(this.isEndOfInput())throw new Error(`Unexpected character. expect: ${expectChar}, actual: EndOfInput, position: ${this.position}`);let char=this.input[this.position];if(char!==expectChar)throw new Error(`Unexpected character. expect: ${expectChar}, actual: ${char}, position: ${this.position}`);return this.position++,char}createLexeme(type,value,comments=null,startPosition,endPosition){let lexeme={type,value:type===128||type===2||type===2048?value.toLowerCase():value,comments};return startPosition!==void 0&&endPosition!==void 0&&(lexeme.position={startPosition,endPosition}),lexeme}createLexemeWithPosition(type,value,startPos,comments=null){return this.createLexeme(type,value,comments,startPos,startPos+value.length)}getDebugPositionInfo(errPosition){return StringUtils.getDebugPositionInfo(this.input,errPosition)}};var IdentifierTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let char=this.input[this.position];if(char==="*")return this.position++,this.createLexeme(64,char);let result=StringUtils.readRegularIdentifier(this.input,this.position);return this.position=result.newPosition,this.createLexeme(64,result.identifier)}};var KeywordParser=class{constructor(trie5){this.trie=trie5}isEndOfInput(input,position,shift=0){return position+shift>=input.length}canParse(input,position,shift=0){return!this.isEndOfInput(input,position,shift)}parse(input,position){if(this.isEndOfInput(input,position))return null;this.trie.reset();let result=StringUtils.tryReadRegularIdentifier(input,position);if(result===null)return null;let matchResult=this.trie.pushLexeme(result.identifier.toLowerCase());if(matchResult===0)return null;if(matchResult===3)return{keyword:result.identifier,newPosition:result.newPosition};let lexeme=result.identifier,commentResult=StringUtils.readWhiteSpaceAndComment(input,result.newPosition);position=commentResult.position;let collectedComments=[...commentResult.lines];if(this.isEndOfInput(input,position))return matchResult===2?{keyword:lexeme,newPosition:position,comments:collectedComments.length>0?collectedComments:void 0}:null;for(;this.canParse(input,position);){let previousMatchResult=matchResult,result2=StringUtils.tryReadRegularIdentifier(input,position);if(result2!==null){if(matchResult=this.trie.pushLexeme(result2.identifier.toLowerCase()),matchResult===0){if(previousMatchResult===2)break;return null}lexeme+=" "+result2.identifier;let nextCommentResult=StringUtils.readWhiteSpaceAndComment(input,result2.newPosition);if(position=nextCommentResult.position,collectedComments.push(...nextCommentResult.lines),matchResult===3)break}else{if(previousMatchResult===2)break;return null}}return{keyword:lexeme,newPosition:position,comments:collectedComments.length>0?collectedComments:void 0}}};var KeywordTrie=class{constructor(keywords2){this.root=new Map;this.hasEndProperty=!1;this.hasMoreProperties=!1;for(let keyword of keywords2)this.addKeyword(keyword);this.currentNode=this.root}addKeyword(keyword){let node=this.root;for(let word of keyword)node.has(word)||node.set(word,new Map),node=node.get(word);node.set("__end__",!0)}reset(){this.currentNode=this.root,this.hasEndProperty=!1,this.hasMoreProperties=!1}pushLexeme(lexeme){return this.currentNode.has(lexeme)?(this.currentNode=this.currentNode.get(lexeme),this.hasEndProperty=this.currentNode.has("__end__"),this.hasMoreProperties=this.currentNode.size>(this.hasEndProperty?1:0),this.hasEndProperty&&!this.hasMoreProperties?3:this.hasEndProperty&&this.hasMoreProperties?2:1):0}};var keywords=[["null"],["true"],["false"],["current_date"],["current_time"],["current_timestamp"],["localtime"],["localtimestamp"],["unbounded"],["normalized"],["nfc","normalized"],["nfd","normalized"],["nfkc","normalized"],["nfkd","normalized"],["nfc"],["nfd"],["nfkc"],["nfkd"]],trie=new KeywordTrie(keywords),literalKeywordParser=new KeywordParser(trie),LiteralTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let char=this.input[this.position];if(char==="'"){let value=this.readSingleQuotedString();return this.createLexeme(1,value)}let keyword=this.tryReadKeyword();if(keyword)return keyword;if(char==="."&&this.canRead(1)&&CharLookupTable.isDigit(this.input[this.position+1]))return this.createLexeme(1,this.readDigit());if(CharLookupTable.isDigit(char))return this.createLexeme(1,this.readDigit());if(char==="$"&&this.isDollarQuotedString())return this.createLexeme(1,this.readDollarQuotedString());if(char==="$"&&this.canRead(1)&&CharLookupTable.isDigit(this.input[this.position+1])){let pos=this.position+1,hasDecimalOrComma=!1;for(;pos<this.input.length&&(CharLookupTable.isDigit(this.input[pos])||this.input[pos]===","||this.input[pos]===".");){if(this.input[pos]==="."||this.input[pos]===","){hasDecimalOrComma=!0;break}pos++}if(hasDecimalOrComma){this.position++;let numberPart=this.readMoneyDigit();return this.createLexeme(1,"$"+numberPart)}}if((char==="+"||char==="-")&&this.determineSignOrOperator(previous)==="sign"){let sign=char;this.position++;let pos=this.position;for(;this.canRead()&&CharLookupTable.isWhitespace(this.input[this.position]);)this.position++;if(this.canRead()&&(CharLookupTable.isDigit(this.input[this.position])||this.input[this.position]==="."&&this.canRead(1)&&CharLookupTable.isDigit(this.input[this.position+1])))return this.createLexeme(1,sign==="-"?sign+this.readDigit():this.readDigit());this.position=pos-1}return null}tryReadKeyword(){let result=literalKeywordParser.parse(this.input,this.position);return result?(this.position=result.newPosition,this.createLexeme(1,result.keyword)):null}determineSignOrOperator(previous){return previous===null?"sign":previous.type&1||previous.type&64||previous.type&256||previous.type&8?"operator":"sign"}readDigit(){let start=this.position,hasDot=!1,hasExponent=!1;if(this.canRead(1)&&this.input[this.position]==="0"&&"xbo".includes(this.input[this.position+1].toLowerCase())){let prefixType=this.input[this.position+1].toLowerCase();this.position+=2;let isHex=prefixType==="x";for(;this.canRead();){let c=this.input[this.position];if(CharLookupTable.isDigit(c)||isHex&&CharLookupTable.isHexChar(c))this.position++;else break}return this.input.slice(start,this.position)}for(this.input[start]==="."&&(hasDot=!0,this.position++);this.canRead();){let char=this.input[this.position];if(char==="."&&!hasDot)hasDot=!0;else if((char==="e"||char==="E")&&!hasExponent)hasExponent=!0,this.canRead(1)&&(this.input[this.position+1]==="+"||this.input[this.position+1]==="-")&&this.position++;else if(!CharLookupTable.isDigit(char))break;this.position++}if(start===this.position)throw new Error(`Unexpected character. position: ${start}
5
+ ${this.getDebugPositionInfo(start)}`);return this.input[start]==="."?"0"+this.input.slice(start,this.position):this.input.slice(start,this.position)}readMoneyDigit(){let start=this.position,hasDot=!1;for(;this.canRead();){let char=this.input[this.position];if(char==="."&&!hasDot)hasDot=!0;else if(!(char===","&&!hasDot)){if(!CharLookupTable.isDigit(char))break}this.position++}if(start===this.position)throw new Error(`Unexpected character. position: ${start}
6
+ ${this.getDebugPositionInfo(start)}`);return this.input.slice(start,this.position)}readSingleQuotedString(){let start=this.position,closed=!1;for(this.read("'");this.canRead();){let char=this.input[this.position];if(this.position++,char==="\\"&&this.canRead(1)){this.position++;continue}else if(char==="'"){closed=!0;break}}if(closed===!1)throw new Error(`Single quote is not closed. position: ${start}
7
+ ${this.getDebugPositionInfo(start)}`);return this.input.slice(start,this.position)}isDollarQuotedString(){if(!this.canRead(1))return!1;if(this.input[this.position+1]==="$")return!0;let pos=this.position+1;for(;pos<this.input.length;){let char=this.input[pos];if(char==="$")return!0;if(!this.isAlphanumeric(char)&&char!=="_")return!1;pos++}return!1}readDollarQuotedString(){let start=this.position;this.position++;let tag="";for(;this.canRead()&&this.input[this.position]!=="$";)tag+=this.input[this.position],this.position++;if(!this.canRead())throw new Error(`Unexpected end of input while reading dollar-quoted string tag at position ${start}`);this.position++;let openingTag="$"+tag+"$",closingTag=openingTag,content="";for(;this.canRead();){if(this.input.substring(this.position,this.position+closingTag.length)===closingTag)return this.position+=closingTag.length,openingTag+content+closingTag;content+=this.input[this.position],this.position++}throw new Error(`Unclosed dollar-quoted string starting at position ${start}. Expected closing tag: ${closingTag}`)}isAlphanumeric(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code>=48&&code<=57||code>=65&&code<=90||code>=97&&code<=122}};var ParameterTokenReader=class extends BaseTokenReader{constructor(input){super(input)}tryRead(previous){if(this.isEndOfInput())return null;if(this.canRead(1)&&this.input[this.position]==="$"&&this.input[this.position+1]==="{"){this.position+=2;let start=this.position;for(;this.canRead()&&this.input[this.position]!=="}";)this.position++;if(this.isEndOfInput())throw new Error(`Unexpected end of input. Expected closing '}' for parameter at position ${start}`);let identifier=this.input.slice(start,this.position);if(identifier.length===0)throw new Error("Empty parameter name is not allowed: found ${} at position "+(start-2));return this.position++,this.createLexeme(256,"${"+identifier+"}")}let char=this.input[this.position];if(CharLookupTable.isNamedParameterPrefix(char)){if(this.canRead(1)&&CharLookupTable.isOperatorSymbol(this.input[this.position+1])||char===":"&&this.isInArraySliceContext()||char==="$"&&this.isDollarQuotedString())return null;if(char==="$"&&this.canRead(1)&&CharLookupTable.isDigit(this.input[this.position+1])){let pos=this.position+1,hasDecimalOrComma=!1;for(;pos<this.input.length&&(CharLookupTable.isDigit(this.input[pos])||this.input[pos]===","||this.input[pos]===".");){if(this.input[pos]==="."||this.input[pos]===","){hasDecimalOrComma=!0;break}pos++}if(hasDecimalOrComma)return null}this.position++;let start=this.position;for(;this.canRead()&&!CharLookupTable.isDelimiter(this.input[this.position]);)this.position++;let identifier=this.input.slice(start,this.position);return this.createLexeme(256,char+identifier)}if(char==="?"){if(this.canRead(1)){let nextChar=this.input[this.position+1];if(nextChar==="|"||nextChar==="&")return null}return previous&&(previous.type&64||previous.type&1)?null:(this.position++,this.createLexeme(256,char))}return null}isInArraySliceContext(){let pos=this.position-1,bracketDepth=0,parenDepth=0;for(;pos>=0;){let char=this.input[pos];if(char==="]")bracketDepth++;else if(char==="["){if(bracketDepth--,bracketDepth<0){if(pos>0){let prevChar=this.input[pos-1];if(/[a-zA-Z0-9_)\]]/.test(prevChar))return!0}if(pos===0)return!1;break}}else char===")"?parenDepth++:char==="("&&parenDepth--;pos--}return!1}isDollarQuotedString(){if(!this.canRead(1))return!1;if(this.input[this.position+1]==="$")return!0;let pos=this.position+1;for(;pos<this.input.length;){let char=this.input[pos];if(char==="$")return!0;if(!this.isAlphanumeric(char)&&char!=="_")return!1;pos++}return!1}isAlphanumeric(char){if(char.length!==1)return!1;let code=char.charCodeAt(0);return code>=48&&code<=57||code>=65&&code<=90||code>=97&&code<=122}};var SpecialSymbolTokenReader=class _SpecialSymbolTokenReader extends BaseTokenReader{static{this.SPECIAL_SYMBOL_TOKENS={".":32,",":16,"(":4,")":8,"[":512,"]":1024}}tryRead(previous){if(this.isEndOfInput())return null;let char=this.input[this.position];return char in _SpecialSymbolTokenReader.SPECIAL_SYMBOL_TOKENS?(this.position++,this.createLexeme(_SpecialSymbolTokenReader.SPECIAL_SYMBOL_TOKENS[char],char)):null}};var TokenReaderManager=class{constructor(input,position=0){this.cacheHits=0;this.cacheMisses=0;this.input=input,this.position=position,this.readers=[],this.tokenCache=new Map}register(reader){return this.readers.push(reader),this}registerAll(readers){return readers.forEach(reader=>this.register(reader)),this}setPosition(position){this.position=position;for(let reader of this.readers)reader.setPosition(position)}tryRead(position,previous){if(this.tokenCache.has(position))return this.cacheHits++,this.tokenCache.get(position)||null;this.cacheMisses++,this.setPosition(position);let lexeme=null;for(let reader of this.readers)if(lexeme=reader.tryRead(previous),lexeme){this.position=reader.getPosition();break}for(let reader of this.readers)reader.setPosition(this.position);return this.tokenCache.set(position,lexeme),lexeme}getMaxPosition(){let maxPosition=this.position;for(let reader of this.readers){let position=reader.getPosition();position>maxPosition&&(maxPosition=position)}return maxPosition}getInput(){return this.input}getCacheStats(){let total=this.cacheHits+this.cacheMisses,ratio=total>0?this.cacheHits/total:0;return{hits:this.cacheHits,misses:this.cacheMisses,ratio}}};var trie2=new KeywordTrie([["and"],["or"],["is"],["is","not"],["is","distinct","from"],["is","not","distinct","from"],["like"],["ilike"],["in"],["exists"],["between"],["not","like"],["not","ilike"],["not","in"],["not","exists"],["not","between"],["escape"],["uescape"],["similar","to"],["not","similar","to"],["similar"],["placing"],["rlike"],["regexp"],["mod"],["xor"],["not"],["both"],["leading"],["trailing"],["both","from"],["leading","from"],["trailing","from"],["year","from"],["month","from"],["day","from"],["hour","from"],["minute","from"],["second","from"],["dow","from"],["doy","from"],["isodow","from"],["quarter","from"],["week","from"],["epoch","from"],["at","time","zone"]]),operatorOrTypeTrie=new KeywordTrie([["date"],["time"],["timestamp"],["timestamptz"],["timetz"],["interval"],["boolean"],["integer"],["bigint"],["smallint"],["numeric"],["decimal"],["real"],["double","precision"],["double","precision"],["character","varying"],["time","without","time","zone"],["time","with","time","zone"],["timestamp","without","time","zone"],["timestamp","with","time","zone"]]),keywordParser=new KeywordParser(trie2),operatorOrTypeParser=new KeywordParser(operatorOrTypeTrie);var OperatorTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let char=this.input[this.position];if(CharLookupTable.isOperatorSymbol(char)){let start=this.position;for(;this.canRead()&&CharLookupTable.isOperatorSymbol(this.input[this.position])&&(this.position++,!!this.canRead());){let previous2=this.input[this.position-1],next=this.input[this.position];if(previous2==="-"&&next==="-"||previous2==="/"&&next==="*")break}this.position===start&&this.position++;let resut=this.input.slice(start,this.position);return this.createLexeme(2,resut)}let result=operatorOrTypeParser.parse(this.input,this.position);return result!==null?(this.position=result.newPosition,this.createLexeme(8258,result.keyword)):(result=keywordParser.parse(this.input,this.position),result!==null?(this.position=result.newPosition,this.createLexeme(2,result.keyword)):null)}};var joinTrie=new KeywordTrie([["join"],["inner","join"],["cross","join"],["left","join"],["left","outer","join"],["right","join"],["right","outer","join"],["full","join"],["full","outer","join"],["natural","join"],["natural","inner","join"],["natural","left","join"],["natural","left","outer","join"],["natural","right","join"],["natural","right","outer","join"],["natural","full","join"],["natural","full","outer","join"],["lateral","join"],["lateral","inner","join"],["lateral","left","join"],["lateral","left","outer","join"]]),keywordTrie=new KeywordTrie([["with"],["recursive"],["materialized"],["not","materialized"],["select"],["from"],["distinct"],["distinct","on"],["where"],["group","by"],["having"],["order","by"],["limit"],["offset"],["fetch"],["first"],["next"],["row"],["row","only"],["rows","only"],["percent"],["percent","with","ties"],["for"],["update"],["share"],["key","share"],["no","key","update"],["union"],["union","all"],["intersect"],["intersect","all"],["except"],["except","all"],["beteen"],["window"],["over"],["partition","by"],["range"],["rows"],["groups"],["within","group"],["with","ordinality"],["current","row"],["unbounded","preceding"],["unbounded","following"],["preceding"],["following"],["on"],["using"],["lateral"],["case"],["case","when"],["when"],["then"],["else"],["end"],["insert","into"],["update"],["delete","from"],["merge","into"],["matched"],["not","matched"],["update","set"],["do","nothing"],["values"],["set"],["returning"],["create","table"],["create","temporary","table"],["tablesample"],["as"],["asc"],["desc"],["nulls","first"],["nulls","last"]]),keywordParser2=new KeywordParser(keywordTrie),joinkeywordParser=new KeywordParser(joinTrie);var CommandTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let keywordJoin=joinkeywordParser.parse(this.input,this.position);if(keywordJoin!==null)return this.position=keywordJoin.newPosition,this.createLexeme(128,keywordJoin.keyword);let keyword=keywordParser2.parse(this.input,this.position);if(keyword!==null){this.position=keyword.newPosition;let lexeme=this.createLexeme(128,keyword.keyword,keyword.comments);return keyword.comments&&keyword.comments.length>0&&(lexeme.positionedComments=[{position:"after",comments:keyword.comments}]),lexeme}if(this.canRead(2)&&this.input[this.position]==="/"&&this.input[this.position+1]==="*"&&this.input[this.position+2]==="+"){this.position+=3;let start=this.position;for(;this.position+1<this.input.length;){if(this.input[this.position]==="*"&&this.input[this.position+1]==="/")return this.position+=2,this.createLexeme(128,"/*+ "+this.input.slice(start,this.position-2).trim()+" */");this.position++}throw new Error(`Block comment is not closed. position: ${this.position}`)}return null}};var STRING_SPECIFIERS=new Set(["e'","E'","x'","X'","b'","B'"]),UNICODE_STRING_SPECIFIERS=new Set(["u&'","U&'"]),StringSpecifierTokenReader=class extends BaseTokenReader{tryRead(previous){let start=this.position;return this.canRead(1)&&STRING_SPECIFIERS.has(this.input.slice(start,start+2))?(this.position+=1,this.createLexeme(4096,this.input.slice(start,this.position))):this.canRead(2)&&UNICODE_STRING_SPECIFIERS.has(this.input.slice(start,start+3))?(this.position+=2,this.createLexeme(4096,this.input.slice(start,this.position))):null}};var trie3=new KeywordTrie([["grouping","sets"],["array"]]),keywordParser3=new KeywordParser(trie3),FunctionTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let keyword=keywordParser3.parse(this.input,this.position);if(keyword!==null)return this.position=keyword.newPosition,this.createLexeme(2048,keyword.keyword);let result=StringUtils.tryReadRegularIdentifier(this.input,this.position);if(!result)return null;this.position=result.newPosition;var shift=StringUtils.readWhiteSpaceAndComment(this.input,this.position).position-this.position;return this.canRead(shift)&&this.input[this.position+shift]==="("?this.createLexeme(2048,result.identifier):null}};var trie4=new KeywordTrie([["double","precision"],["character","varying"],["time","without","time","zone"],["time","with","time","zone"],["timestamp","without","time","zone"],["timestamp","with","time","zone"]]),typeParser=new KeywordParser(trie4),TypeTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let keyword=typeParser.parse(this.input,this.position);if(keyword!==null)return this.position=keyword.newPosition,this.createLexeme(8192,keyword.keyword);if(previous===null)return null;let result=StringUtils.tryReadRegularIdentifier(this.input,this.position);return result?(this.position=result.newPosition,previous.type&128&&previous.value==="as"?this.createLexeme(8256,result.identifier):previous.type&2&&previous.value==="::"?this.createLexeme(8192,result.identifier):null):null}};var EscapedIdentifierTokenReader=class extends BaseTokenReader{tryRead(previous){if(this.isEndOfInput())return null;let char=this.input[this.position];if(char==="`"){let identifier=this.readEscapedIdentifier("`");return this.createLexeme(64,identifier)}if(char==='"'){let identifier=this.readEscapedIdentifier('"');return this.createLexeme(64,identifier)}if(char==="["&&this.isSqlServerBracketIdentifier(previous)){let identifier=this.readEscapedIdentifier("]");return this.createLexeme(64,identifier)}return null}isSqlServerBracketIdentifier(previous){if(previous?.value==="array")return!1;let start=this.position+1,pos=start;for(;pos<this.input.length&&this.input[pos]!=="]";){let char=this.input[pos];if(char===":"||char===","||char==="+"||char==="-"||char==="*"||char==="/"||char==="("||char===")")return!1;pos++}if(pos>=this.input.length)return!1;let content=this.input.slice(start,pos).trim();return content===""?!1:/^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*$/.test(content)}readEscapedIdentifier(delimiter){let start=this.position;this.position++;let foundClosing=!1;for(;this.canRead();){if(this.input[this.position]===delimiter){foundClosing=!0;break}this.position++}if(!foundClosing)throw new Error(`Closing delimiter is not found. position: ${start}, delimiter: ${delimiter}
8
+ ${this.getDebugPositionInfo(start)}`);if(start===this.position)throw new Error(`Closing delimiter is not found. position: ${start}, delimiter: ${delimiter}
9
+ ${this.getDebugPositionInfo(start)}`);return this.position++,this.input.slice(start+1,this.position-1)}};var SqlTokenizer=class _SqlTokenizer{constructor(input){this.input=input,this.position=0,this.readerManager=new TokenReaderManager(input).register(new EscapedIdentifierTokenReader(input)).register(new ParameterTokenReader(input)).register(new StringSpecifierTokenReader(input)).register(new LiteralTokenReader(input)).register(new SpecialSymbolTokenReader(input)).register(new CommandTokenReader(input)).register(new OperatorTokenReader(input)).register(new TypeTokenReader(input)).register(new FunctionTokenReader(input)).register(new IdentifierTokenReader(input))}isEndOfInput(shift=0){return this.position+shift>=this.input.length}canRead(shift=0){return!this.isEndOfInput(shift)}tokenize(options){return options?.preserveFormatting?this.tokenizeWithFormatting():new _SqlTokenizer(this.input).readLexmes()}readLexmes(){return this.tokenizeBasic()}tokenizeBasic(){this.position=0;let tokenData=[],previous=null;for(;this.canRead()&&this.input[this.position]!==";";){let prefixComment=this.readComment(),tokenStartPos=this.position=prefixComment.position,lexeme=this.readerManager.tryRead(this.position,previous);if(lexeme===null)throw new Error(`Unexpected character. actual: ${this.input[this.position]}, position: ${this.position}
10
+ ${this.getDebugPositionInfo(this.position)}`);let tokenEndPos=this.position=this.readerManager.getMaxPosition(),suffixComment=this.readComment();this.position=suffixComment.position,tokenData.push({lexeme,startPos:tokenStartPos,endPos:tokenEndPos,prefixComments:prefixComment.lines,suffixComments:suffixComment.lines}),previous=lexeme}let lexemes=new Array(tokenData.length);for(let i=0;i<tokenData.length;i++){let current=tokenData[i],lexeme=current.lexeme;if(lexeme.value.toLowerCase()==="select"&&current.suffixComments.length>0){let targetIndex=i+1;for(;targetIndex<tokenData.length;){let target=tokenData[targetIndex];if(target.lexeme.type&64||target.lexeme.type&1||!(target.lexeme.type&128)&&!(target.lexeme.type&16)&&!(target.lexeme.type&2)){target.prefixComments.unshift(...current.suffixComments),current.suffixComments=[];break}targetIndex++}}if(lexeme.type&16&&current.suffixComments.length>0){let targetIndex=i+1;targetIndex<tokenData.length&&(tokenData[targetIndex].prefixComments.unshift(...current.suffixComments),current.suffixComments=[])}if((lexeme.value.toLowerCase()==="union"||lexeme.value.toLowerCase()==="intersect"||lexeme.value.toLowerCase()==="except")&&current.suffixComments.length>0){let targetIndex=i+1;for(;targetIndex<tokenData.length;){let target=tokenData[targetIndex];if(target.lexeme.value.toLowerCase()==="select"){target.prefixComments.unshift(...current.suffixComments),current.suffixComments=[];break}targetIndex++}}this.attachCommentsToLexeme(lexeme,current),lexemes[i]=lexeme}return lexemes}attachCommentsToLexeme(lexeme,tokenData){let newPositionedComments=[],allLegacyComments=[];lexeme.positionedComments&&lexeme.positionedComments.length>0&&newPositionedComments.push(...lexeme.positionedComments),tokenData.prefixComments.length>0&&(allLegacyComments.push(...tokenData.prefixComments),newPositionedComments.push({position:"before",comments:[...tokenData.prefixComments]})),tokenData.suffixComments.length>0&&(allLegacyComments.push(...tokenData.suffixComments),newPositionedComments.push({position:"after",comments:[...tokenData.suffixComments]})),newPositionedComments.length>0?(lexeme.positionedComments=newPositionedComments,lexeme.comments=null):allLegacyComments.length>0?(lexeme.comments=allLegacyComments,lexeme.positionedComments=void 0):(lexeme.comments=null,lexeme.positionedComments=void 0)}readComment(){return StringUtils.readWhiteSpaceAndComment(this.input,this.position)}getDebugPositionInfo(errPosition){return StringUtils.getDebugPositionInfo(this.input,errPosition)}tokenizeWithFormatting(){let regularLexemes=this.tokenizeBasic();return this.mapToFormattingLexemes(regularLexemes)}mapToFormattingLexemes(regularLexemes){if(regularLexemes.length===0)return[];let lexemePositions=[],searchPos=0;for(let lexeme of regularLexemes){searchPos=this.skipWhitespaceAndComments(searchPos);let lexemeInfo=this.findLexemeAtPosition(lexeme,searchPos);if(lexemeInfo)lexemePositions.push(lexemeInfo),searchPos=lexemeInfo.endPosition;else{let fallbackInfo={startPosition:searchPos,endPosition:searchPos+lexeme.value.length};lexemePositions.push(fallbackInfo),searchPos=fallbackInfo.endPosition}}let formattingLexemes=[];for(let i=0;i<regularLexemes.length;i++){let lexeme=regularLexemes[i],lexemeInfo=lexemePositions[i],nextLexemeStartPos=i<regularLexemes.length-1?lexemePositions[i+1].startPosition:this.input.length,whitespaceSegment=this.input.slice(lexemeInfo.endPosition,nextLexemeStartPos),inlineComments=this.extractCommentsFromWhitespace(whitespaceSegment),formattingLexeme={...lexeme,followingWhitespace:whitespaceSegment,inlineComments,position:{startPosition:lexemeInfo.startPosition,endPosition:lexemeInfo.endPosition,...this.getLineColumnInfo(lexemeInfo.startPosition,lexemeInfo.endPosition)}};formattingLexemes.push(formattingLexeme)}return formattingLexemes}findLexemeAtPosition(lexeme,expectedPos){if(expectedPos>=this.input.length)return null;let valuesToTry=[lexeme.value,lexeme.value.toUpperCase(),lexeme.value.toLowerCase()];for(let valueToTry of valuesToTry)if(expectedPos+valueToTry.length<=this.input.length&&this.input.substring(expectedPos,expectedPos+valueToTry.length)===valueToTry&&this.isValidLexemeMatch(valueToTry,expectedPos))return{startPosition:expectedPos,endPosition:expectedPos+valueToTry.length};return null}isValidLexemeMatch(value,position){if(position>0){let charBefore=this.input[position-1];if(this.isAlphanumericUnderscore(charBefore))return!1}let endPosition=position+value.length;if(endPosition<this.input.length){let charAfter=this.input[endPosition];if(this.isAlphanumericUnderscore(charAfter))return!1}return!0}isAlphanumericUnderscore(char){let code=char.charCodeAt(0);return code>=48&&code<=57||code>=65&&code<=90||code>=97&&code<=122||code===95}isWhitespace(char){let code=char.charCodeAt(0);return code===32||code===9||code===10||code===13}extractCommentsFromWhitespace(whitespaceSegment){let inlineComments=[],pos=0;for(;pos<whitespaceSegment.length;){let oldPos=pos,result=StringUtils.readWhiteSpaceAndComment(whitespaceSegment,pos);result.lines.length>0&&inlineComments.push(...result.lines),pos=result.position,pos===oldPos&&pos++}return inlineComments}skipWhitespaceAndComments(pos){let currentPos=pos;for(;currentPos<this.input.length;){let char=this.input[currentPos];if(this.isWhitespace(char)){currentPos++;continue}if(currentPos<this.input.length-1&&this.input[currentPos]==="-"&&this.input[currentPos+1]==="-"){for(;currentPos<this.input.length&&this.input[currentPos]!==`
11
+ `&&this.input[currentPos]!=="\r";)currentPos++;continue}if(currentPos<this.input.length-1&&this.input[currentPos]==="/"&&this.input[currentPos+1]==="*"){for(currentPos+=2;currentPos<this.input.length-1;){if(this.input[currentPos]==="*"&&this.input[currentPos+1]==="/"){currentPos+=2;break}currentPos++}continue}break}return currentPos}getLineColumnInfo(startPos,endPos){let startInfo=this.getLineColumn(startPos),endInfo=this.getLineColumn(endPos);return{startLine:startInfo.line,startColumn:startInfo.column,endLine:endInfo.line,endColumn:endInfo.column}}getLineColumn(position){let line=1,column=1;for(let i=0;i<Math.min(position,this.input.length);i++)this.input[i]===`
12
+ `?(line++,column=1):column++;return{line,column}}};var FullNameParser=class _FullNameParser{static parseFromLexeme(lexemes,index){let{identifiers,newIndex}=_FullNameParser.parseEscapedOrDotSeparatedIdentifiers(lexemes,index),{namespaces,name}=_FullNameParser.extractNamespacesAndName(identifiers),identifierString=new IdentifierString(name);if(newIndex>index){let lastLexeme=lexemes[newIndex-1];lastLexeme.positionedComments&&lastLexeme.positionedComments.length>0?identifierString.positionedComments=lastLexeme.positionedComments:lastLexeme.comments&&lastLexeme.comments.length>0}let lastTokenType=0;return newIndex>index&&(lastTokenType=lexemes[newIndex-1].type),{namespaces,name:identifierString,newIndex,lastTokenType}}static parse(str){let lexemes=new SqlTokenizer(str).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The name is complete but additional tokens were found.`);return{namespaces:result.namespaces,name:result.name}}static parseEscapedOrDotSeparatedIdentifiers(lexemes,index){let idx=index,identifiers=[];for(;idx<lexemes.length;){if(lexemes[idx].type&512){if(idx++,idx>=lexemes.length||!(lexemes[idx].type&64||lexemes[idx].type&128))throw new Error(`Expected identifier after '[' at position ${idx}`);if(identifiers.push(lexemes[idx].value),idx++,idx>=lexemes.length||lexemes[idx].value!=="]")throw new Error(`Expected closing ']' after identifier at position ${idx}`);idx++}else if(lexemes[idx].type&64)identifiers.push(lexemes[idx].value),idx++;else if(lexemes[idx].type&2048)identifiers.push(lexemes[idx].value),idx++;else if(lexemes[idx].type&8192)identifiers.push(lexemes[idx].value),idx++;else if(lexemes[idx].value==="*"){identifiers.push(lexemes[idx].value),idx++;break}if(idx<lexemes.length&&lexemes[idx].type&32)idx++;else break}return{identifiers,newIndex:idx}}static extractNamespacesAndName(identifiers){if(!identifiers||identifiers.length===0)throw new Error("Identifier list is empty");return identifiers.length===1?{namespaces:null,name:identifiers[0]}:{namespaces:identifiers.slice(0,-1),name:identifiers[identifiers.length-1]}}};var IdentifierParser=class{static parseFromLexeme(lexemes,index){let{namespaces,name,newIndex}=FullNameParser.parseFromLexeme(lexemes,index);return{value:new ColumnReference(namespaces,name),newIndex}}};var LiteralParser=class{static parseFromLexeme(lexemes,index){let idx=index,valueText=lexemes[idx].value,parsedValue,lex=literalKeywordParser.parse(valueText.toLowerCase(),0);if(lex){let value=new RawString(lex.keyword);return idx++,{value,newIndex:idx}}if(/^[+-]?\d+(\.\d+)?([eE][+-]?\d+)?$/.test(valueText))return parsedValue=Number(valueText),idx++,{value:new LiteralValue(parsedValue),newIndex:idx};{/^\$[^$]*\$[\s\S]*\$[^$]*\$$/.test(valueText)?parsedValue=valueText:valueText.startsWith("'")&&valueText.endsWith("'")?parsedValue=valueText.slice(1,-1):parsedValue=valueText;let isStringLiteral=valueText.startsWith("'")&&valueText.endsWith("'");return idx++,{value:new LiteralValue(parsedValue,void 0,isStringLiteral),newIndex:idx}}}};var ParenExpressionParser=class{static parseFromLexeme(lexemes,index){let idx=index;if(idx+1<lexemes.length&&lexemes[idx].type&4&&(lexemes[idx+1].value==="select"||lexemes[idx+1].value==="values"||lexemes[idx+1].value==="with")){let openLexeme=lexemes[idx],openPositionedComments=openLexeme.positionedComments?openLexeme.positionedComments.map(comment=>({position:comment.position,comments:[...comment.comments]})):null,openLegacyComments=openLexeme.comments?[...openLexeme.comments]:null;idx+=1;let result2=SelectQueryParser.parseFromLexeme(lexemes,idx);if(idx=result2.newIndex,idx>=lexemes.length||lexemes[idx].type!==8)throw new Error(`Expected ')' at index ${idx}, but found ${lexemes[idx].value}`);let closingLexeme=lexemes[idx],closingLegacyComments=closingLexeme.comments,closingPositionedComments=closingLexeme.positionedComments;idx++;let value2=new InlineQuery(result2.value);if(openPositionedComments&&openPositionedComments.length>0){let beforeComments=openPositionedComments.filter(comment=>comment.position==="after"&&comment.comments.length>0).map(comment=>({position:"before",comments:[...comment.comments]}));beforeComments.length>0&&(value2.positionedComments=value2.positionedComments?[...beforeComments,...value2.positionedComments]:beforeComments)}else if(openLegacyComments&&openLegacyComments.length>0){let beforeCommentBlock={position:"before",comments:[...openLegacyComments]};value2.positionedComments=value2.positionedComments?[beforeCommentBlock,...value2.positionedComments]:[beforeCommentBlock]}if(closingPositionedComments&&closingPositionedComments.length>0){let afterComments=closingPositionedComments.filter(comment=>comment.position==="after"&&comment.comments.length>0).map(comment=>({position:comment.position,comments:[...comment.comments]}));afterComments.length>0&&(value2.positionedComments=value2.positionedComments?[...value2.positionedComments,...afterComments]:afterComments)}else closingLegacyComments&&closingLegacyComments.length>0&&(value2.comments=closingLegacyComments);return{value:value2,newIndex:idx}}let result=ValueParser.parseArgument(4,8,lexemes,index);return idx=result.newIndex,{value:new ParenExpression(result.value),newIndex:idx}}};var UnaryExpressionParser=class{static parseFromLexeme(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].type&2){let operatorLexeme=lexemes[idx],operator=operatorLexeme.value;if(idx++,operator==="*")return{value:new ColumnReference(null,"*"),newIndex:idx};let result=ValueParser.parseFromLexeme(lexemes,idx);idx=result.newIndex;let value=new UnaryExpression(operator,result.value);return operatorLexeme.positionedComments&&operatorLexeme.positionedComments.length>0?value.positionedComments=operatorLexeme.positionedComments:operatorLexeme.comments&&operatorLexeme.comments.length>0&&(value.comments=operatorLexeme.comments),{value,newIndex:idx}}throw new Error(`Invalid unary expression at index ${index}: ${lexemes[index].value}`)}};var ParameterExpressionParser=class{static parseFromLexeme(lexemes,index){let idx=index,paramName=lexemes[idx].value;paramName.startsWith("${")&&paramName.endsWith("}")?paramName=paramName.slice(2,-1):paramName=paramName.slice(1);let value=new ParameterExpression(paramName);return idx++,{value,newIndex:idx}}};var StringSpecifierExpressionParser=class{static parseFromLexeme(lexemes,index){let idx=index,specifer=lexemes[idx].value;if(idx++,idx>=lexemes.length||lexemes[idx].type!==1)throw new Error(`Expected string literal after string specifier at index ${idx}`);let value=lexemes[idx].value;return idx++,{value:new StringSpecifierExpression(specifer,value),newIndex:idx}}};var CommandExpressionParser=class _CommandExpressionParser{static parseFromLexeme(lexemes,index){let idx=index,current=lexemes[idx];if(current.value==="case"){let caseKeywordComments=current.comments,caseKeywordPositionedComments=current.positionedComments;return idx++,this.parseCaseExpression(lexemes,idx,caseKeywordComments,caseKeywordPositionedComments)}else if(current.value==="case when"){let caseWhenKeywordComments=current.comments,caseWhenKeywordPositionedComments=current.positionedComments;return idx++,this.parseCaseWhenExpression(lexemes,idx,caseWhenKeywordComments,caseWhenKeywordPositionedComments)}return this.parseModifierUnaryExpression(lexemes,idx)}static parseModifierUnaryExpression(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].type&128){let command=lexemes[idx].value;idx++;let result=ValueParser.parseFromLexeme(lexemes,idx);return{value:new UnaryExpression(command,result.value),newIndex:result.newIndex}}throw new Error(`Invalid modifier unary expression at index ${idx}, Lexeme: ${lexemes[idx].value}`)}static parseCaseExpression(lexemes,index,caseKeywordComments,caseKeywordPositionedComments){let idx=index,condition=ValueParser.parseFromLexeme(lexemes,idx);idx=condition.newIndex;let switchCaseResult=this.parseSwitchCaseArgument(lexemes,idx,[]);idx=switchCaseResult.newIndex;let result=new CaseExpression(condition.value,switchCaseResult.value);return caseKeywordPositionedComments&&caseKeywordPositionedComments.length>0?result.positionedComments=caseKeywordPositionedComments:caseKeywordComments&&caseKeywordComments.length>0&&(result.positionedComments=[_CommandExpressionParser.convertLegacyToPositioned(caseKeywordComments,"before")]),{value:result,newIndex:idx}}static parseCaseWhenExpression(lexemes,index,caseWhenKeywordComments,caseWhenKeywordPositionedComments){let idx=index,casewhenResult=this.parseCaseConditionValuePair(lexemes,idx);idx=casewhenResult.newIndex;let caseWhenList=[casewhenResult.value],switchCaseResult=this.parseSwitchCaseArgument(lexemes,idx,caseWhenList);idx=switchCaseResult.newIndex;let result=new CaseExpression(null,switchCaseResult.value);return caseWhenKeywordPositionedComments&&caseWhenKeywordPositionedComments.length>0?result.positionedComments=caseWhenKeywordPositionedComments:caseWhenKeywordComments&&caseWhenKeywordComments.length>0&&(result.positionedComments=[_CommandExpressionParser.convertLegacyToPositioned(caseWhenKeywordComments,"before")]),{value:result,newIndex:idx}}static parseSwitchCaseArgument(lexemes,index,initialWhenThenList){let idx=index,whenThenList=[...initialWhenThenList];idx=this.parseAdditionalWhenClauses(lexemes,idx,whenThenList);let{elseValue,elseComments,newIndex:elseIndex}=this.parseElseClause(lexemes,idx);idx=elseIndex;let{endComments,newIndex:endIndex}=this.parseEndClause(lexemes,idx);if(idx=endIndex,whenThenList.length===0)throw new Error(`The CASE expression requires at least one WHEN clause (index ${idx})`);let switchCaseArg=new SwitchCaseArgument(whenThenList,elseValue);return this.applySwitchCaseComments(switchCaseArg,elseComments,endComments),{value:switchCaseArg,newIndex:idx}}static parseAdditionalWhenClauses(lexemes,index,whenThenList){let idx=index;for(;idx<lexemes.length&&this.isCommandWithValue(lexemes[idx],"when");){idx++;let whenResult=this.parseCaseConditionValuePair(lexemes,idx);idx=whenResult.newIndex,whenThenList.push(whenResult.value)}return idx}static parseElseClause(lexemes,index){let elseValue=null,elseComments=null,idx=index;if(idx<lexemes.length&&this.isCommandWithValue(lexemes[idx],"else")){elseComments=this.extractKeywordComments(lexemes[idx]),idx++;let elseResult=ValueParser.parseFromLexeme(lexemes,idx);elseValue=elseResult.value,idx=elseResult.newIndex}return{elseValue,elseComments,newIndex:idx}}static parseEndClause(lexemes,index){let idx=index,endComments=null;if(idx<lexemes.length&&this.isCommandWithValue(lexemes[idx],"end"))endComments=this.extractKeywordComments(lexemes[idx]),idx++;else throw new Error(`The CASE expression requires 'end' keyword at the end (index ${idx})`);return{endComments,newIndex:idx}}static extractKeywordComments(token){return{legacy:token.comments,positioned:token.positionedComments}}static applySwitchCaseComments(switchCaseArg,elseComments,endComments){let allPositionedComments=[],allLegacyComments=[];elseComments?.positioned&&elseComments.positioned.length>0&&allPositionedComments.push(...elseComments.positioned),elseComments?.legacy&&elseComments.legacy.length>0&&allLegacyComments.push(...elseComments.legacy),endComments?.positioned&&endComments.positioned.length>0&&allPositionedComments.push(...endComments.positioned),endComments?.legacy&&endComments.legacy.length>0&&allLegacyComments.push(...endComments.legacy),allPositionedComments.length>0?switchCaseArg.positionedComments=allPositionedComments:allLegacyComments.length>0&&(switchCaseArg.positionedComments=[_CommandExpressionParser.convertLegacyToPositioned(allLegacyComments,"after")])}static isCommandWithValue(lexeme,value){return(lexeme.type&128)!==0&&lexeme.value===value}static parseCaseConditionValuePair(lexemes,index){let idx=index,condition=ValueParser.parseFromLexeme(lexemes,idx);if(idx=condition.newIndex,idx>=lexemes.length||!(lexemes[idx].type&128)||lexemes[idx].value!=="then")throw new Error(`Expected 'then' after WHEN condition at index ${idx}`);let thenKeywordComments=lexemes[idx].comments,thenKeywordPositionedComments=lexemes[idx].positionedComments;idx++;let value=ValueParser.parseFromLexeme(lexemes,idx);idx=value.newIndex;let keyValuePair=new CaseKeyValuePair(condition.value,value.value);return thenKeywordPositionedComments&&thenKeywordPositionedComments.length>0?keyValuePair.positionedComments=thenKeywordPositionedComments:thenKeywordComments&&thenKeywordComments.length>0&&(keyValuePair.positionedComments=[_CommandExpressionParser.convertLegacyToPositioned(thenKeywordComments,"after")]),{value:keyValuePair,newIndex:idx}}static convertLegacyToPositioned(legacyComments,position="before"){return{position,comments:legacyComments}}};var OrderByClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The ORDER BY clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="order by")throw new Error(`Syntax error at position ${idx}: Expected 'ORDER BY' keyword but found "${lexemes[idx].value}". ORDER BY clauses must start with the ORDER BY keywords.`);idx++;let items=[],item=this.parseItem(lexemes,idx);for(items.push(item.value),idx=item.newIndex;idx<lexemes.length&&lexemes[idx].type&16;){idx++;let item2=this.parseItem(lexemes,idx);items.push(item2.value),idx=item2.newIndex}if(items.length===0)throw new Error(`Syntax error at position ${index}: No ordering expressions found. The ORDER BY clause requires at least one expression to order by.`);return{value:new OrderByClause(items),newIndex:idx}}static parseItem(lexemes,index){let idx=index,parsedValue=ValueParser.parseFromLexeme(lexemes,idx),value=parsedValue.value;if(idx=parsedValue.newIndex,idx>=lexemes.length)return{value,newIndex:idx};let sortDirectionComments=null,sortDirection=null;if(idx<lexemes.length){let token=lexemes[idx];if(token.value==="asc"?(sortDirection="asc",idx++):token.value==="desc"&&(sortDirection="desc",idx++),sortDirection!==null){if(token.positionedComments&&token.positionedComments.length>0){sortDirectionComments=[];for(let posComment of token.positionedComments)posComment.comments&&posComment.comments.length>0&&sortDirectionComments.push(...posComment.comments)}token.comments&&token.comments.length>0&&(sortDirectionComments||(sortDirectionComments=[]),sortDirectionComments.push(...token.comments))}}let nullsSortDirection=idx>=lexemes.length?null:lexemes[idx].value==="nulls first"?(idx++,"first"):lexemes[idx].value==="nulls last"?(idx++,"last"):null;return sortDirectionComments&&sortDirectionComments.length>0&&(value.comments?value.comments.push(...sortDirectionComments):value.comments=sortDirectionComments),sortDirection===null&&nullsSortDirection===null?{value,newIndex:idx}:{value:new OrderByItem(value,sortDirection,nullsSortDirection),newIndex:idx}}};var PartitionByParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The PARTITION BY clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="partition by")throw new Error(`Syntax error at position ${idx}: Expected 'PARTITION BY' keyword but found "${lexemes[idx].value}". PARTITION BY clauses must start with the PARTITION BY keywords.`);idx++;let items=[],item=ValueParser.parseFromLexeme(lexemes,idx);for(items.push(item.value),idx=item.newIndex;idx<lexemes.length&&lexemes[idx].type&16;){idx++;let item2=ValueParser.parseFromLexeme(lexemes,idx);items.push(item2.value),idx=item2.newIndex}if(items.length===0)throw new Error(`Syntax error at position ${index}: No partition expressions found. The PARTITION BY clause requires at least one expression to partition by.`);return items.length===1?{value:new PartitionByClause(items[0]),newIndex:idx}:{value:new PartitionByClause(new ValueList(items)),newIndex:idx}}};var WindowExpressionParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The window frame expression is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].type!==4)throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis '(' but found "${lexemes[idx].value}".`);idx++;let partition=null,order=null,frameSpec=null;if(idx<lexemes.length&&lexemes[idx].value==="partition by"){let partitionResult=PartitionByParser.parseFromLexeme(lexemes,idx);partition=partitionResult.value,idx=partitionResult.newIndex}if(idx<lexemes.length&&lexemes[idx].value==="order by"){let orderResult=OrderByClauseParser.parseFromLexeme(lexemes,idx);order=orderResult.value,idx=orderResult.newIndex}if(idx<lexemes.length&&this.isFrameTypeKeyword(lexemes[idx].value)){let frameSpecResult=this.parseFrameSpec(lexemes,idx);frameSpec=frameSpecResult.value,idx=frameSpecResult.newIndex}if(idx>=lexemes.length||lexemes[idx].type!==8)throw new Error(`Syntax error at position ${idx}: Missing closing parenthesis ')' for window frame. Each opening parenthesis must have a matching closing parenthesis.`);return idx++,{value:new WindowFrameExpression(partition,order,frameSpec),newIndex:idx}}static isFrameTypeKeyword(value){let lowerValue=value;return lowerValue==="rows"||lowerValue==="range"||lowerValue==="groups"}static parseFrameSpec(lexemes,index){let idx=index,frameTypeStr=lexemes[idx].value,frameType;switch(frameTypeStr){case"rows":frameType="rows";break;case"range":frameType="range";break;case"groups":frameType="groups";break;default:throw new Error(`Syntax error at position ${idx}: Invalid frame type "${lexemes[idx].value}". Expected one of: ROWS, RANGE, GROUPS.`)}if(idx++,idx<lexemes.length&&lexemes[idx].value==="between"){idx++;let startBoundResult=this.parseFrameBoundary(lexemes,idx),startBound=startBoundResult.value;if(idx=startBoundResult.newIndex,idx>=lexemes.length||lexemes[idx].value!=="and")throw new Error(`Syntax error at position ${idx}: Expected 'AND' keyword in BETWEEN clause.`);idx++;let endBoundResult=this.parseFrameBoundary(lexemes,idx),endBound=endBoundResult.value;return idx=endBoundResult.newIndex,{value:new WindowFrameSpec(frameType,startBound,endBound),newIndex:idx}}else{let boundaryResult=this.parseFrameBoundary(lexemes,idx),startBound=boundaryResult.value;return idx=boundaryResult.newIndex,{value:new WindowFrameSpec(frameType,startBound,null),newIndex:idx}}}static parseFrameBoundary(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].type&128){let currentValue=lexemes[idx].value,frameBound;switch(currentValue){case"current row":frameBound="current row";break;case"unbounded preceding":frameBound="unbounded preceding";break;case"unbounded following":frameBound="unbounded following";break;default:throw new Error(`Syntax error at position ${idx}: Invalid frame type "${lexemes[idx].value}". Expected one of: ROWS, RANGE, GROUPS.`)}return{value:new WindowFrameBoundStatic(frameBound),newIndex:idx+1}}else if(idx<lexemes.length&&lexemes[idx].type&1){let valueResult=ValueParser.parseFromLexeme(lexemes,idx);if(idx=valueResult.newIndex,idx<lexemes.length&&lexemes[idx].type&128){let direction=lexemes[idx].value,isFollowing;if(direction==="preceding")isFollowing=!1;else if(direction==="following")isFollowing=!0;else throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);return idx++,{value:new WindowFrameBoundaryValue(valueResult.value,isFollowing),newIndex:idx}}else throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`)}throw new Error(`Syntax error at position ${idx}: Expected a valid frame boundary component.`)}};var OverExpressionParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The OVER expression is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="over")throw new Error(`Syntax error at position ${idx}: Expected 'OVER' keyword but found "${lexemes[idx].value}". OVER expressions must start with the OVER keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'OVER' keyword. Expected either a window name or an opening parenthesis '('.");if(lexemes[idx].type&64){let name=lexemes[idx].value;return idx++,{value:new IdentifierString(name),newIndex:idx}}if(lexemes[idx].type&4)return WindowExpressionParser.parseFromLexeme(lexemes,idx);throw new Error(`Syntax error at position ${idx}: Expected a window name or opening parenthesis '(' after OVER keyword, but found "${lexemes[idx].value}".`)}};var ParseError=class _ParseError extends Error{constructor(message,index,context){super(message);this.index=index;this.context=context;this.name="ParseError"}static fromUnparsedLexemes(lexemes,index,messagePrefix){let start=Math.max(0,index-2),end=Math.min(lexemes.length,index+3),context=lexemes.slice(start,end).map((lexeme,idx)=>{let marker=idx+start===index?">":" ",typeName=TokenType[lexeme.type]||lexeme.type;return`${marker} ${idx+start}:${lexeme.value} [${typeName}]`}).join(`
13
+ `),message=`${messagePrefix} Unparsed lexeme remains at index ${index}: ${lexemes[index].value}
14
14
  Context:
15
- ${o}`;return new a(l,n,o)}};var qe=class{static{this.AGGREGATE_FUNCTIONS_WITH_ORDER_BY=new Set(["string_agg","array_agg","json_agg","jsonb_agg","json_object_agg","jsonb_object_agg","xmlagg"])}static parseArrayExpression(e,t){let n=t;if(n+1<e.length&&e[n+1].type&512){n++;let i=k.parseArgument(512,1024,e,n);return n=i.newIndex,{value:new ye(i.value),newIndex:n}}else if(n+1<e.length&&e[n+1].type&4){n++,n++;let i=A.parseFromLexeme(e,n);return n=i.newIndex,n++,{value:new ve(i.value),newIndex:n}}throw new Error(`Invalid ARRAY syntax at index ${n}, expected ARRAY[... or ARRAY(...)`)}static parseFromLexeme(e,t){let n=t,i=e[n];return i.value==="array"?this.parseArrayExpression(e,n):i.value==="substring"||i.value==="overlay"?this.parseKeywordFunction(e,n,[{key:"from",required:!1},{key:"for",required:!1}]):i.value==="cast"?this.parseKeywordFunction(e,n,[{key:"as",required:!0}]):i.value==="trim"?this.parseKeywordFunction(e,n,[{key:"from",required:!1}]):this.parseFunctionCall(e,n)}static tryParseBinaryExpression(e,t,n,i=!0,s=!0){let r=t;if(r<e.length&&e[r].type&2){let o=e[r].value.toLowerCase();if(!i&&o==="and"||!s&&o==="or")return null;if(r++,o==="between")return this.parseBetweenExpression(e,r,n,!1);if(o==="not between")return this.parseBetweenExpression(e,r,n,!0);if(o==="::"){let c=this.parseTypeValue(e,r);return r=c.newIndex,{value:new ce(n,c.value),newIndex:r}}let l=k.parseFromLexeme(e,r);return r=l.newIndex,{value:new S(n,o,l.value),newIndex:r}}return null}static parseBetweenExpression(e,t,n,i){let s=t,r=k.parseFromLexeme(e,s,!1);if(s=r.newIndex,s<e.length&&e[s].type&2&&e[s].value!=="and")throw new Error(`Expected 'and' after 'between' at index ${s}`);s++;let o=this.parseBetweenUpperBound(e,s);return s=o.newIndex,{value:new we(n,r.value,o.value,i),newIndex:s}}static parseBetweenUpperBound(e,t){return k.parseFromLexeme(e,t,!1,!1)}static parseFunctionCall(e,t){let n=t,i=Me.parseFromLexeme(e,n),s=i.namespaces,r=i.name;if(n=i.newIndex,n<e.length&&e[n].type&4){let o=r.name.toLowerCase(),l,u=null,c=null;if(this.AGGREGATE_FUNCTIONS_WITH_ORDER_BY.has(o)){let h=this.parseAggregateArguments(e,n);l={value:h.arguments,newIndex:h.newIndex},c=h.orderByClause,u=h.closingComments}else{let h=this.parseArgumentWithComments(e,n);l={value:h.value,newIndex:h.newIndex},u=h.closingComments}n=l.newIndex;let p=null;if(n<e.length&&e[n].value==="within group"){let h=this.parseWithinGroupClause(e,n);p=h.value,n=h.newIndex}let d=!1;if(n<e.length&&e[n].value==="with ordinality"&&(d=!0,n++),n<e.length&&e[n].value==="over"){let h=qt.parseFromLexeme(e,n);n=h.newIndex;let C=new U(s,r.name,l.value,h.value,p,d,c);return u&&u.length>0,{value:C,newIndex:n}}else{let h=new U(s,r.name,l.value,null,p,d,c);return u&&u.length>0,{value:h,newIndex:n}}}else throw be.fromUnparsedLexemes(e,n,`Expected opening parenthesis after function name '${r.name}'.`)}static parseKeywordFunction(e,t,n){let i=t,s=Me.parseFromLexeme(e,i),r=s.namespaces,o=s.name;if(i=s.newIndex,i<e.length&&e[i].type&4){i++;let l=k.parseFromLexeme(e,i),u=l.value;if(i=l.newIndex,i<e.length&&e[i].type&16)return this.parseFunctionCall(e,t);for(let{key:c,required:p}of n)if(i<e.length&&e[i].type&128&&e[i].value===c)if(i++,i<e.length&&e[i].type&8192){let d=this.parseTypeValue(e,i);u=new S(u,c,d.value),i=d.newIndex}else{let d=k.parseFromLexeme(e,i);u=new S(u,c,d.value),i=d.newIndex}else if(p)throw be.fromUnparsedLexemes(e,i,`Keyword '${c}' is required for ${o.name} function.`);if(i<e.length&&e[i].type&8){i++;let c=null;if(i<e.length&&e[i].value==="within group"){let d=this.parseWithinGroupClause(e,i);c=d.value,i=d.newIndex}let p=!1;if(i<e.length&&e[i].value==="with ordinality"&&(p=!0,i++),i<e.length&&e[i].value==="over"){i++;let d=qt.parseFromLexeme(e,i);return i=d.newIndex,{value:new U(r,o.name,u,d.value,c,p,null),newIndex:i}}else return{value:new U(r,o.name,u,null,c,p,null),newIndex:i}}else throw be.fromUnparsedLexemes(e,i,`Missing closing parenthesis for function '${o.name}'.`)}else throw be.fromUnparsedLexemes(e,i,`Missing opening parenthesis for function '${o.name}'.`)}static parseTypeValue(e,t){let n=t,{namespaces:i,name:s,newIndex:r}=Me.parseFromLexeme(e,n);if(n=r,n<e.length&&e[n].type&4){let o=k.parseArgument(4,8,e,n);n=o.newIndex;let l=new Re(i,new V(s.name),o.value);return o.value.positionedComments&&(l.positionedComments=o.value.positionedComments),o.value.comments,{value:l,newIndex:n}}else return{value:new Re(i,new V(s.name)),newIndex:n}}static parseWithinGroupClause(e,t){let n=t;if(n>=e.length||e[n].value!=="within group")throw new Error(`Expected 'WITHIN GROUP' at index ${n}`);if(n++,n>=e.length||!(e[n].type&4))throw new Error(`Expected '(' after 'WITHIN GROUP' at index ${n}`);n++;let i=it.parseFromLexeme(e,n);if(n=i.newIndex,n>=e.length||!(e[n].type&8))throw new Error(`Expected ')' after WITHIN GROUP ORDER BY clause at index ${n}`);return n++,{value:i.value,newIndex:n}}static parseAggregateArguments(e,t){let n=t,i=[],s=null;if(n>=e.length||!(e[n].type&4))throw be.fromUnparsedLexemes(e,n,"Expected opening parenthesis.");if(n++,n<e.length&&e[n].type&8){let u=e[n].comments;return n++,{arguments:new D([]),orderByClause:null,closingComments:u,newIndex:n}}if(n<e.length&&e[n].value==="*"){let u=new b(null,"*");if(n++,n<e.length&&e[n].type&8){let c=e[n].comments;return n++,{arguments:u,orderByClause:null,closingComments:c,newIndex:n}}else throw be.fromUnparsedLexemes(e,n,"Expected closing parenthesis after wildcard '*'.")}let r=k.parseFromLexeme(e,n);for(n=r.newIndex,i.push(r.value);n<e.length&&(e[n].type&16||e[n].value==="order by");){if(e[n].value==="order by"){let u=it.parseFromLexeme(e,n);n=u.newIndex,s=u.value;break}if(e[n].type&16){if(n++,n<e.length&&e[n].value==="order by"){let c=it.parseFromLexeme(e,n);n=c.newIndex,s=c.value;break}let u=k.parseFromLexeme(e,n);n=u.newIndex,i.push(u.value)}}if(n>=e.length||!(e[n].type&8))throw be.fromUnparsedLexemes(e,n,"Expected closing parenthesis.");let o=e[n].comments;return n++,{arguments:i.length===1?i[0]:new D(i),orderByClause:s,closingComments:o,newIndex:n}}static parseArgumentWithComments(e,t){let n=t;if(n>=e.length||!(e[n].type&4))throw be.fromUnparsedLexemes(e,n,"Expected opening parenthesis.");let i=e[n];n++;let s=[];if(n<e.length&&e[n].type&8){let u=e[n].comments;return n++,{value:new D([]),closingComments:u,newIndex:n}}if(n<e.length&&e[n].value==="*"){let u=new b(null,"*");if(n++,n>=e.length||!(e[n].type&8))throw be.fromUnparsedLexemes(e,n,"Expected closing parenthesis after wildcard '*'.");let c=e[n].comments;return n++,{value:u,closingComments:c,newIndex:n}}let r=k.parseFromLexeme(e,n);if(n=r.newIndex,i.positionedComments&&i.positionedComments.length>0){let u=i.positionedComments.filter(c=>c.position==="after");if(u.length>0){let c=u.map(p=>({position:"before",comments:p.comments}));r.value.positionedComments=[...c,...r.value.positionedComments||[]],r.value,"qualifiedName"in r.value&&r.value.qualifiedName&&"name"in r.value.qualifiedName&&r.value.qualifiedName.name&&(r.value.qualifiedName.name.positionedComments=null,r.value.qualifiedName.name)}}for(s.push(r.value);n<e.length&&e[n].type&16;){n++;let u=k.parseFromLexeme(e,n);n=u.newIndex,s.push(u.value)}if(n>=e.length||!(e[n].type&8))throw be.fromUnparsedLexemes(e,n,"Expected closing parenthesis.");let o=e[n].comments;return n++,{value:s.length===1?s[0]:new D(s),closingComments:o,newIndex:n}}};var yt=class{static{this.precedenceMap={or:1,and:2,"=":10,"!=":10,"<>":10,"<":10,"<=":10,">":10,">=":10,like:10,ilike:10,"not like":10,"not ilike":10,"similar to":10,"not similar to":10,in:10,"not in":10,is:10,"is not":10,"->":10,"->>":10,"#>":10,"#>>":10,"@>":10,"<@":10,"?":10,"?|":10,"?&":10,"~":10,"~*":10,"!~":10,"!~*":10,rlike:10,regexp:10,mod:30,xor:2,between:15,"not between":15,"+":20,"-":20,"*":30,"/":30,"%":30,"^":40,"::":50,"unary+":100,"unary-":100,not:100}}static getPrecedence(e){let t=this.precedenceMap[e.toLowerCase()];return t!==void 0?t:0}static hasHigherOrEqualPrecedence(e,t){return this.getPrecedence(e)>=this.getPrecedence(t)}static isLogicalOperator(e){let t=e.toLowerCase();return t==="and"||t==="or"}static isBetweenOperator(e){let t=e.toLowerCase();return t==="between"||t==="not between"}static isComparisonOperator(e){let t=e.toLowerCase();return["=","!=","<>","<",">","<=",">=","like","ilike","similar to","in","not in","->","->>","#>","#>>","@>","<@","?","?|","?&","~","~*","!~","!~*","rlike","regexp"].includes(t)}};var k=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw be.fromUnparsedLexemes(n,i.newIndex,"[ValueParser]");return i.value}static parseFromLexeme(e,t,n=!0,i=!0){return this.parseExpressionWithPrecedence(e,t,0,n,i)}static parseExpressionWithPrecedence(e,t,n,i=!0,s=!0){let r=t,o=e[r].comments,l=e[r].positionedComments,u=this.parseItem(e,r);l&&l.length>0&&!u.value.positionedComments?u.value.positionedComments=l:u.value.comments===null&&o&&o.length>0&&(u.value.comments=o),r=u.newIndex;let c=u.value,p=this.parseArrayAccess(e,r,c);for(c=p.value,r=p.newIndex;r<e.length&&e[r].type&2;){let d=e[r],h=d.value;if(!i&&h.toLowerCase()==="and"||!s&&h.toLowerCase()==="or")break;let C=yt.getPrecedence(h);if(C<n)break;if(r++,yt.isBetweenOperator(h)){let E=qe.parseBetweenExpression(e,r,c,h.toLowerCase().includes("not"));c=E.value,r=E.newIndex;continue}if(h==="::"){let E=qe.parseTypeValue(e,r);c=new ce(c,E.value),r=E.newIndex;continue}let f=C+1,J=this.parseExpressionWithPrecedence(e,r,f,i,s);r=J.newIndex;let H=new S(c,h,J.value);d.comments&&d.comments.length>0&&(H.operator.comments=d.comments),d.positionedComments&&d.positionedComments.length>0&&(H.operator.positionedComments=d.positionedComments),c=H}return{value:c,newIndex:r}}static transferPositionedComments(e,t){e.positionedComments&&e.positionedComments.length>0&&!t.positionedComments?t.positionedComments=e.positionedComments:t.comments===null&&e.comments&&e.comments.length>0&&(t.comments=e.comments)}static parseItem(e,t){let n=t;if(n>=e.length)throw new Error(`Unexpected end of lexemes at index ${t}`);let i=e[n];if(i.type&64&&i.type&2&&i.type&8192){if(n+1<e.length&&e[n+1].type&4)if(this.isTypeConstructor(e,n+1,i.value)){let o=qe.parseTypeValue(e,n);return this.transferPositionedComments(i,o.value),{value:o.value,newIndex:o.newIndex}}else{let o=qe.parseFromLexeme(e,n);return this.transferPositionedComments(i,o.value),o}let s=wn.parseFromLexeme(e,n);if(s.newIndex>=e.length)return this.transferPositionedComments(i,s.value),s;if(e[s.newIndex].type&1){let o=_t.parseFromLexeme(e,s.newIndex),l=new ne(e[n].value,o.value);return this.transferPositionedComments(i,l),{value:l,newIndex:o.newIndex}}return this.transferPositionedComments(i,s.value),s}else if(i.type&64){let{namespaces:s,name:r,newIndex:o}=Me.parseFromLexeme(e,n);if(e[o-1].type&2048){let u=qe.parseFromLexeme(e,n);return this.transferPositionedComments(i,u.value),u}else if(e[o-1].type&8192)if(o<e.length&&e[o].type&4)if(this.isTypeConstructor(e,o,r.name)){let u=qe.parseTypeValue(e,n);return this.transferPositionedComments(i,u.value),{value:u.value,newIndex:u.newIndex}}else{let u=qe.parseFromLexeme(e,n);return this.transferPositionedComments(i,u.value),u}else{let u=new Re(s,r);return this.transferPositionedComments(i,u),{value:u,newIndex:o}}let l=new b(s,r);return this.transferPositionedComments(i,l),{value:l,newIndex:o}}else if(i.type&1){let s=_t.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&4){let s=Sn.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&2048){let s=qe.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&2){let s=bn.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&256){let s=En.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&4096){let s=xn.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&128){let s=Tn.parseFromLexeme(e,n);return this.transferPositionedComments(i,s.value),s}else if(i.type&512){let{namespaces:s,name:r,newIndex:o}=Me.parseFromLexeme(e,n),l=new b(s,r);return this.transferPositionedComments(i,l),{value:l,newIndex:o}}else if(i.type&8192){let{namespaces:s,name:r,newIndex:o}=Me.parseFromLexeme(e,n);if(o<e.length&&e[o].type&4)if(this.isTypeConstructor(e,o,r.name)){let l=qe.parseTypeValue(e,n);return this.transferPositionedComments(i,l.value),{value:l.value,newIndex:l.newIndex}}else{let l=qe.parseFromLexeme(e,n);return this.transferPositionedComments(i,l.value),l}else{let l=new Re(s,r);return this.transferPositionedComments(i,l),{value:l,newIndex:o}}}throw be.fromUnparsedLexemes(e,n,"[ValueParser] Invalid lexeme.")}static parseArgument(e,t,n,i){let s=i,r=[];if(s<n.length&&n[s].type===e){let o=n[s];if(s++,s<n.length&&n[s].type===t)return s++,{value:new D([]),newIndex:s};if(s<n.length&&n[s].value==="*"){let u=new b(null,"*");if(o.positionedComments&&o.positionedComments.length>0){let c=o.positionedComments.filter(p=>p.position==="after");c.length>0&&(u.positionedComments=c.map(p=>({position:"before",comments:p.comments})))}else o.comments&&o.comments.length>0&&(u.comments=o.comments);if(s++,s<n.length&&n[s].type===t)return s++,{value:u,newIndex:s};throw be.fromUnparsedLexemes(n,s,"Expected closing parenthesis after wildcard '*'.")}let l=this.parseFromLexeme(n,s);if(s=l.newIndex,o.positionedComments&&o.positionedComments.length>0){let u=o.positionedComments.filter(c=>c.position==="after");if(u.length>0){let c=u.map(p=>({position:"before",comments:p.comments}));l.value.positionedComments?l.value.positionedComments=[...c,...l.value.positionedComments]:l.value.positionedComments=c}}else o.comments&&o.comments.length>0&&(l.value.comments?l.value.comments=o.comments.concat(l.value.comments):l.value.comments=o.comments);for(r.push(l.value);s<n.length&&n[s].type&16;){s++;let u=this.parseFromLexeme(n,s);s=u.newIndex,r.push(u.value)}if(s<n.length&&n[s].type===t)return s++,r.length===1?{value:r[0],newIndex:s}:{value:new D(r),newIndex:s};throw be.fromUnparsedLexemes(n,s,"Missing closing parenthesis.")}throw be.fromUnparsedLexemes(n,i,"Expected opening parenthesis.")}static parseArrayAccess(e,t,n){let i=t,s=n;for(;i<e.length&&e[i].type&512&&!this.isSqlServerBracketIdentifier(e,i);){if(i++,i>=e.length)throw new Error(`Expected array index or slice after '[' at index ${i-1}`);if(e[i].type&1024)throw new Error(`Empty array access brackets not supported at index ${i}`);let r=null,o=!1;if(e[i].type&2&&e[i].value===":")o=!0,i++;else{let l=yt.getPrecedence(":"),u=this.parseExpressionWithPrecedence(e,i,l+1);r=u.value,i=u.newIndex,i<e.length&&e[i].type&2&&e[i].value===":"&&(o=!0,i++)}if(o){let l=null;if(i<e.length&&!(e[i].type&1024)){let u=yt.getPrecedence(":"),c=this.parseExpressionWithPrecedence(e,i,u+1);l=c.value,i=c.newIndex}if(i>=e.length||!(e[i].type&1024))throw new Error(`Expected ']' after array slice at index ${i}`);i++,s=new et(s,r,l)}else{if(!r){let l=this.parseFromLexeme(e,i);r=l.value,i=l.newIndex}if(i>=e.length||!(e[i].type&1024))throw new Error(`Expected ']' after array index at index ${i}`);i++,s=new tt(s,r)}}return{value:s,newIndex:i}}static isSqlServerBracketIdentifier(e,t){let n=t+1;if(n>=e.length)return!1;for(;n<e.length&&!(e[n].type&1024);){let r=e[n];if(r.type&64||r.type&2&&r.value==="."){n++;continue}return!1}if(n>=e.length)return!1;let i=n;if(i+1<e.length){let r=e[i+1];if(r.type&2&&r.value===".")return!0}n=t+1;let s=!0;for(;n<i;){let r=e[n];if(!(r.type&64||r.type&2&&r.value===".")){s=!1;break}n++}return s}static isTypeConstructor(e,t,n){let i=["NUMERIC","DECIMAL","VARCHAR","CHAR","CHARACTER","TIMESTAMP","TIME","INTERVAL"],s=n.toUpperCase();if(i.includes(s))return!0;if(s==="DATE"){let r=t+1;if(r<e.length){let o=e[r];return!(o.type&1&&typeof o.value=="string"&&isNaN(Number(o.value)))}}return!1}};var X=class{constructor(){this.commonTables=[];this.visitedNodes=new Set;this.isRootVisit=!0;this.handlers=new Map,this.handlers.set(g.kind,e=>this.visitSimpleSelectQuery(e)),this.handlers.set(Q.kind,e=>this.visitBinarySelectQuery(e)),this.handlers.set(Ce.kind,e=>this.visitValuesQuery(e)),this.handlers.set(ae.kind,e=>this.visitWithClause(e)),this.handlers.set(ie.kind,e=>this.visitCommonTable(e)),this.handlers.set(_.kind,e=>this.visitSelectItem(e)),this.handlers.set(I.kind,e=>this.visitIdentifierString(e)),this.handlers.set(V.kind,e=>this.visitRawString(e)),this.handlers.set(b.kind,e=>this.visitColumnReference(e)),this.handlers.set(L.kind,e=>this.visitParameterExpression(e)),this.handlers.set(Y.kind,e=>this.visitLiteralValue(e)),this.handlers.set(B.kind,e=>this.visitSourceExpression(e)),this.handlers.set(O.kind,e=>this.visitTableSource(e)),this.handlers.set(ze.kind,e=>this.visitFunctionSource(e)),this.handlers.set($e.kind,e=>this.visitParenSource(e)),this.handlers.set(M.kind,e=>this.visitSubQuerySource(e)),this.handlers.set(ge.kind,e=>this.visitInlineQuery(e)),this.handlers.set(K.kind,e=>this.visitFromClause(e)),this.handlers.set(fe.kind,e=>this.visitJoinClause(e)),this.handlers.set(he.kind,e=>this.visitJoinOnClause(e)),this.handlers.set(Se.kind,e=>this.visitJoinUsingClause(e)),this.handlers.set(re.kind,e=>this.visitWhereClause(e)),this.handlers.set(Z.kind,e=>this.visitParenExpression(e)),this.handlers.set(S.kind,e=>this.visitBinaryExpression(e)),this.handlers.set(ne.kind,e=>this.visitUnaryExpression(e)),this.handlers.set(se.kind,e=>this.visitCaseExpression(e)),this.handlers.set(xe.kind,e=>this.visitCaseKeyValuePair(e)),this.handlers.set(Ee.kind,e=>this.visitSwitchCaseArgument(e)),this.handlers.set(we.kind,e=>this.visitBetweenExpression(e)),this.handlers.set(U.kind,e=>this.visitFunctionCall(e)),this.handlers.set(ye.kind,e=>this.visitArrayExpression(e)),this.handlers.set(ve.kind,e=>this.visitArrayQueryExpression(e)),this.handlers.set(Ie.kind,e=>this.visitTupleExpression(e)),this.handlers.set(ce.kind,e=>this.visitCastExpression(e)),this.handlers.set(Ve.kind,e=>this.visitWindowFrameExpression(e)),this.handlers.set(He.kind,e=>this.visitWindowFrameSpec(e)),this.handlers.set(Re.kind,e=>this.visitTypeValue(e)),this.handlers.set(D.kind,e=>this.visitValueList(e)),this.handlers.set(je.kind,e=>this.visitStringSpecifierExpression(e)),this.handlers.set(q.kind,e=>this.visitSelectClause(e)),this.handlers.set(me.kind,e=>this.visitGroupByClause(e)),this.handlers.set(de.kind,e=>this.visitHavingClause(e)),this.handlers.set(pe.kind,e=>this.visitOrderByClause(e)),this.handlers.set(Pe.kind,e=>this.visitWindowFrameClause(e)),this.handlers.set(oe.kind,e=>this.visitLimitClause(e)),this.handlers.set(Ae.kind,e=>this.visitForClause(e)),this.handlers.set(Le.kind,e=>this.visitOrderByItem(e)),this.handlers.set(Ue.kind,e=>this.visitPartitionByClause(e))}getCommonTables(){return this.commonTables}reset(){this.commonTables=[],this.visitedNodes.clear()}collect(e){return this.visit(e),this.getCommonTables()}visit(e){if(!this.isRootVisit){this.visitNode(e);return}this.reset(),this.isRootVisit=!1;try{this.visitNode(e)}finally{this.isRootVisit=!0}}visitNode(e){if(this.visitedNodes.has(e))return;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());if(t){t(e);return}let n=e.getKind()?.toString()||"unknown",i=e.constructor?.name||"unknown";throw new Error(`[CTECollector] No handler for ${i} with kind ${n}.`)}visitSimpleSelectQuery(e){if(e.fromClause&&e.fromClause.accept(this),e.whereClause&&e.whereClause.accept(this),e.groupByClause&&e.groupByClause.accept(this),e.havingClause&&e.havingClause.accept(this),e.orderByClause&&e.orderByClause.accept(this),e.windowClause)for(let t of e.windowClause.windows)t.accept(this);e.limitClause&&e.limitClause.accept(this),e.forClause&&e.forClause.accept(this),e.selectClause.accept(this),e.withClause&&e.withClause.accept(this)}visitBinarySelectQuery(e){e.left.accept(this),e.right.accept(this)}visitValuesQuery(e){for(let t of e.tuples)t.accept(this)}visitWithClause(e){for(let t=0;t<e.tables.length;t++)e.tables[t].accept(this)}visitCommonTable(e){e.query.accept(this),this.commonTables.push(e)}visitSelectClause(e){for(let t of e.items)t.accept(this)}visitSelectItem(e){e.value.accept(this)}visitFromClause(e){if(e.source.accept(this),e.joins)for(let t of e.joins)t.accept(this)}visitSourceExpression(e){e.datasource.accept(this)}visitTableSource(e){}visitFunctionSource(e){e.argument&&e.argument.accept(this)}visitParenSource(e){e.source.accept(this)}visitSubQuerySource(e){e.query.accept(this)}visitInlineQuery(e){e.selectQuery.accept(this)}visitJoinClause(e){e.source.accept(this),e.condition&&e.condition.accept(this)}visitJoinOnClause(e){e.condition.accept(this)}visitJoinUsingClause(e){e.condition.accept(this)}visitWhereClause(e){e.condition.accept(this)}visitGroupByClause(e){for(let t of e.grouping)t.accept(this)}visitHavingClause(e){e.condition.accept(this)}visitOrderByClause(e){for(let t of e.order)t.accept(this)}visitWindowFrameClause(e){e.expression.accept(this)}visitLimitClause(e){e.value.accept(this)}visitForClause(e){}visitOrderByItem(e){e.value.accept(this)}visitParenExpression(e){e.expression.accept(this)}visitBinaryExpression(e){e.left.accept(this),e.right.accept(this)}visitUnaryExpression(e){e.expression.accept(this)}visitCaseExpression(e){e.condition&&e.condition.accept(this),e.switchCase.accept(this)}visitSwitchCaseArgument(e){for(let t of e.cases)t.accept(this);e.elseValue&&e.elseValue.accept(this)}visitCaseKeyValuePair(e){e.key.accept(this),e.value.accept(this)}visitBetweenExpression(e){e.expression.accept(this),e.lower.accept(this),e.upper.accept(this)}visitFunctionCall(e){e.argument&&e.argument.accept(this),e.over&&e.over.accept(this)}visitArrayExpression(e){e.expression.accept(this)}visitArrayQueryExpression(e){e.query.accept(this)}visitTupleExpression(e){for(let t of e.values)t.accept(this)}visitCastExpression(e){e.input.accept(this),e.castType.accept(this)}visitTypeValue(e){e.argument&&e.argument.accept(this)}visitWindowFrameExpression(e){e.partition&&e.partition.accept(this),e.order&&e.order.accept(this),e.frameSpec&&e.frameSpec.accept(this)}visitWindowFrameSpec(e){}visitIdentifierString(e){}visitRawString(e){}visitColumnReference(e){}visitParameterExpression(e){}visitLiteralValue(e){}visitPartitionByClause(e){}visitValueList(e){for(let t of e.values)t.accept(this)}visitStringSpecifierExpression(e){}};var Lt=class{constructor(){this.visitedNodes=new Set;this.isRootVisit=!0;this.handlers=new Map,this.handlers.set(g.kind,e=>this.visitSimpleSelectQuery(e)),this.handlers.set(Q.kind,e=>this.visitBinarySelectQuery(e)),this.handlers.set(Ce.kind,e=>this.visitValuesQuery(e)),this.handlers.set(_.kind,e=>this.visitSelectItem(e)),this.handlers.set(I.kind,e=>this.visitIdentifierString(e)),this.handlers.set(V.kind,e=>this.visitRawString(e)),this.handlers.set(b.kind,e=>this.visitColumnReference(e)),this.handlers.set(L.kind,e=>this.visitParameterExpression(e)),this.handlers.set(Y.kind,e=>this.visitLiteralValue(e)),this.handlers.set(B.kind,e=>this.visitSourceExpression(e)),this.handlers.set(O.kind,e=>this.visitTableSource(e)),this.handlers.set($e.kind,e=>this.visitParenSource(e)),this.handlers.set(M.kind,e=>this.visitSubQuerySource(e)),this.handlers.set(ge.kind,e=>this.visitInlineQuery(e)),this.handlers.set(K.kind,e=>this.visitFromClause(e)),this.handlers.set(fe.kind,e=>this.visitJoinClause(e)),this.handlers.set(he.kind,e=>this.visitJoinOnClause(e)),this.handlers.set(Se.kind,e=>this.visitJoinUsingClause(e)),this.handlers.set(re.kind,e=>this.visitWhereClause(e)),this.handlers.set(Z.kind,e=>this.visitParenExpression(e)),this.handlers.set(S.kind,e=>this.visitBinaryExpression(e)),this.handlers.set(ne.kind,e=>this.visitUnaryExpression(e)),this.handlers.set(se.kind,e=>this.visitCaseExpression(e)),this.handlers.set(xe.kind,e=>this.visitCaseKeyValuePair(e)),this.handlers.set(Ee.kind,e=>this.visitSwitchCaseArgument(e)),this.handlers.set(we.kind,e=>this.visitBetweenExpression(e)),this.handlers.set(U.kind,e=>this.visitFunctionCall(e)),this.handlers.set(ye.kind,e=>this.visitArrayExpression(e)),this.handlers.set(ve.kind,e=>this.visitArrayQueryExpression(e)),this.handlers.set(Ie.kind,e=>this.visitTupleExpression(e)),this.handlers.set(ce.kind,e=>this.visitCastExpression(e)),this.handlers.set(Ve.kind,e=>this.visitWindowFrameExpression(e)),this.handlers.set(He.kind,e=>this.visitWindowFrameSpec(e)),this.handlers.set(Re.kind,e=>this.visitTypeValue(e)),this.handlers.set(D.kind,e=>this.visitValueList(e)),this.handlers.set(et.kind,e=>this.visitArraySliceExpression(e)),this.handlers.set(tt.kind,e=>this.visitArrayIndexExpression(e)),this.handlers.set(je.kind,e=>this.visitStringSpecifierExpression(e)),this.handlers.set(q.kind,e=>this.visitSelectClause(e)),this.handlers.set(me.kind,e=>this.visitGroupByClause(e)),this.handlers.set(de.kind,e=>this.visitHavingClause(e)),this.handlers.set(pe.kind,e=>this.visitOrderByClause(e)),this.handlers.set(Pe.kind,e=>this.visitWindowFrameClause(e)),this.handlers.set(oe.kind,e=>this.visitLimitClause(e)),this.handlers.set(Ae.kind,e=>this.visitForClause(e)),this.handlers.set(Le.kind,e=>this.visitOrderByItem(e)),this.handlers.set(Ue.kind,e=>this.visitPartitionByClause(e))}reset(){this.visitedNodes.clear()}execute(e){return this.reset(),this.visit(e)}visit(e){if(!this.isRootVisit)return this.visitNode(e);this.reset(),this.isRootVisit=!1;try{return this.visitNode(e)}finally{this.isRootVisit=!0}}visitNode(e){if(this.visitedNodes.has(e))return e;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());if(t)return t(e);let n=e.getKind()?.toString()||"unknown",i=e.constructor?.name||"unknown";throw new Error(`[CTEDisabler] No handler for ${i} with kind ${n}.`)}visitSimpleSelectQuery(e){return e.withClause&&e.withClause.tables.forEach(t=>{this.visit(t.query)}),e.withClause=null,e.selectClause=this.visit(e.selectClause),e.fromClause=e.fromClause?this.visit(e.fromClause):null,e.whereClause=e.whereClause?this.visit(e.whereClause):null,e.groupByClause=e.groupByClause?this.visit(e.groupByClause):null,e.havingClause=e.havingClause?this.visit(e.havingClause):null,e.orderByClause=e.orderByClause?this.visit(e.orderByClause):null,e.windowClause&&(e.windowClause=new nt(e.windowClause.windows.map(t=>this.visit(t)))),e.limitClause=e.limitClause?this.visit(e.limitClause):null,e.forClause=e.forClause?this.visit(e.forClause):null,e}visitBinarySelectQuery(e){return e.left=this.visit(e.left),e.right=this.visit(e.right),e}visitValuesQuery(e){let t=e.tuples.map(n=>this.visit(n));return new Ce(t)}visitSelectClause(e){let t=e.items.map(n=>this.visit(n));return new q(t,e.distinct)}visitFromClause(e){let t=this.visit(e.source),n=e.joins?e.joins.map(i=>this.visit(i)):null;return new K(t,n)}visitSubQuerySource(e){let t=this.visit(e.query);return new M(t)}visitInlineQuery(e){let t=this.visit(e.selectQuery);return new ge(t)}visitJoinClause(e){let t=this.visit(e.source),n=e.condition?this.visit(e.condition):null;return new fe(e.joinType.value,t,n,e.lateral)}visitJoinOnClause(e){let t=this.visit(e.condition);return new he(t)}visitJoinUsingClause(e){let t=this.visit(e.condition);return new Se(t)}visitWhereClause(e){let t=this.visit(e.condition);return new re(t)}visitGroupByClause(e){let t=e.grouping.map(n=>this.visit(n));return new me(t)}visitHavingClause(e){let t=this.visit(e.condition);return new de(t)}visitOrderByClause(e){let t=e.order.map(n=>this.visit(n));return new pe(t)}visitWindowFrameClause(e){let t=this.visit(e.expression);return new Pe(e.name.name,t)}visitLimitClause(e){let t=this.visit(e.value);return new oe(t)}visitForClause(e){return new Ae(e.lockMode)}visitParenExpression(e){let t=this.visit(e.expression);return new Z(t)}visitBinaryExpression(e){let t=this.visit(e.left),n=this.visit(e.right);return new S(t,e.operator.value,n)}visitUnaryExpression(e){let t=this.visit(e.expression);return new ne(e.operator.value,t)}visitCaseExpression(e){let t=e.condition?this.visit(e.condition):null,n=this.visit(e.switchCase);return new se(t,n)}visitSwitchCaseArgument(e){let t=e.cases.map(i=>this.visit(i)),n=e.elseValue?this.visit(e.elseValue):null;return new Ee(t,n)}visitCaseKeyValuePair(e){let t=this.visit(e.key),n=this.visit(e.value);return new xe(t,n)}visitBetweenExpression(e){let t=this.visit(e.expression),n=this.visit(e.lower),i=this.visit(e.upper);return new we(t,n,i,e.negated)}visitFunctionCall(e){let t=e.argument?this.visit(e.argument):null,n=e.over?this.visit(e.over):null;return new U(e.namespaces,e.name,t,n)}visitArrayExpression(e){let t=this.visit(e.expression);return new ye(t)}visitArrayQueryExpression(e){let t=this.visit(e.query);return new ve(t)}visitTupleExpression(e){let t=e.values.map(n=>this.visit(n));return new Ie(t)}visitCastExpression(e){let t=this.visit(e.input),n=this.visit(e.castType);return new ce(t,n)}visitTypeValue(e){let t=e.argument?this.visit(e.argument):null;return new Re(e.namespaces,e.name,t)}visitSelectItem(e){let t=this.visit(e.value);return new _(t,e.identifier?.name)}visitIdentifierString(e){return e}visitRawString(e){return e}visitColumnReference(e){return e}visitSourceExpression(e){let t=this.visit(e.datasource),n=e.aliasExpression;return new B(t,n)}visitTableSource(e){return e}visitParenSource(e){let t=this.visit(e.source);return new $e(t)}visitParameterExpression(e){return e}visitWindowFrameExpression(e){let t=e.partition?this.visit(e.partition):null,n=e.order?this.visit(e.order):null,i=e.frameSpec?this.visit(e.frameSpec):null;return new Ve(t,n,i)}visitWindowFrameSpec(e){return e}visitLiteralValue(e){return e}visitOrderByItem(e){let t=this.visit(e.value);return new Le(t,e.sortDirection,e.nullsPosition)}visitValueList(e){let t=e.values.map(n=>this.visit(n));return new D(t)}visitArraySliceExpression(e){return e}visitArrayIndexExpression(e){return e}visitStringSpecifierExpression(e){return e}visitPartitionByClause(e){let t=this.visit(e.value);return new Ue(t)}};var Ge=class{constructor(e=!0){this.tableSources=[];this.visitedNodes=new Set;this.tableNameMap=new Map;this.cteNames=new Set;this.isRootVisit=!0;this.selectableOnly=e,this.handlers=new Map,this.handlers.set(g.kind,t=>this.visitSimpleSelectQuery(t)),this.handlers.set(Q.kind,t=>this.visitBinarySelectQuery(t)),this.handlers.set(Ce.kind,t=>this.visitValuesQuery(t)),this.handlers.set(ae.kind,t=>this.visitWithClause(t)),this.handlers.set(ie.kind,t=>this.visitCommonTable(t)),this.handlers.set(K.kind,t=>this.visitFromClause(t)),this.handlers.set(fe.kind,t=>this.visitJoinClause(t)),this.handlers.set(he.kind,t=>this.visitJoinOnClause(t)),this.handlers.set(Se.kind,t=>this.visitJoinUsingClause(t)),this.handlers.set(B.kind,t=>this.visitSourceExpression(t)),this.handlers.set(O.kind,t=>this.visitTableSource(t)),this.handlers.set(ze.kind,t=>this.visitFunctionSource(t)),this.handlers.set($e.kind,t=>this.visitParenSource(t)),this.handlers.set(M.kind,t=>this.visitSubQuerySource(t)),this.handlers.set(ge.kind,t=>this.visitInlineQuery(t)),e||(this.handlers.set(re.kind,t=>this.visitWhereClause(t)),this.handlers.set(me.kind,t=>this.visitGroupByClause(t)),this.handlers.set(de.kind,t=>this.visitHavingClause(t)),this.handlers.set(pe.kind,t=>this.visitOrderByClause(t)),this.handlers.set(Pe.kind,t=>this.visitWindowFrameClause(t)),this.handlers.set(oe.kind,t=>this.visitLimitClause(t)),this.handlers.set(Fe.kind,t=>this.visitOffsetClause(t)),this.handlers.set(Ke.kind,t=>this.visitFetchClause(t)),this.handlers.set(Ae.kind,t=>this.visitForClause(t)),this.handlers.set(Le.kind,t=>this.visitOrderByItem(t)),this.handlers.set(q.kind,t=>this.visitSelectClause(t)),this.handlers.set(_.kind,t=>this.visitSelectItem(t)),this.handlers.set(Z.kind,t=>this.visitParenExpression(t)),this.handlers.set(S.kind,t=>this.visitBinaryExpression(t)),this.handlers.set(ne.kind,t=>this.visitUnaryExpression(t)),this.handlers.set(se.kind,t=>this.visitCaseExpression(t)),this.handlers.set(xe.kind,t=>this.visitCaseKeyValuePair(t)),this.handlers.set(Ee.kind,t=>this.visitSwitchCaseArgument(t)),this.handlers.set(we.kind,t=>this.visitBetweenExpression(t)),this.handlers.set(U.kind,t=>this.visitFunctionCall(t)),this.handlers.set(ye.kind,t=>this.visitArrayExpression(t)),this.handlers.set(ve.kind,t=>this.visitArrayQueryExpression(t)),this.handlers.set(Ie.kind,t=>this.visitTupleExpression(t)),this.handlers.set(ce.kind,t=>this.visitCastExpression(t)),this.handlers.set(D.kind,t=>this.visitValueList(t)),this.handlers.set(je.kind,t=>this.visitStringSpecifierExpression(t)))}getTableSources(){return this.tableSources}reset(){this.tableSources=[],this.tableNameMap.clear(),this.visitedNodes.clear(),this.cteNames.clear()}getTableIdentifier(e){return e.qualifiedName.namespaces&&e.qualifiedName.namespaces.length>0?e.qualifiedName.namespaces.map(t=>t.name).join(".")+"."+(e.qualifiedName.name instanceof V?e.qualifiedName.name.value:e.qualifiedName.name.name):e.qualifiedName.name instanceof V?e.qualifiedName.name.value:e.qualifiedName.name.name}collect(e){return this.visit(e),this.getTableSources()}visit(e){if(!this.isRootVisit){this.visitNode(e);return}this.reset(),this.isRootVisit=!1;try{this.selectableOnly||this.collectCTEs(e),this.visitNode(e)}finally{this.isRootVisit=!0}}visitNode(e){if(this.visitedNodes.has(e))return;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());if(t){t(e);return}}collectCTEs(e){let t=new X;t.visit(e);let n=t.getCommonTables();for(let i of n)this.cteNames.add(i.aliasExpression.table.name)}visitSimpleSelectQuery(e){if(e.fromClause&&e.fromClause.accept(this),!this.selectableOnly){if(e.withClause&&e.withClause.accept(this),e.whereClause&&e.whereClause.accept(this),e.groupByClause&&e.groupByClause.accept(this),e.havingClause&&e.havingClause.accept(this),e.orderByClause&&e.orderByClause.accept(this),e.windowClause)for(let t of e.windowClause.windows)t.accept(this);e.limitClause&&e.limitClause.accept(this),e.offsetClause&&e.offsetClause.accept(this),e.fetchClause&&e.fetchClause.accept(this),e.forClause&&e.forClause.accept(this),e.selectClause.accept(this)}}visitBinarySelectQuery(e){e.left.accept(this),e.right.accept(this)}visitValuesQuery(e){if(!this.selectableOnly)for(let t of e.tuples)t.accept(this)}visitWithClause(e){if(!this.selectableOnly)for(let t of e.tables)t.accept(this)}visitCommonTable(e){this.selectableOnly||e.query.accept(this)}visitFromClause(e){if(e.source.accept(this),e.joins)for(let t of e.joins)t.accept(this)}visitSourceExpression(e){e.datasource.accept(this)}visitTableSource(e){let t=this.getTableIdentifier(e);!this.tableNameMap.has(t)&&!this.isCTETable(e.table.name)&&(this.tableNameMap.set(t,!0),this.tableSources.push(e))}visitFunctionSource(e){e.argument&&this.visitValueComponent(e.argument)}visitValueComponent(e){e.accept(this)}isCTETable(e){return this.cteNames.has(e)}visitParenSource(e){e.source.accept(this)}visitSubQuerySource(e){this.selectableOnly||e.query.accept(this)}visitInlineQuery(e){this.selectableOnly||e.selectQuery.accept(this)}visitJoinClause(e){e.source.accept(this),!this.selectableOnly&&e.condition&&e.condition.accept(this)}visitJoinOnClause(e){this.selectableOnly||e.condition.accept(this)}visitJoinUsingClause(e){this.selectableOnly||e.condition.accept(this)}visitWhereClause(e){e.condition.accept(this)}visitGroupByClause(e){for(let t of e.grouping)t.accept(this)}visitHavingClause(e){e.condition.accept(this)}visitOrderByClause(e){for(let t of e.order)t.accept(this)}visitWindowFrameClause(e){e.expression.accept(this)}visitLimitClause(e){e.value.accept(this)}visitOffsetClause(e){e.value.accept(this)}visitFetchClause(e){e.expression.accept(this)}visitForClause(e){}visitOrderByItem(e){e.value.accept(this)}visitSelectClause(e){for(let t of e.items)t.accept(this)}visitSelectItem(e){e.value.accept(this)}visitParenExpression(e){e.expression.accept(this)}visitBinaryExpression(e){e.left.accept(this),e.right.accept(this)}visitUnaryExpression(e){e.expression.accept(this)}visitCaseExpression(e){e.condition&&e.condition.accept(this),e.switchCase.accept(this)}visitSwitchCaseArgument(e){for(let t of e.cases)t.accept(this);e.elseValue&&e.elseValue.accept(this)}visitCaseKeyValuePair(e){e.key.accept(this),e.value.accept(this)}visitBetweenExpression(e){e.expression.accept(this),e.lower.accept(this),e.upper.accept(this)}visitFunctionCall(e){e.argument&&e.argument.accept(this),e.over&&e.over.accept(this)}visitArrayExpression(e){e.expression.accept(this)}visitArrayQueryExpression(e){e.query.accept(this)}visitTupleExpression(e){for(let t of e.values)t.accept(this)}visitCastExpression(e){e.input.accept(this),e.castType.accept(this)}visitValueList(e){for(let t of e.values)t.accept(this)}visitStringSpecifierExpression(e){}};var pt=class extends v{static{this.kind=Symbol("HintClause")}constructor(e){super(),this.hintContent=e}getFullHint(){return"/*+ "+this.hintContent+" */"}static isHintClause(e){let t=e.trim();return t.length>=5&&t.substring(0,3)==="/*+"&&t.substring(t.length-2)==="*/"}static extractHintContent(e){let t=e.trim();if(!this.isHintClause(t))throw new Error("Not a valid hint clause: "+e);return t.slice(3,-2).trim()}};var m=class{constructor(e,t="",n=""){this.innerTokens=[];this.type=e,this.text=t,this.containerType=n}};var mt=class{static collect(e){let t=[];function n(i){if(!(!i||typeof i!="object")){i.constructor&&i.constructor.kind===L.kind&&t.push(i);for(let s of Object.keys(i)){let r=i[s];Array.isArray(r)?r.forEach(n):r&&typeof r=="object"&&r.constructor&&r.constructor.kind&&n(r)}}}return n(e),t}};var In=class{constructor(e){this.start=e?.start??'"',this.end=e?.end??'"'}decorate(e){return e=this.start+e+this.end,e}};var Pn=class{constructor(e){this.prefix=e?.prefix??":",this.suffix=e?.suffix??"",this.style=e?.style??"named"}decorate(e,t){let n="";return this.style==="anonymous"?n=this.prefix:this.style==="indexed"?n=this.prefix+t:this.style==="named"&&(n=this.prefix+e+this.suffix),e=n,e}};var At=class extends v{static{this.kind=Symbol("UpdateQuery")}constructor(e){super(),this.withClause=e.withClause??null,this.updateClause=e.updateClause,this.setClause=e.setClause instanceof at?e.setClause:new at(e.setClause),this.whereClause=e.whereClause??null,this.fromClause=e.fromClause??null,this.returningClause=e.returning??null}};var _e=class a{constructor(e=null,t=null){this.selectValues=[];this.visitedNodes=new Set;this.isRootVisit=!0;this.tableColumnResolver=e??null,this.commonTableCollector=new X,this.commonTables=[],this.initialCommonTables=t,this.handlers=new Map,this.handlers.set(g.kind,n=>this.visitSimpleSelectQuery(n)),this.handlers.set(q.kind,n=>this.visitSelectClause(n)),this.handlers.set(B.kind,n=>this.visitSourceExpression(n)),this.handlers.set(K.kind,n=>this.visitFromClause(n))}getValues(){return this.selectValues}reset(){this.selectValues=[],this.visitedNodes.clear(),this.initialCommonTables?this.commonTables=this.initialCommonTables:this.commonTables=[]}collect(e){this.visit(e);let t=this.getValues();return this.reset(),t}visit(e){if(!this.isRootVisit){this.visitNode(e);return}this.reset(),this.isRootVisit=!1;try{this.visitNode(e)}finally{this.isRootVisit=!0}}visitNode(e){if(this.visitedNodes.has(e))return;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());if(t){t(e);return}}visitSimpleSelectQuery(e){this.commonTables.length===0&&this.initialCommonTables===null&&(this.commonTables=this.commonTableCollector.collect(e)),e.selectClause&&e.selectClause.accept(this);let t=this.selectValues.filter(i=>i.name==="*");if(t.length===0)return;if(this.selectValues.some(i=>i.value instanceof b&&i.value.namespaces===null)){e.fromClause&&this.processFromClause(e.fromClause,!0),this.selectValues=this.selectValues.filter(i=>i.name!=="*");return}let n=t.filter(i=>i.value instanceof b&&i.value.namespaces).map(i=>i.value.getNamespace());if(e.fromClause){let i=e.fromClause.getSourceAliasName();if(i&&n.includes(i)&&this.processFromClause(e.fromClause,!1),e.fromClause.joins)for(let s of e.fromClause.joins){let r=s.getSourceAliasName();r&&n.includes(r)&&this.processJoinClause(s)}}this.selectValues=this.selectValues.filter(i=>i.name!=="*")}processFromClause(e,t){if(e){let n=e.getSourceAliasName();if(this.processSourceExpression(n,e.source),e.joins&&t)for(let i of e.joins)this.processJoinClause(i)}}processJoinClause(e){let t=e.getSourceAliasName();this.processSourceExpression(t,e.source)}processSourceExpression(e,t){let n=this.commonTables.find(i=>i.aliasExpression.table.name===e);if(n){let i=this.commonTables.filter(o=>o.aliasExpression.table.name!==e);new a(this.tableColumnResolver,i).collect(n.query).forEach(o=>{this.addSelectValueAsUnique(o.name,new b(e?[e]:null,o.name))})}else new a(this.tableColumnResolver,this.commonTables).collect(t).forEach(r=>{this.addSelectValueAsUnique(r.name,new b(e?[e]:null,r.name))})}visitSelectClause(e){for(let t of e.items)this.processSelectItem(t)}processSelectItem(e){if(e.identifier)this.addSelectValueAsUnique(e.identifier.name,e.value);else if(e.value instanceof b){let t=e.value.column.name;t==="*"?this.selectValues.push({name:t,value:e.value}):this.addSelectValueAsUnique(t,e.value)}}visitSourceExpression(e){if(e.aliasExpression&&e.aliasExpression.columns){let t=e.getAliasName();e.aliasExpression.columns.forEach(n=>{this.addSelectValueAsUnique(n.name,new b(t?[t]:null,n.name))});return}else if(e.datasource instanceof O){if(this.tableColumnResolver){let t=e.datasource.getSourceName();this.tableColumnResolver(t).forEach(n=>{this.addSelectValueAsUnique(n,new b([t],n))})}return}else if(e.datasource instanceof M){let t=e.getAliasName();new a(this.tableColumnResolver,this.commonTables).collect(e.datasource.query).forEach(s=>{this.addSelectValueAsUnique(s.name,new b(t?[t]:null,s.name))});return}else if(e.datasource instanceof $e)return this.visit(e.datasource.source)}visitFromClause(e){e&&this.processFromClause(e,!0)}addSelectValueAsUnique(e,t){this.selectValues.some(n=>n.name===e)||this.selectValues.push({name:e,value:t})}};var Nt=class extends v{static{this.kind=Symbol("CreateTableQuery")}constructor(e){super(),this.tableName=new I(e.tableName),this.isTemporary=e.isTemporary??!1,this.asSelectQuery=e.asSelectQuery}getSelectQuery(){let e;return this.asSelectQuery?e=new _e().collect(this.asSelectQuery).map(i=>new _(i.value,i.name)):e=[new _(new V("*"))],new g({selectClause:new q(e),fromClause:new K(new B(new O(null,this.tableName.name),null),null)})}getCountQuery(){return new g({selectClause:new q([new _(new U(null,"count",new b(null,"*"),null))]),fromClause:new K(new B(new O(null,this.tableName.name),null),null)})}};var Ni={mysql:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},postgres:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"$",parameterStyle:"indexed"},postgresWithNamedParams:{identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"},sqlserver:{identifierEscape:{start:"[",end:"]"},parameterSymbol:"@",parameterStyle:"named"},sqlite:{identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"},oracle:{identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"},clickhouse:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},firebird:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},db2:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},snowflake:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},cloudspanner:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"@",parameterStyle:"named"},duckdb:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},cockroachdb:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"$",parameterStyle:"indexed"},athena:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},bigquery:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"@",parameterStyle:"named"},hive:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},mariadb:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},redshift:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"$",parameterStyle:"indexed"},flinksql:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},mongodb:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"}},Ln=class a{constructor(e){this.handlers=new Map;this.index=1;this.commentStyle="block";e?.preset&&(e={...e.preset,...e}),this.parameterDecorator=new Pn({prefix:typeof e?.parameterSymbol=="string"?e.parameterSymbol:e?.parameterSymbol?.start??":",suffix:typeof e?.parameterSymbol=="object"?e.parameterSymbol.end:"",style:e?.parameterStyle??"named"}),this.identifierDecorator=new In({start:e?.identifierEscape?.start??'"',end:e?.identifierEscape?.end??'"'}),this.commentStyle=e?.commentStyle??"block",this.handlers.set(D.kind,t=>this.visitValueList(t)),this.handlers.set(b.kind,t=>this.visitColumnReference(t)),this.handlers.set(De.kind,t=>this.visitQualifiedName(t)),this.handlers.set(U.kind,t=>this.visitFunctionCall(t)),this.handlers.set(ne.kind,t=>this.visitUnaryExpression(t)),this.handlers.set(S.kind,t=>this.visitBinaryExpression(t)),this.handlers.set(Y.kind,t=>this.visitLiteralValue(t)),this.handlers.set(L.kind,t=>this.visitParameterExpression(t)),this.handlers.set(Ee.kind,t=>this.visitSwitchCaseArgument(t)),this.handlers.set(xe.kind,t=>this.visitCaseKeyValuePair(t)),this.handlers.set(V.kind,t=>this.visitRawString(t)),this.handlers.set(I.kind,t=>this.visitIdentifierString(t)),this.handlers.set(Z.kind,t=>this.visitParenExpression(t)),this.handlers.set(ce.kind,t=>this.visitCastExpression(t)),this.handlers.set(se.kind,t=>this.visitCaseExpression(t)),this.handlers.set(ye.kind,t=>this.visitArrayExpression(t)),this.handlers.set(ve.kind,t=>this.visitArrayQueryExpression(t)),this.handlers.set(et.kind,t=>this.visitArraySliceExpression(t)),this.handlers.set(tt.kind,t=>this.visitArrayIndexExpression(t)),this.handlers.set(we.kind,t=>this.visitBetweenExpression(t)),this.handlers.set(je.kind,t=>this.visitStringSpecifierExpression(t)),this.handlers.set(Re.kind,t=>this.visitTypeValue(t)),this.handlers.set(Ie.kind,t=>this.visitTupleExpression(t)),this.handlers.set(ge.kind,t=>this.visitInlineQuery(t)),this.handlers.set(Ve.kind,t=>this.visitWindowFrameExpression(t)),this.handlers.set(He.kind,t=>this.visitWindowFrameSpec(t)),this.handlers.set(Et.kind,t=>this.visitWindowFrameBoundStatic(t)),this.handlers.set(xt.kind,t=>this.visitWindowFrameBoundaryValue(t)),this.handlers.set(Ue.kind,t=>this.visitPartitionByClause(t)),this.handlers.set(pe.kind,t=>this.visitOrderByClause(t)),this.handlers.set(Le.kind,t=>this.visitOrderByItem(t)),this.handlers.set(_.kind,t=>this.visitSelectItem(t)),this.handlers.set(q.kind,t=>this.visitSelectClause(t)),this.handlers.set(Tt.kind,t=>this.visitDistinct(t)),this.handlers.set(kt.kind,t=>this.visitDistinctOn(t)),this.handlers.set(pt.kind,t=>this.visitHintClause(t)),this.handlers.set(O.kind,t=>this.visitTableSource(t)),this.handlers.set(ze.kind,t=>this.visitFunctionSource(t)),this.handlers.set(B.kind,t=>this.visitSourceExpression(t)),this.handlers.set(ee.kind,t=>this.visitSourceAliasExpression(t)),this.handlers.set(K.kind,t=>this.visitFromClause(t)),this.handlers.set(fe.kind,t=>this.visitJoinClause(t)),this.handlers.set(he.kind,t=>this.visitJoinOnClause(t)),this.handlers.set(Se.kind,t=>this.visitJoinUsingClause(t)),this.handlers.set(re.kind,t=>this.visitWhereClause(t)),this.handlers.set(me.kind,t=>this.visitGroupByClause(t)),this.handlers.set(de.kind,t=>this.visitHavingClause(t)),this.handlers.set(nt.kind,t=>this.visitWindowClause(t)),this.handlers.set(Pe.kind,t=>this.visitWindowFrameClause(t)),this.handlers.set(oe.kind,t=>this.visitLimitClause(t)),this.handlers.set(Fe.kind,t=>this.visitOffsetClause(t)),this.handlers.set(Ke.kind,t=>this.visitFetchClause(t)),this.handlers.set(gt.kind,t=>this.visitFetchExpression(t)),this.handlers.set(Ae.kind,t=>this.visitForClause(t)),this.handlers.set(ae.kind,t=>this.visitWithClause(t)),this.handlers.set(ie.kind,t=>this.visitCommonTable(t)),this.handlers.set(g.kind,t=>this.visitSimpleQuery(t)),this.handlers.set(M.kind,t=>this.visitSubQuerySource(t)),this.handlers.set(Q.kind,t=>this.visitBinarySelectQuery(t)),this.handlers.set(Ce.kind,t=>this.visitValuesQuery(t)),this.handlers.set(Ie.kind,t=>this.visitTupleExpression(t)),this.handlers.set(ot.kind,t=>this.visitInsertQuery(t)),this.handlers.set(ct.kind,t=>this.visitInsertClause(t)),this.handlers.set(At.kind,t=>this.visitUpdateQuery(t)),this.handlers.set(It.kind,t=>this.visitUpdateClause(t)),this.handlers.set(at.kind,t=>this.visitSetClause(t)),this.handlers.set(ut.kind,t=>this.visitSetClauseItem(t)),this.handlers.set(ln.kind,t=>this.visitReturningClause(t)),this.handlers.set(Nt.kind,t=>this.visitCreateTableQuery(t))}static{this.SPACE_TOKEN=new m(10," ")}static{this.COMMA_TOKEN=new m(3,",")}static{this.ARGUMENT_SPLIT_COMMA_TOKEN=new m(11,",")}static{this.PAREN_OPEN_TOKEN=new m(4,"(")}static{this.PAREN_CLOSE_TOKEN=new m(4,")")}static{this.DOT_TOKEN=new m(8,".")}static{this._selfHandlingComponentTypes=null}static getSelfHandlingComponentTypes(){return this._selfHandlingComponentTypes||(this._selfHandlingComponentTypes=new Set([g.kind,_.kind,xe.kind,Ee.kind,b.kind,Y.kind,L.kind,O.kind,ee.kind,Re.kind,U.kind,I.kind,De.kind])),this._selfHandlingComponentTypes}visitBinarySelectQuery(e){let t=new m(0,"");if(e.positionedComments&&e.positionedComments.length>0)this.addPositionedCommentsToToken(t,e),e.positionedComments=null;else if(e.headerComments&&e.headerComments.length>0){if(this.commentStyle==="smart"&&e.headerComments.length>1){let n=this.createHeaderMultiLineCommentBlock(e.headerComments);t.innerTokens.push(n)}else{let n=this.createCommentBlocks(e.headerComments);t.innerTokens.push(...n)}t.innerTokens.push(a.SPACE_TOKEN)}return t.innerTokens.push(this.visit(e.left)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,e.operator.value,"BinarySelectQueryOperator")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.right)),t}static commaSpaceTokens(){return[a.COMMA_TOKEN,a.SPACE_TOKEN]}static argumentCommaSpaceTokens(){return[a.ARGUMENT_SPLIT_COMMA_TOKEN,a.SPACE_TOKEN]}visitQualifiedName(e){let t=new m(0,"","QualifiedName");if(e.namespaces)for(let r=0;r<e.namespaces.length;r++)t.innerTokens.push(e.namespaces[r].accept(this)),t.innerTokens.push(a.DOT_TOKEN);let n=e.name.positionedComments,i=e.name.comments;e.name.positionedComments=null,e.name.comments=null;let s=e.name.accept(this);return t.innerTokens.push(s),e.name.positionedComments=n,e.name.comments=i,(this.hasPositionedComments(e.name)||this.hasLegacyComments(e.name))&&this.addComponentComments(t,e.name),this.addComponentComments(t,e),t}visitPartitionByClause(e){let t=new m(1,"partition by","PartitionByClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.value)),t}visitOrderByClause(e){let t=new m(1,"order by","OrderByClause");t.innerTokens.push(a.SPACE_TOKEN);for(let n=0;n<e.order.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(this.visit(e.order[n]));return t}visitOrderByItem(e){let t=new m(0,"","OrderByItem");return t.innerTokens.push(this.visit(e.value)),e.sortDirection&&e.sortDirection!=="asc"&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"desc"))),e.nullsPosition&&(e.nullsPosition==="first"?(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"nulls first"))):e.nullsPosition==="last"&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"nulls last")))),t}parse(e){this.index=1;let t=this.visit(e),n=mt.collect(e).sort((s,r)=>(s.index??0)-(r.index??0)),i=this.parameterDecorator.style;if(i==="named"){let s={};for(let r of n){let o=r.name.value;if(s.hasOwnProperty(o)){if(s[o]!==r.value)throw new Error(`Duplicate parameter name '${o}' with different values detected during query composition.`);continue}s[o]=r.value}return{token:t,params:s}}else if(i==="indexed"){let s=n.map(r=>r.value);return{token:t,params:s}}else if(i==="anonymous"){let s=n.map(r=>r.value);return{token:t,params:s}}return{token:t,params:[]}}componentHandlesOwnComments(e){return"handlesOwnComments"in e&&typeof e.handlesOwnComments=="function"?e.handlesOwnComments():a.getSelfHandlingComponentTypes().has(e.getKind())}visit(e){let t=this.handlers.get(e.getKind());if(t){let n=t(e);return this.componentHandlesOwnComments(e)||this.addComponentComments(n,e),n}throw new Error(`[SqlPrintTokenParser] No handler for kind: ${e.getKind().toString()}`)}hasPositionedComments(e){return(e.positionedComments?.length??0)>0}hasLegacyComments(e){return(e.comments?.length??0)>0}addComponentComments(e,t){this.hasPositionedComments(t)?this.addPositionedCommentsToToken(e,t):this.hasLegacyComments(t)&&this.addCommentsToToken(e,t.comments)}addPositionedCommentsToToken(e,t){if(!this.hasPositionedComments(t))return;let n=t.getPositionedComments("before");if(n.length>0){let r=this.createCommentBlocks(n),o=[];for(let l of r)o.push(l),o.push(new m(10," "));e.innerTokens.unshift(...o)}let i=t.getPositionedComments("after");if(i.length>0){let r=this.createCommentBlocks(i);for(let o of r)e.innerTokens.push(new m(10," ")),e.innerTokens.push(o)}let s=["CaseExpression","SwitchCaseArgument","CaseKeyValuePair","SelectClause","LiteralValue","IdentifierString","DistinctOn","SourceAliasExpression","SimpleSelectQuery","WhereClause"];e.containerType&&s.includes(e.containerType)&&(t.positionedComments=null)}addCommentsToToken(e,t){if(t?.length)if(t.length>1){let n=this.createInlineCommentSequence(t);this.insertCommentBlocksWithSpacing(e,n)}else{let n=this.createCommentBlocks(t);this.insertCommentBlocksWithSpacing(e,n)}}createInlineCommentSequence(e){let t=[];for(let n=0;n<e.length;n++){let i=e[n];if(i.trim()){let s=new m(6,this.formatBlockComment(i));if(t.push(s),n<e.length-1){let r=new m(10," ");t.push(r)}}}return t}createCommentBlocks(e){if(this.commentStyle==="smart")return this.createSmartCommentBlocks(e);let t=[];for(let n of e){let i=n.trim(),s=/^[-=_+*#]+$/.test(i);(i||s||n==="")&&t.push(this.createSingleCommentBlock(n))}return t}createSmartCommentBlocks(e){let t=[],n=[],i=()=>{n.length>0&&(n.length===1?t.push(this.createSingleCommentBlock(n[0])):t.push(this.createMultiLineCommentBlock(n)),n.length=0)};for(let s of e){let r=s.trim(),o=/^[-=_+*#]+$/.test(r);!r&&!o&&s!==""||(this.shouldMergeComment(r)?n.push(s):(i(),t.push(this.createSingleCommentBlock(s))))}return i(),t}shouldMergeComment(e){return!(!/^[-=_+*#]+$/.test(e)&&e.startsWith("--")||e.startsWith("/*")&&e.endsWith("*/")&&e.includes(`
16
- `))}createMultiLineCommentBlock(e){let t=[];for(let i of e){let s=i.trim();if(s.startsWith("/*")&&s.endsWith("*/")){let r=s.slice(2,-2);if(r.trim()){let l=r.replace(/\*\//g,"*").replace(/\/\*/g,"*").split(`
17
- `).map(u=>u.trim()).filter(u=>u);t.push(...l)}}else if(s){let o=s.replace(/\*\//g,"*").replace(/\/\*/g,"*").split(`
18
- `).map(l=>l.trim()).filter(l=>l);t.push(...o)}}let n=new m(0,"","CommentBlock");if(t.length===0){let i=new m(6,"/* */");n.innerTokens.push(i)}else{let i=new m(6,"/*");n.innerTokens.push(i),n.innerTokens.push(new m(12,""));for(let r of t){let o=new m(6,` ${r}`);n.innerTokens.push(o),n.innerTokens.push(new m(12,""))}let s=new m(6,"*/");n.innerTokens.push(s)}return n.innerTokens.push(new m(12,"")),n.innerTokens.push(new m(10," ")),n}createHeaderMultiLineCommentBlock(e){let t=e,n=new m(0,"","CommentBlock");if(t.length===0){let i=new m(6,"/* */");n.innerTokens.push(i)}else{let i=new m(6,"/*");n.innerTokens.push(i),n.innerTokens.push(new m(12,""));for(let r of t){let o=r.replace(/\*\//g,"*").replace(/\/\*/g,"*"),l=new m(6,` ${o}`);n.innerTokens.push(l),n.innerTokens.push(new m(12,""))}let s=new m(6,"*/");n.innerTokens.push(s)}return n.innerTokens.push(new m(12,"")),n.innerTokens.push(new m(10," ")),n}createSingleCommentBlock(e){let t=new m(0,"","CommentBlock"),n=new m(6,this.formatComment(e));t.innerTokens.push(n);let i=new m(12,"");t.innerTokens.push(i);let s=new m(10," ");return t.innerTokens.push(s),t}formatComment(e){let t=e.trim();return this.commentStyle==="smart"?this.formatCommentSmart(t):t.startsWith("--")&&!/^--[-=_+*#]*$/.test(t)?t:t.startsWith("/*")&&t.endsWith("*/")?this.formatBlockComment(t):this.formatBlockComment(t)}formatCommentSmart(e){return this.formatBlockComment(e)}insertCommentBlocksWithSpacing(e,t){if(e.containerType==="SelectItem"){e.innerTokens.length>0&&e.innerTokens[e.innerTokens.length-1].type!==10&&e.innerTokens.push(a.SPACE_TOKEN),e.innerTokens.push(...t);return}if(e.containerType==="SelectClause"){e.innerTokens.unshift(a.SPACE_TOKEN,...t);return}if(e.containerType==="IdentifierString"){e.innerTokens.length>0&&e.innerTokens[e.innerTokens.length-1].type!==10&&e.innerTokens.push(a.SPACE_TOKEN),e.innerTokens.push(...t);return}if(e.innerTokens.unshift(...t),this.shouldAddSeparatorSpace(e.containerType)){let i=new m(10," ");e.innerTokens.splice(t.length,0,i),e.innerTokens.length>t.length+1&&e.innerTokens[t.length+1].type===10&&e.innerTokens.splice(t.length+1,1)}else e.innerTokens.length>t.length&&e.innerTokens[t.length].type===10&&e.innerTokens.splice(t.length,1)}addPositionedCommentsToParenExpression(e,t){if(!t.positionedComments)return;let n=t.getPositionedComments("before");if(n.length>0){let s=this.createCommentBlocks(n),r=1;for(let o of s)e.innerTokens.splice(r,0,o),r++}let i=t.getPositionedComments("after");if(i.length>0){let s=this.createCommentBlocks(i),r=e.innerTokens.length;for(let o of s)e.innerTokens.splice(r-1,0,o)}}shouldAddSeparatorSpace(e){return this.isClauseLevelContainer(e)}isClauseLevelContainer(e){switch(e){case"SelectClause":case"FromClause":case"WhereClause":case"GroupByClause":case"HavingClause":case"OrderByClause":case"LimitClause":case"OffsetClause":case"WithClause":case"SimpleSelectQuery":return!0;default:return!1}}formatBlockComment(e){let t=e.replace(/\*\//g,"*").replace(/\/\*/g,"*"),n=t.trim();return/^[-=_+*#]+$/.test(n)?`/* ${n} */`:(t=t.replace(/\r?\n/g," ").replace(/\s+/g," ").trim(),t?`/* ${t} */`:"")}visitValueList(e){let t=new m(0,"","ValueList");for(let n=0;n<e.values.length;n++)n>0&&t.innerTokens.push(...a.argumentCommaSpaceTokens()),t.innerTokens.push(this.visit(e.values[n]));return t}visitColumnReference(e){let t=new m(0,"","ColumnReference");return t.innerTokens.push(e.qualifiedName.accept(this)),this.addComponentComments(t,e),t}visitFunctionCall(e){let t=new m(0,"","FunctionCall");if(this.addComponentComments(t,e),t.innerTokens.push(e.qualifiedName.accept(this)),t.innerTokens.push(a.PAREN_OPEN_TOKEN),e.argument&&t.innerTokens.push(this.visit(e.argument)),e.internalOrderBy&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.internalOrderBy))),e.comments&&e.comments.length>0){let n=new m(4,")");this.addCommentsToToken(n,e.comments),t.innerTokens.push(n),e.comments=null}else t.innerTokens.push(a.PAREN_CLOSE_TOKEN);return e.withOrdinality&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"with ordinality"))),e.over&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"over")),e.over instanceof I?(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.over.accept(this))):(t.innerTokens.push(a.PAREN_OPEN_TOKEN),t.innerTokens.push(this.visit(e.over)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN))),t}visitUnaryExpression(e){let t=new m(0,"","UnaryExpression");return t.innerTokens.push(this.visit(e.operator)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.expression)),t}visitBinaryExpression(e){let t=new m(0,"","BinaryExpression");t.innerTokens.push(this.visit(e.left)),t.innerTokens.push(a.SPACE_TOKEN);let n=this.visit(e.operator),i=n.text.toLowerCase();return(i==="and"||i==="or")&&(n.type=5),t.innerTokens.push(n),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.right)),t}visitLiteralValue(e){let t;e.value===null?t="null":e.isStringLiteral?t=`'${e.value.replace(/'/g,"''")}'`:typeof e.value=="string"?t=e.value:t=e.value.toString();let n=new m(2,t,"LiteralValue");return e.positionedComments&&e.positionedComments.length>0?(this.addPositionedCommentsToToken(n,e),e.positionedComments=null):e.comments&&e.comments.length>0&&this.addCommentsToToken(n,e.comments),n}visitParameterExpression(e){e.index=this.index;let t=this.parameterDecorator.decorate(e.name.value,e.index),n=new m(7,t);return this.addComponentComments(n,e),this.index++,n}visitSwitchCaseArgument(e){let t=new m(0,"","SwitchCaseArgument");this.addComponentComments(t,e);for(let n of e.cases)t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(n.accept(this));if(e.elseValue)t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.createElseToken(e.elseValue,e.comments));else if(e.comments&&e.comments.length>0){t.innerTokens.push(a.SPACE_TOKEN);let n=this.createInlineCommentSequence(e.comments);t.innerTokens.push(...n)}return t}createElseToken(e,t){let n=new m(0,"","ElseClause");if(n.innerTokens.push(new m(1,"else")),t&&t.length>0){n.innerTokens.push(a.SPACE_TOKEN);let s=this.createInlineCommentSequence(t);n.innerTokens.push(...s)}n.innerTokens.push(a.SPACE_TOKEN);let i=new m(0,"","CaseElseValue");return i.innerTokens.push(this.visit(e)),n.innerTokens.push(i),n}visitCaseKeyValuePair(e){let t=new m(0,"","CaseKeyValuePair");if(e.positionedComments&&e.positionedComments.length>0&&(this.addPositionedCommentsToToken(t,e),e.positionedComments=null),t.innerTokens.push(new m(1,"when")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.key)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"then")),e.comments&&e.comments.length>0){t.innerTokens.push(a.SPACE_TOKEN);let i=this.createInlineCommentSequence(e.comments);t.innerTokens.push(...i)}t.innerTokens.push(a.SPACE_TOKEN);let n=new m(0,"","CaseThenValue");return n.innerTokens.push(this.visit(e.value)),t.innerTokens.push(n),t}visitRawString(e){return new m(2,e.value,"RawString")}visitIdentifierString(e){let t=e.name==="*"?e.name:this.identifierDecorator.decorate(e.name);if(e.positionedComments&&e.positionedComments.length>0){let i=new m(0,"","IdentifierString");this.addPositionedCommentsToToken(i,e),e.positionedComments=null;let s=new m(2,t);return i.innerTokens.push(s),i}if(e.comments&&e.comments.length>0){let i=new m(0,"","IdentifierString"),s=new m(2,t);return i.innerTokens.push(s),this.addComponentComments(i,e),i}return new m(2,t,"IdentifierString")}visitParenExpression(e){let t=new m(0,"","ParenExpression"),n=e.positionedComments&&e.positionedComments.length>0,i=e.expression.positionedComments&&e.expression.positionedComments.length>0,s=[],r=[];if(i&&(s=e.expression.getPositionedComments("before"),r=e.expression.getPositionedComments("after"),e.expression.positionedComments=null),t.innerTokens.push(a.PAREN_OPEN_TOKEN),t.innerTokens.push(this.visit(e.expression)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),s.length>0){let o=this.createCommentBlocks(s),l=1;for(let u of o)t.innerTokens.splice(l,0,u),l++}if(r.length>0){let o=this.createCommentBlocks(r),l=t.innerTokens.length;for(let u of o)t.innerTokens.splice(l-1,0,u)}return n&&(this.addPositionedCommentsToParenExpression(t,e),e.positionedComments=null),t}visitCastExpression(e){let t=new m(0,"","CastExpression");return t.innerTokens.push(this.visit(e.input)),t.innerTokens.push(new m(5,"::")),t.innerTokens.push(this.visit(e.castType)),t}visitCaseExpression(e){let t=new m(0,"","CaseExpression");return e.positionedComments&&e.positionedComments.length>0&&(this.addPositionedCommentsToToken(t,e),e.positionedComments=null),t.innerTokens.push(new m(1,"case")),e.condition&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.condition))),t.innerTokens.push(this.visit(e.switchCase)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"end")),t}visitArrayExpression(e){let t=new m(0,"","ArrayExpression");return t.innerTokens.push(new m(1,"array")),t.innerTokens.push(new m(4,"[")),t.innerTokens.push(this.visit(e.expression)),t.innerTokens.push(new m(4,"]")),t}visitArrayQueryExpression(e){let t=new m(0,"","ArrayExpression");return t.innerTokens.push(new m(1,"array")),t.innerTokens.push(new m(4,"(")),t.innerTokens.push(this.visit(e.query)),t.innerTokens.push(new m(4,")")),t}visitArraySliceExpression(e){let t=new m(0,"","ArrayExpression");return t.innerTokens.push(this.visit(e.array)),t.innerTokens.push(new m(4,"[")),e.startIndex&&t.innerTokens.push(this.visit(e.startIndex)),t.innerTokens.push(new m(5,":")),e.endIndex&&t.innerTokens.push(this.visit(e.endIndex)),t.innerTokens.push(new m(4,"]")),t}visitArrayIndexExpression(e){let t=new m(0,"","ArrayExpression");return t.innerTokens.push(this.visit(e.array)),t.innerTokens.push(new m(4,"[")),t.innerTokens.push(this.visit(e.index)),t.innerTokens.push(new m(4,"]")),t}visitBetweenExpression(e){let t=new m(0,"","BetweenExpression");return t.innerTokens.push(this.visit(e.expression)),t.innerTokens.push(a.SPACE_TOKEN),e.negated&&(t.innerTokens.push(new m(1,"not")),t.innerTokens.push(a.SPACE_TOKEN)),t.innerTokens.push(new m(1,"between")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.lower)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"and")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.upper)),t}visitStringSpecifierExpression(e){let t=e.specifier.accept(this).text,n=e.value.accept(this).text;return new m(2,t+n,"StringSpecifierExpression")}visitTypeValue(e){let t=new m(0,"","TypeValue");return this.addComponentComments(t,e),t.innerTokens.push(e.qualifiedName.accept(this)),e.argument&&(t.innerTokens.push(a.PAREN_OPEN_TOKEN),t.innerTokens.push(this.visit(e.argument)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN)),t}visitTupleExpression(e){let t=new m(0,"","TupleExpression");t.innerTokens.push(a.PAREN_OPEN_TOKEN);for(let n=0;n<e.values.length;n++)n>0&&t.innerTokens.push(...a.argumentCommaSpaceTokens()),t.innerTokens.push(this.visit(e.values[n]));return t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitWindowFrameExpression(e){let t=new m(0,"","WindowFrameExpression"),n=!0;return e.partition&&(t.innerTokens.push(this.visit(e.partition)),n=!1),e.order&&(n?n=!1:t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.order))),e.frameSpec&&(n?n=!1:t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.frameSpec))),t}visitWindowFrameSpec(e){let t=new m(0,"","WindowFrameSpec");return t.innerTokens.push(new m(1,e.frameType)),e.endBound===null?(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.startBound.accept(this))):(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"between")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.startBound.accept(this)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"and")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.endBound.accept(this))),t}visitWindowFrameBoundaryValue(e){let t=new m(0,"","WindowFrameBoundaryValue");return t.innerTokens.push(e.value.accept(this)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,e.isFollowing?"following":"preceding")),t}visitWindowFrameBoundStatic(e){return new m(1,e.bound)}visitSelectItem(e){let t=new m(0,"","SelectItem"),n=e.positionedComments,i=e.value.positionedComments;e.value.positionedComments=null;let s=e.getPositionedComments("before");if(s.length>0){let h=this.createInlineCommentSequence(s);t.innerTokens.push(...h),t.innerTokens.push(a.SPACE_TOKEN)}t.innerTokens.push(this.visit(e.value));let r=e.getPositionedComments("after"),o=e.value.constructor.name==="ParenExpression";if(r.length>0&&!o){t.innerTokens.push(a.SPACE_TOKEN);let h=this.createInlineCommentSequence(r);t.innerTokens.push(...h)}if(e.positionedComments=n,e.value.positionedComments=i,!e.identifier)return t;if(e.value instanceof b){let h=e.value.column.name;if(e.identifier.name===h)return t}t.innerTokens.push(a.SPACE_TOKEN);let l="asKeywordPositionedComments"in e?e.asKeywordPositionedComments:null;if(l){let h=l.filter(C=>C.position==="before");if(h.length>0)for(let C of h){let f=this.createInlineCommentSequence(C.comments);t.innerTokens.push(...f),t.innerTokens.push(a.SPACE_TOKEN)}}if(t.innerTokens.push(new m(1,"as")),l){let h=l.filter(C=>C.position==="after");if(h.length>0){t.innerTokens.push(a.SPACE_TOKEN);for(let C of h){let f=this.createInlineCommentSequence(C.comments);t.innerTokens.push(...f)}}}let u="asKeywordComments"in e?e.asKeywordComments:null;if(u&&u.length>0){t.innerTokens.push(a.SPACE_TOKEN);let h=this.createInlineCommentSequence(u);t.innerTokens.push(...h)}t.innerTokens.push(a.SPACE_TOKEN);let c=this.visit(e.identifier);t.innerTokens.push(c);let p="aliasPositionedComments"in e?e.aliasPositionedComments:null;if(p){let h=p.filter(C=>C.position==="after");if(h.length>0){t.innerTokens.push(a.SPACE_TOKEN);for(let C of h){let f=this.createInlineCommentSequence(C.comments);t.innerTokens.push(...f)}}}let d=e.aliasComments;if(d&&d.length>0){t.innerTokens.push(a.SPACE_TOKEN);let h=this.createInlineCommentSequence(d);t.innerTokens.push(...h)}return t}visitSelectClause(e){let t=new m(1,"select","SelectClause");e.positionedComments&&e.positionedComments.length>0&&(this.addPositionedCommentsToToken(t,e),e.positionedComments=null);let n="select";for(let i of e.hints)n+=" "+this.visit(i).text;if(e.distinct){let i=e.distinct.accept(this);if(i.innerTokens&&i.innerTokens.length>0){let s=i.text;for(let r of i.innerTokens)s+=this.flattenTokenText(r);n+=" "+s}else n+=" "+i.text}t.text=n,t.innerTokens.push(a.SPACE_TOKEN);for(let i=0;i<e.items.length;i++)i>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(this.visit(e.items[i]));return t}flattenTokenText(e){let t=e.text;if(e.innerTokens)for(let n of e.innerTokens)t+=this.flattenTokenText(n);return t}visitHintClause(e){return new m(2,e.getFullHint())}visitDistinct(e){let t=new m(1,"distinct");return e.positionedComments&&e.positionedComments.length>0&&(this.addPositionedCommentsToToken(t,e),e.positionedComments=null),t}visitDistinctOn(e){let t=new m(0,"","DistinctOn");return t.innerTokens.push(new m(1,"distinct on")),t.innerTokens.push(a.PAREN_OPEN_TOKEN),t.innerTokens.push(e.value.accept(this)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitTableSource(e){let t="";Array.isArray(e.namespaces)&&e.namespaces.length>0&&(t=e.namespaces.map(i=>i.accept(this).text).join(".")+"."),t+=e.table.accept(this).text;let n=new m(2,t);return this.addComponentComments(n,e),e.identifier&&(e.identifier.name,e.table.name),n}visitSourceExpression(e){let t=new m(0,"","SourceExpression");if(t.innerTokens.push(e.datasource.accept(this)),!e.aliasExpression)return t;if(e.datasource instanceof O){let n=e.datasource.table.name;return e.aliasExpression.table.name===n||(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"as")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.aliasExpression.accept(this))),t}else return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"as")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.aliasExpression.accept(this)),t}visitFromClause(e){let t=new m(1,"from","FromClause");if(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.source)),e.joins)for(let n=0;n<e.joins.length;n++)t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.joins[n]));return t}visitJoinClause(e){let t=new m(0,"","JoinClause"),n=e.joinKeywordPositionedComments;if(n){let s=n.filter(r=>r.position==="before");if(s.length>0)for(let r of s){let o=this.createInlineCommentSequence(r.comments);t.innerTokens.push(...o),t.innerTokens.push(a.SPACE_TOKEN)}}if(t.innerTokens.push(new m(1,e.joinType.value)),n){let s=n.filter(r=>r.position==="after");if(s.length>0){t.innerTokens.push(a.SPACE_TOKEN);for(let r of s){let o=this.createInlineCommentSequence(r.comments);t.innerTokens.push(...o)}}}let i=e.joinKeywordComments;if(i&&i.length>0){t.innerTokens.push(a.SPACE_TOKEN);let s=this.createInlineCommentSequence(i);t.innerTokens.push(...s)}return e.lateral&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"lateral"))),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.source)),e.condition&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.condition))),t}visitJoinOnClause(e){let t=new m(0,"","JoinOnClause");return t.innerTokens.push(new m(1,"on")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.condition)),t}visitJoinUsingClause(e){let t=new m(0,"","JoinUsingClause");return t.innerTokens.push(new m(1,"using")),t.innerTokens.push(a.PAREN_OPEN_TOKEN),t.innerTokens.push(this.visit(e.condition)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitFunctionSource(e){let t=new m(0,"","FunctionSource");return t.innerTokens.push(e.qualifiedName.accept(this)),t.innerTokens.push(a.PAREN_OPEN_TOKEN),e.argument&&t.innerTokens.push(this.visit(e.argument)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitSourceAliasExpression(e){let t=new m(0,"","SourceAliasExpression");if(t.innerTokens.push(this.visit(e.table)),e.columns){t.innerTokens.push(a.PAREN_OPEN_TOKEN);for(let n=0;n<e.columns.length;n++)n>0&&t.innerTokens.push(...a.argumentCommaSpaceTokens()),t.innerTokens.push(this.visit(e.columns[n]));t.innerTokens.push(a.PAREN_CLOSE_TOKEN)}return e.positionedComments&&e.positionedComments.length>0?(this.addPositionedCommentsToToken(t,e),e.positionedComments=null):e.comments&&e.comments.length>0&&this.addCommentsToToken(t,e.comments),t}visitWhereClause(e){let t=new m(1,"where","WhereClause");return this.addComponentComments(t,e),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.condition)),t}visitGroupByClause(e){let t=new m(1,"group by","GroupByClause");t.innerTokens.push(a.SPACE_TOKEN);for(let n=0;n<e.grouping.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(this.visit(e.grouping[n]));return t}visitHavingClause(e){let t=new m(1,"having","HavingClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.condition)),t}visitWindowClause(e){let t=new m(1,"window","WindowClause");t.innerTokens.push(a.SPACE_TOKEN);for(let n=0;n<e.windows.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(this.visit(e.windows[n]));return t}visitWindowFrameClause(e){let t=new m(0,"","WindowFrameClause");return t.innerTokens.push(e.name.accept(this)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"as")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(a.PAREN_OPEN_TOKEN),t.innerTokens.push(this.visit(e.expression)),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitLimitClause(e){let t=new m(1,"limit","LimitClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.value)),t}visitOffsetClause(e){let t=new m(1,"offset","OffsetClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.value)),t}visitFetchClause(e){let t=new m(1,"fetch","FetchClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.expression)),t}visitFetchExpression(e){let t=new m(0,"","FetchExpression");return t.innerTokens.push(new m(1,e.type)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.count.accept(this)),e.unit&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,e.unit))),t}visitForClause(e){let t=new m(1,"for","ForClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,e.lockMode)),t}visitWithClause(e){let t=new m(1,"with","WithClause");t.innerTokens.push(a.SPACE_TOKEN),e.recursive&&(t.innerTokens.push(new m(1,"recursive")),t.innerTokens.push(a.SPACE_TOKEN));for(let n=0;n<e.tables.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(e.tables[n].accept(this));return t.innerTokens.push(a.SPACE_TOKEN),this.addComponentComments(t,e),t}visitCommonTable(e){let t=new m(0,"","CommonTable");e.positionedComments&&e.positionedComments.length>0?(this.addPositionedCommentsToToken(t,e),e.positionedComments=null):e.comments&&e.comments.length>0&&this.addCommentsToToken(t,e.comments),t.innerTokens.push(e.aliasExpression.accept(this)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"as")),t.innerTokens.push(a.SPACE_TOKEN),e.materialized!==null&&(e.materialized?t.innerTokens.push(new m(1,"materialized")):t.innerTokens.push(new m(1,"not materialized")),t.innerTokens.push(a.SPACE_TOKEN)),t.innerTokens.push(a.PAREN_OPEN_TOKEN);let n=new m(0,"","SubQuerySource");return n.innerTokens.push(e.query.accept(this)),t.innerTokens.push(n),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitSimpleQuery(e){let t=new m(0,"","SimpleSelectQuery");if(e.headerComments&&e.headerComments.length>0){if(this.commentStyle==="smart"&&e.headerComments.length>1){let n=this.createHeaderMultiLineCommentBlock(e.headerComments);t.innerTokens.push(n)}else{let n=this.createCommentBlocks(e.headerComments);t.innerTokens.push(...n)}e.withClause&&t.innerTokens.push(a.SPACE_TOKEN)}if(e.positionedComments&&e.positionedComments.length>0&&(this.addPositionedCommentsToToken(t,e),e.positionedComments=null),e.withClause&&t.innerTokens.push(e.withClause.accept(this)),e.comments&&e.comments.length>0){let n=this.createCommentBlocks(e.comments);t.innerTokens.push(...n),e.selectClause&&t.innerTokens.push(a.SPACE_TOKEN)}return t.innerTokens.push(e.selectClause.accept(this)),e.fromClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.fromClause.accept(this)),e.whereClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.whereClause.accept(this))),e.groupByClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.groupByClause.accept(this))),e.havingClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.havingClause.accept(this))),e.orderByClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.orderByClause.accept(this))),e.windowClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.windowClause.accept(this))),e.limitClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.limitClause.accept(this))),e.offsetClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.offsetClause.accept(this))),e.fetchClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.fetchClause.accept(this))),e.forClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.forClause.accept(this)))),t}visitSubQuerySource(e){let t=new m(0,"");t.innerTokens.push(a.PAREN_OPEN_TOKEN);let n=new m(0,"","SubQuerySource");return n.innerTokens.push(e.query.accept(this)),t.innerTokens.push(n),t.innerTokens.push(a.PAREN_CLOSE_TOKEN),t}visitValuesQuery(e){let t=new m(1,"values","ValuesQuery");if(e.headerComments&&e.headerComments.length>0){let i=this.createCommentBlocks(e.headerComments);for(let s of i)t.innerTokens.push(s),t.innerTokens.push(a.SPACE_TOKEN)}t.innerTokens.push(a.SPACE_TOKEN);let n=new m(0,"","Values");for(let i=0;i<e.tuples.length;i++)i>0&&n.innerTokens.push(...a.commaSpaceTokens()),n.innerTokens.push(e.tuples[i].accept(this));return t.innerTokens.push(n),this.addCommentsToToken(t,e.comments),t}visitInlineQuery(e){let t=new m(0,"");t.innerTokens.push(a.PAREN_OPEN_TOKEN);let n=new m(0,"","InlineQuery");if(n.innerTokens.push(e.selectQuery.accept(this)),t.innerTokens.push(n),e.comments&&e.comments.length>0){let i=new m(4,")");this.addCommentsToToken(i,e.comments),t.innerTokens.push(i),e.comments=null}else t.innerTokens.push(a.PAREN_CLOSE_TOKEN);return t}visitInsertQuery(e){let t=new m(0,"","InsertQuery");return t.innerTokens.push(this.visit(e.insertClause)),e.selectQuery&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(this.visit(e.selectQuery))),t}visitInsertClause(e){let t=new m(0,"");if(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"insert into")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.source.accept(this)),e.columns.length>0){t.innerTokens.push(a.PAREN_OPEN_TOKEN);for(let n=0;n<e.columns.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(e.columns[n].accept(this));t.innerTokens.push(a.PAREN_CLOSE_TOKEN)}return t}visitUpdateQuery(e){let t=new m(0,"","UpdateQuery");return e.withClause&&t.innerTokens.push(e.withClause.accept(this)),t.innerTokens.push(e.updateClause.accept(this)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.setClause.accept(this)),e.fromClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.fromClause.accept(this))),e.whereClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.whereClause.accept(this))),e.returningClause&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.returningClause.accept(this))),t}visitUpdateClause(e){let t=new m(1,"update","UpdateClause");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.source.accept(this)),t}visitSetClause(e){let t=new m(1,"set","SelectClause");t.innerTokens.push(a.SPACE_TOKEN);for(let n=0;n<e.items.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(this.visit(e.items[n]));return t}visitSetClauseItem(e){let t=new m(0,"","SetClauseItem");return t.innerTokens.push(e.column.accept(this)),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(5,"=")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.value.accept(this)),t}visitReturningClause(e){let t=new m(1,"returning","ReturningClause");t.innerTokens.push(a.SPACE_TOKEN);for(let n=0;n<e.columns.length;n++)n>0&&t.innerTokens.push(...a.commaSpaceTokens()),t.innerTokens.push(this.visit(e.columns[n]));return t}visitCreateTableQuery(e){let t=new m(1,e.isTemporary?"create temporary table":"create table","CreateTableQuery");return t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.tableName.accept(this)),e.asSelectQuery&&(t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(new m(1,"as")),t.innerTokens.push(a.SPACE_TOKEN),t.innerTokens.push(e.asSelectQuery.accept(this))),t}};var zt=class{constructor(e=" ",t=0,n=`\r
19
- `,i="none"){this.indentChar=e,this.indentSize=t,this.newline=n,this.commaBreak=i,this.lines=[],this.appendNewline(0)}print(){let e="";for(let t of this.lines)t.text!==""&&(e+=this.indent(t.level)+t.text);return e.trimEnd()}indent(e){return this.indentChar.repeat(this.indentSize*e)}appendNewline(e){if(this.lines.length>0){let t=this.lines[this.lines.length-1];t.text!==""&&(t.text=t.text.trimEnd()+this.newline)}this.lines.push(new Ci(e,""))}appendText(e){if(this.cleanupLine(e)){let n=this.lines[this.lines.length-1];n.text=n.text.trimEnd()+e;return}let t=this.getCurrentLine();e===" "&&t.text===""||(t.text+=e)}cleanupLine(e){let t=this.getCurrentLine();return e===","&&t.text.trim()===""&&this.lines.length>1&&(this.commaBreak==="after"||this.commaBreak==="none")?(this.lines.pop(),!0):!1}getCurrentLine(){if(this.lines.length>0)return this.lines[this.lines.length-1];throw new Error("No tokens to get current line from.")}isCurrentLineEmpty(){return this.lines.length>0?this.lines[this.lines.length-1].text.trim()==="":!0}},Ci=class{constructor(e,t){this.level=e,this.text=t}};var An=class a{constructor(e){this.insideWithClause=!1;this.indentChar=e?.indentChar??"",this.indentSize=e?.indentSize??0,this.newline=e?.newline??" ",this.commaBreak=e?.commaBreak??"none",this.cteCommaBreak=e?.cteCommaBreak??this.commaBreak,this.andBreak=e?.andBreak??"none",this.keywordCase=e?.keywordCase??"none",this.exportComment=e?.exportComment??!1,this.strictCommentPlacement=e?.strictCommentPlacement??!1,this.withClauseStyle=e?.withClauseStyle??"standard",this.commentStyle=e?.commentStyle??"block",this.parenthesesOneLine=e?.parenthesesOneLine??!1,this.betweenOneLine=e?.betweenOneLine??!1,this.valuesOneLine=e?.valuesOneLine??!1,this.joinOneLine=e?.joinOneLine??!1,this.caseOneLine=e?.caseOneLine??!1,this.subqueryOneLine=e?.subqueryOneLine??!1,this.linePrinter=new zt(this.indentChar,this.indentSize,this.newline,this.commaBreak),this.indentIncrementContainers=new Set(e?.indentIncrementContainerTypes??["SelectClause","FromClause","WhereClause","GroupByClause","HavingClause","WindowFrameExpression","PartitionByClause","OrderByClause","WindowClause","LimitClause","OffsetClause","SubQuerySource","BinarySelectQueryOperator","Values","WithClause","SwitchCaseArgument","CaseKeyValuePair","CaseThenValue","ElseClause","CaseElseValue","SimpleSelectQuery"])}print(e,t=0){return this.linePrinter=new zt(this.indentChar,this.indentSize,this.newline,this.commaBreak),this.insideWithClause=!1,this.linePrinter.lines.length>0&&t!==this.linePrinter.lines[0].level&&(this.linePrinter.lines[0].level=t),this.appendToken(e,t,void 0,0),this.linePrinter.print()}appendToken(e,t,n,i=0){let s=this.insideWithClause;if(e.containerType==="WithClause"&&this.withClauseStyle==="full-oneline"&&(this.insideWithClause=!0),this.shouldSkipToken(e))return;let r=this.linePrinter.getCurrentLine(),l=this.isCaseContext(e.containerType)?i+1:i;if(e.type===1)this.handleKeywordToken(e,t,n,i);else if(e.type===3)this.handleCommaToken(e,t,n);else if(e.type===5&&e.text.toLowerCase()==="and")this.handleAndOperatorToken(e,t,n,i);else if(e.containerType==="JoinClause")this.handleJoinClauseToken(e,t);else if(e.type===6)this.exportComment&&this.linePrinter.appendText(e.text);else if(e.type===10)this.handleSpaceToken(e,n);else if(e.type===12)this.handleCommentNewlineToken(e,t);else if(e.containerType==="CommonTable"&&this.withClauseStyle==="cte-oneline"){this.handleCteOnelineToken(e,t);return}else if(e.containerType==="ParenExpression"&&this.parenthesesOneLine||e.containerType==="BetweenExpression"&&this.betweenOneLine||e.containerType==="Values"&&this.valuesOneLine||e.containerType==="JoinOnClause"&&this.joinOneLine||e.containerType==="CaseExpression"&&this.caseOneLine||e.containerType==="InlineQuery"&&this.subqueryOneLine){this.handleOnelineToken(e,t);return}else this.linePrinter.appendText(e.text);if(e.keywordTokens&&e.keywordTokens.length>0)for(let c=0;c<e.keywordTokens.length;c++){let p=e.keywordTokens[c];this.appendToken(p,t,e.containerType,l)}let u=t;!this.isOnelineMode()&&r.text!==""&&this.indentIncrementContainers.has(e.containerType)&&(this.insideWithClause&&this.withClauseStyle==="full-oneline"||(u++,this.linePrinter.appendNewline(u)));for(let c=0;c<e.innerTokens.length;c++){let p=e.innerTokens[c];this.appendToken(p,u,e.containerType,l)}if(e.containerType==="WithClause"&&this.withClauseStyle==="full-oneline"){this.insideWithClause=!1,this.linePrinter.appendNewline(t);return}u!==t&&(this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(t))}isCaseContext(e){switch(e){case"CaseExpression":case"CaseKeyValuePair":case"CaseThenValue":case"CaseElseValue":case"SwitchCaseArgument":return!0;default:return!1}}shouldSkipToken(e){return e.type===12?!1:(!e.innerTokens||e.innerTokens.length===0)&&e.text===""}applyKeywordCase(e){return this.keywordCase==="upper"?e.toUpperCase():this.keywordCase==="lower"?e.toLowerCase():e}handleKeywordToken(e,t,n,i=0){if(e.text.toLowerCase()==="and"&&this.andBreak!=="none"){this.handleAndOperatorToken(e,t,n,i);return}let r=this.applyKeywordCase(e.text);if(i>0){this.linePrinter.appendText(r);return}this.linePrinter.appendText(r)}handleCommaToken(e,t,n){let i=e.text,s=n==="WithClause",r=s?this.cteCommaBreak:this.commaBreak;if(this.insideWithClause&&this.withClauseStyle==="full-oneline")this.linePrinter.appendText(i);else if(this.withClauseStyle==="cte-oneline"&&s)this.linePrinter.appendText(i),this.linePrinter.appendNewline(t);else if(r==="before"){let o=this.linePrinter.commaBreak;o!=="before"&&(this.linePrinter.commaBreak="before"),this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(t),this.linePrinter.appendText(i),o!=="before"&&(this.linePrinter.commaBreak=o)}else r==="after"?(this.linePrinter.appendText(i),this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(t)):this.linePrinter.appendText(i)}handleAndOperatorToken(e,t,n,i=0){let s=this.applyKeywordCase(e.text);if(i>0){this.linePrinter.appendText(s);return}this.andBreak==="before"?(this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(t),this.linePrinter.appendText(s)):this.andBreak==="after"?(this.linePrinter.appendText(s),this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(t)):this.linePrinter.appendText(s)}handleJoinClauseToken(e,t){let n=this.applyKeywordCase(e.text);this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(t),this.linePrinter.appendText(n)}handleSpaceToken(e,t){if(this.shouldSkipCommentBlockSpace(t)){let n=this.linePrinter.getCurrentLine();n.text!==""&&!n.text.endsWith(" ")&&this.linePrinter.appendText(" ");return}this.linePrinter.appendText(e.text)}shouldSkipCommentBlockSpace(e){return e==="CommentBlock"&&this.insideWithClause&&this.withClauseStyle==="full-oneline"}handleCommentNewlineToken(e,t){this.shouldSkipCommentNewline()||this.isOnelineMode()||this.linePrinter.appendNewline(t)}shouldSkipCommentNewline(){return this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.withClauseStyle==="cte-oneline"}isOnelineMode(){return this.newline===" "}handleCteOnelineToken(e,t){let i=this.createCteOnelinePrinter().print(e,t),s=this.cleanDuplicateSpaces(i);s=s.replace(/\(\s+/g,"(").replace(/\s+\)/g," )"),this.linePrinter.appendText(s.trim())}createCteOnelinePrinter(){return new a({indentChar:"",indentSize:0,newline:" ",commaBreak:this.commaBreak,cteCommaBreak:this.cteCommaBreak,andBreak:this.andBreak,keywordCase:this.keywordCase,exportComment:!1,strictCommentPlacement:this.strictCommentPlacement,withClauseStyle:"standard"})}handleOnelineToken(e,t){let i=this.createOnelinePrinter().print(e,t),s=this.cleanDuplicateSpaces(i);this.linePrinter.appendText(s)}createOnelinePrinter(){return new a({indentChar:"",indentSize:0,newline:" ",commaBreak:"none",cteCommaBreak:this.cteCommaBreak,andBreak:"none",keywordCase:this.keywordCase,exportComment:this.exportComment,strictCommentPlacement:this.strictCommentPlacement,withClauseStyle:"standard",parenthesesOneLine:!1,betweenOneLine:!1,valuesOneLine:!1,joinOneLine:!1,caseOneLine:!1,subqueryOneLine:!1})}cleanDuplicateSpaces(e){return e.replace(/\s{2,}/g," ")}};var Gu=["mysql","postgres","sqlserver","sqlite"],Be=class{constructor(e={}){let t=e.preset?Ni[e.preset]:void 0;if(e.preset&&!t)throw new Error(`Invalid preset: ${e.preset}`);let n={...t,identifierEscape:e.identifierEscape??t?.identifierEscape,parameterSymbol:e.parameterSymbol??t?.parameterSymbol,parameterStyle:e.parameterStyle??t?.parameterStyle};this.parser=new Ln({...n,commentStyle:e.commentStyle}),this.printer=new An({...e,parenthesesOneLine:e.parenthesesOneLine,betweenOneLine:e.betweenOneLine,valuesOneLine:e.valuesOneLine,joinOneLine:e.joinOneLine,caseOneLine:e.caseOneLine,subqueryOneLine:e.subqueryOneLine})}format(e){let{token:t,params:n}=this.parser.parse(e);return{formattedSql:this.printer.print(t),params:n}}};var dt=class{constructor(){this.sqlFormatter=new Be({identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"})}format(e,t=null){return t&&(this.sqlFormatter=new Be(t)),this.sqlFormatter.format(e).formattedSql}formatWithParameters(e,t=null){t&&(this.sqlFormatter=new Be(t));let n=this.sqlFormatter.format(e);return{sql:n.formattedSql,params:n.params}}visit(e){return this.format(e)}};var Nn=class{constructor(){this.sourceCollector=new Ge(!0),this.cteCollector=new X,this.formatter=new dt}build(e){if(e.length===0)return new ae(!1,e);let t=this.resolveDuplicateNames(e),{tableMap:n,recursiveCTEs:i,dependencies:s}=this.buildDependencyGraph(t),r=this.sortCommonTables(t,n,i,s);return new ae(i.size>0,r)}resolveDuplicateNames(e){let t=new Map;for(let i of e){let s=i.aliasExpression.table.name;t.has(s)||t.set(s,[]),t.get(s).push(i)}let n=[];for(let[i,s]of Array.from(t.entries())){if(s.length===1){n.push(s[0]);continue}let r=s.map(l=>this.formatter.format(l.query));if(new Set(r).size===1)n.push(s[0]);else throw new Error(`CTE name conflict detected: '${i}' has multiple different definitions`)}return n}buildDependencyGraph(e){let t=new Map;for(let r of e)t.set(r.aliasExpression.table.name,r);let n=new Set,i=new Map,s=new Map;for(let r of e){let o=r.aliasExpression.table.name,l=this.sourceCollector.collect(r.query);for(let c of l)if(c.table.name===o){n.add(o);break}i.has(o)||i.set(o,new Set);let u=this.cteCollector.collect(r.query);for(let c of u){let p=c.aliasExpression.table.name;t.has(p)&&(i.get(o).add(p),s.has(p)||s.set(p,new Set),s.get(p).add(o))}}return{tableMap:t,recursiveCTEs:n,dependencies:i}}sortCommonTables(e,t,n,i){let s=[],r=[],o=new Set,l=new Set,u=c=>{if(o.has(c))return;if(l.has(c))throw new Error(`Circular reference detected in CTE: ${c}`);l.add(c);let p=i.get(c)||new Set;for(let d of Array.from(p))u(d);l.delete(c),o.add(c),n.has(c)?s.push(t.get(c)):r.push(t.get(c))};for(let c of e){let p=c.aliasExpression.table.name;o.has(p)||u(p)}return[...s,...r]}};var Qn=class{constructor(){this.nameConflictResolver=new Nn,this.cteCollector=new X}inject(e,t){if(t.length===0)return e;t.push(...this.cteCollector.collect(e));let n=this.nameConflictResolver.build(t);if(e instanceof g)return this.injectIntoSimpleQuery(e,n);if(e instanceof Q)return this.injectIntoBinaryQuery(e,n);throw new Error("Unsupported query type")}injectIntoSimpleQuery(e,t){if(e.withClause)throw new Error("The query already has a WITH clause. Please remove it before injecting new CTEs.");return e.withClause=t,e}injectIntoBinaryQuery(e,t){if(e.left instanceof g)return this.injectIntoSimpleQuery(e.left,t),e;if(e.left instanceof Q)return this.injectIntoBinaryQuery(e.left,t),e;throw new Error("Unsupported query type for BinarySelectQuery left side")}};var st=class{constructor(){}static normalize(e){let n=new X().collect(e);return n.length===0?e:(new Lt().execute(e),new Qn().inject(e,n))}};var vt=(t=>(t.ColumnNameOnly="columnNameOnly",t.FullName="fullName",t))(vt||{}),ke=class a{constructor(e,t=!1,n="columnNameOnly",i){this.selectValues=[];this.visitedNodes=new Set;this.uniqueKeys=new Set;this.isRootVisit=!0;this.tableColumnResolver=null;this.commonTables=[];this.initializeProperties(e,t,n,i),this.initializeHandlers()}initializeProperties(e,t,n,i){this.tableColumnResolver=e??null,this.includeWildCard=t,this.commonTableCollector=new X,this.commonTables=[],this.duplicateDetection=n,this.options=i||{}}initializeHandlers(){this.handlers=new Map,this.handlers.set(g.kind,e=>this.visitSimpleSelectQuery(e)),this.handlers.set(Q.kind,e=>this.visitBinarySelectQuery(e)),this.initializeClauseHandlers(),this.initializeValueComponentHandlers()}initializeClauseHandlers(){this.handlers.set(q.kind,e=>this.visitSelectClause(e)),this.handlers.set(K.kind,e=>this.visitFromClause(e)),this.handlers.set(re.kind,e=>this.visitWhereClause(e)),this.handlers.set(me.kind,e=>this.visitGroupByClause(e)),this.handlers.set(de.kind,e=>this.visitHavingClause(e)),this.handlers.set(pe.kind,e=>this.visitOrderByClause(e)),this.handlers.set(Pe.kind,e=>this.visitWindowFrameClause(e)),this.handlers.set(oe.kind,e=>this.visitLimitClause(e)),this.handlers.set(Fe.kind,e=>this.offsetClause(e)),this.handlers.set(Ke.kind,e=>this.visitFetchClause(e)),this.handlers.set(he.kind,e=>this.visitJoinOnClause(e)),this.handlers.set(Se.kind,e=>this.visitJoinUsingClause(e))}initializeValueComponentHandlers(){this.handlers.set(b.kind,e=>this.visitColumnReference(e)),this.handlers.set(S.kind,e=>this.visitBinaryExpression(e)),this.handlers.set(ne.kind,e=>this.visitUnaryExpression(e)),this.handlers.set(U.kind,e=>this.visitFunctionCall(e)),this.handlers.set(ge.kind,e=>this.visitInlineQuery(e)),this.handlers.set(Z.kind,e=>this.visitParenExpression(e)),this.handlers.set(se.kind,e=>this.visitCaseExpression(e)),this.handlers.set(ce.kind,e=>this.visitCastExpression(e)),this.handlers.set(we.kind,e=>this.visitBetweenExpression(e)),this.handlers.set(ye.kind,e=>this.visitArrayExpression(e)),this.handlers.set(ve.kind,e=>this.visitArrayQueryExpression(e)),this.handlers.set(et.kind,e=>this.visitArraySliceExpression(e)),this.handlers.set(tt.kind,e=>this.visitArrayIndexExpression(e)),this.handlers.set(D.kind,e=>this.visitValueList(e)),this.handlers.set(Ve.kind,e=>this.visitWindowFrameExpression(e)),this.handlers.set(Ue.kind,e=>this.visitPartitionByClause(e))}getValues(){return this.selectValues}collect(e){if(!e)throw new Error("Input argument cannot be null or undefined");this.visit(e);let t=this.getValues();return this.reset(),t}reset(){this.selectValues=[],this.visitedNodes.clear(),this.uniqueKeys.clear(),this.commonTables=[]}addSelectValueAsUnique(e,t){let n=this.generateUniqueKey(e,t);this.uniqueKeys.has(n)||(this.uniqueKeys.add(n),this.selectValues.push({name:e,value:t}))}generateUniqueKey(e,t){if(this.duplicateDetection==="columnNameOnly")return this.normalizeColumnName(e);{let n="";t&&typeof t.getNamespace=="function"&&(n=t.getNamespace()||"");let i=n?n+"."+e:e;return this.normalizeColumnName(i)}}normalizeColumnName(e){if(typeof e!="string")throw new Error("Column name must be a string");return this.options.ignoreCaseAndUnderscore?e.toLowerCase().replace(/_/g,""):e}visit(e){if(!this.isRootVisit){this.visitNode(e);return}if(!(e instanceof g||e instanceof Q))throw new Error("Root visit requires a SimpleSelectQuery or BinarySelectQuery.");this.reset(),this.isRootVisit=!1,this.commonTables=this.commonTableCollector.collect(e);try{this.visitNode(e)}finally{this.isRootVisit=!0}}visitNode(e){if(!this.visitedNodes.has(e)){this.visitedNodes.add(e);try{let t=this.handlers.get(e.getKind());t&&t(e)}catch(t){let n=t instanceof Error?t.message:String(t);throw new Error(`Error processing SQL component of type ${e.getKind().toString()}: ${n}`)}}}visitSimpleSelectQuery(e){if(e.selectClause&&e.selectClause.accept(this),e.fromClause&&e.fromClause.accept(this),e.whereClause&&e.whereClause.accept(this),e.groupByClause&&e.groupByClause.accept(this),e.havingClause&&e.havingClause.accept(this),e.windowClause)for(let t of e.windowClause.windows)t.accept(this);e.orderByClause&&e.orderByClause.accept(this),e.limitClause&&e.limitClause.accept(this),e.offsetClause&&e.offsetClause.accept(this),e.fetchClause&&e.fetchClause.accept(this),e.forClause&&e.forClause.accept(this)}visitBinarySelectQuery(e){e.left instanceof g?this.visitSimpleSelectQuery(e.left):e.left instanceof Q&&this.visitBinarySelectQuery(e.left),e.right instanceof g?this.visitSimpleSelectQuery(e.right):e.right instanceof Q&&this.visitBinarySelectQuery(e.right)}visitSelectClause(e){for(let t of e.items)if(t.identifier)this.addSelectValueAsUnique(t.identifier.name,t.value);else if(t.value instanceof b){let n=t.value.column.name;n!=="*"?this.addSelectValueAsUnique(n,t.value):this.includeWildCard&&this.addSelectValueAsUnique(n,t.value)}else t.value.accept(this)}visitFromClause(e){let n=new _e(this.tableColumnResolver,this.commonTables).collect(e);for(let i of n)this.addSelectValueAsUnique(i.name,i.value);if(this.options.upstream&&this.collectUpstreamColumns(e),e.joins)for(let i of e.joins)i.condition&&i.condition.accept(this)}visitWhereClause(e){e.condition&&e.condition.accept(this)}visitGroupByClause(e){if(e.grouping)for(let t of e.grouping)t.accept(this)}visitHavingClause(e){e.condition&&e.condition.accept(this)}visitOrderByClause(e){if(e.order)for(let t of e.order)t.accept(this)}visitWindowFrameClause(e){e.expression.accept(this)}visitWindowFrameExpression(e){e.partition&&e.partition.accept(this),e.order&&e.order.accept(this),e.frameSpec&&e.frameSpec.accept(this)}visitLimitClause(e){e.value&&e.value.accept(this)}offsetClause(e){e.value&&e.value.accept(this)}visitFetchClause(e){e.expression&&e.expression.accept(this)}visitJoinOnClause(e){e.condition&&e.condition.accept(this)}visitJoinUsingClause(e){e.condition&&e.condition.accept(this)}visitColumnReference(e){if(e.column.name!=="*")this.addSelectValueAsUnique(e.column.name,e);else if(this.includeWildCard)this.addSelectValueAsUnique(e.column.name,e);else return}visitBinaryExpression(e){e.left&&e.left.accept(this),e.right&&e.right.accept(this)}visitUnaryExpression(e){e.expression&&e.expression.accept(this)}visitFunctionCall(e){e.argument&&e.argument.accept(this),e.over&&e.over.accept(this),e.withinGroup&&e.withinGroup.accept(this),e.internalOrderBy&&e.internalOrderBy.accept(this)}visitInlineQuery(e){e.selectQuery&&this.visitNode(e.selectQuery)}visitParenExpression(e){e.expression&&e.expression.accept(this)}visitCaseExpression(e){e.condition&&e.condition.accept(this),e.switchCase&&e.switchCase.accept(this)}visitCastExpression(e){e.input&&e.input.accept(this)}visitBetweenExpression(e){e.expression&&e.expression.accept(this),e.lower&&e.lower.accept(this),e.upper&&e.upper.accept(this)}visitArrayExpression(e){e.expression&&e.expression.accept(this)}visitArrayQueryExpression(e){e.query.accept(this)}visitArraySliceExpression(e){e.array&&e.array.accept(this),e.startIndex&&e.startIndex.accept(this),e.endIndex&&e.endIndex.accept(this)}visitArrayIndexExpression(e){e.array&&e.array.accept(this),e.index&&e.index.accept(this)}visitValueList(e){if(e.values&&Array.isArray(e.values))for(let t of e.values)t&&t.accept(this)}visitPartitionByClause(e){e.value.accept(this)}collectUpstreamColumns(e){if(this.collectAllAvailableCTEColumns(),this.collectUpstreamColumnsFromSource(e.source),e.joins)for(let t of e.joins)this.collectUpstreamColumnsFromSource(t.source)}collectUpstreamColumnsFromSource(e){if(e.datasource instanceof O){let t=this.findCTEByName(e.datasource.table.name);t?this.collectUpstreamColumnsFromCTE(t):this.collectUpstreamColumnsFromTable(e.datasource)}else e.datasource instanceof M?this.collectUpstreamColumnsFromSubquery(e.datasource):e.datasource instanceof $e&&this.collectUpstreamColumnsFromSource(new B(e.datasource.source,null))}collectUpstreamColumnsFromTable(e){if(this.tableColumnResolver){let t=e.table.name,n=this.tableColumnResolver(t);for(let i of n){let s=new b(e.table.name,i);this.addSelectValueAsUnique(i,s)}}}collectUpstreamColumnsFromSubquery(e){if(e.query instanceof g){let n=new a(this.tableColumnResolver,this.includeWildCard,this.duplicateDetection,{...this.options,upstream:!0}).collect(e.query);for(let i of n)this.addSelectValueAsUnique(i.name,i.value)}}collectUpstreamColumnsFromCTE(e){if(e.query instanceof g){let n=new a(this.tableColumnResolver,this.includeWildCard,this.duplicateDetection,{...this.options,upstream:!1}).collect(e.query);for(let i of n)i.name!=="*"&&this.addSelectValueAsUnique(i.name,i.value)}}collectAllAvailableCTEColumns(){for(let e of this.commonTables)this.collectUpstreamColumnsFromCTE(e)}findCTEByName(e){return this.commonTables.find(t=>t.getSourceAliasName()===e)||null}};var wt=class a{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The source component is complete but there are additional tokens.`);return i.value}static parseTableSourceFromLexemes(e,t){let n=Me.parseFromLexeme(e,t);return this.parseTableSource(n)}static parseFromLexeme(e,t){let n=t;if(n<e.length&&e[n].type&4)return this.parseParenSource(e,n);let i=Me.parseFromLexeme(e,n);return i.lastTokenType&2048?a.parseFunctionSource(e,i):a.parseTableSource(i)}static parseTableSource(e){let{namespaces:t,name:n,newIndex:i}=e,s=new O(t,n.name);return n.positionedComments&&n.positionedComments.length>0?s.positionedComments=n.positionedComments:n.comments&&n.comments.length>0&&(s.comments=n.comments),{value:s,newIndex:i}}static parseFunctionSource(e,t){let n=t.newIndex,{namespaces:i,name:s}=t,r=k.parseArgument(4,8,e,n);n=r.newIndex;let o=s.name;return{value:new ze({namespaces:i,name:o},r.value),newIndex:n}}static parseParenSource(e,t){let n=t,i=e[n];if(n++,n>=e.length)throw new Error(`Syntax error: Unexpected end of input at position ${n}. Expected a subquery or nested expression after opening parenthesis.`);let s=e[n].value;if(s==="select"||s==="values"||s==="with"){let r=this.parseSubQuerySource(e,n,i);if(n=r.newIndex,n<e.length&&e[n].type==8)n++;else throw new Error(`Syntax error at position ${n}: Missing closing parenthesis. Each opening parenthesis must have a matching closing parenthesis.`);return{value:r.value,newIndex:n}}else if(e[n].type==4){let r=this.parseParenSource(e,n);if(n=r.newIndex,n<e.length&&e[n].type==8)n++;else throw new Error(`Syntax error at position ${n}: Missing closing parenthesis. Each opening parenthesis must have a matching closing parenthesis.`);return{value:r.value,newIndex:n}}throw new Error(`Syntax error at position ${n}: Expected 'SELECT' keyword, 'VALUES' keyword, or opening parenthesis '(' but found "${e[n].value}".`)}static parseSubQuerySource(e,t,n){let i=t,{value:s,newIndex:r}=A.parseFromLexeme(e,i);if(i=r,n&&n.positionedComments&&n.positionedComments.length>0){let l=n.positionedComments.filter(u=>u.position==="after");if(l.length>0){let u=l.map(c=>({position:"before",comments:c.comments}));s.positionedComments?s.positionedComments=[...u,...s.positionedComments]:s.positionedComments=u,s.comments&&(s.comments=null)}}return{value:new M(s),newIndex:i}}};var Ht=class extends Error{constructor(t){super(`CTE '${t}' already exists in the query`);this.cteName=t;this.name="DuplicateCTEError"}},Qt=class extends Error{constructor(t,n){super(`Invalid CTE name '${t}': ${n}`);this.cteName=t;this.name="InvalidCTENameError"}},Gt=class extends Error{constructor(t){super(`CTE '${t}' not found in the query`);this.cteName=t;this.name="CTENotFoundError"}};var Ot=class{constructor(e,t){this.options=t||{},this.tableColumnResolver=e,this.columnCollector=new ke(this.tableColumnResolver,!1,"fullName",{upstream:!0})}find(e,t){let n=typeof t=="string"?[t]:t,s=new X().collect(e),r=new Map;for(let o of s)r.set(o.getSourceAliasName(),o);return this.findUpstream(e,n,r)}handleTableSource(e,t,n){let i=n.get(e.table.name);if(i){let s=new Map(n);s.delete(e.table.name);let r=this.findUpstream(i.query,t,s);return r.length===0?null:r}return null}handleSubQuerySource(e,t,n){let i=this.findUpstream(e.query,t,n);return i.length===0?null:i}processFromClauseBranches(e,t,n){let i=e.getSources();if(i.length===0)return null;let s=[],r=!0,o=0;for(let l of i){let u=l.datasource,c=null;if(u instanceof O)c=this.handleTableSource(u,t,n),o++;else if(u instanceof M)c=this.handleSubQuerySource(u,t,n),o++;else{if(u instanceof Ce)continue;r=!1;break}if(c===null){r=!1;break}s.push(c)}return r&&s.length===o?s.flat():null}findUpstream(e,t,n){if(e instanceof g){let i=e.fromClause;if(i){let c=this.processFromClauseBranches(i,t,n);if(c&&c.length>0)return c}let s=this.columnCollector.collect(e).map(c=>c.name),r=this.collectCTEColumns(e,n),o=[...s,...r],l=c=>this.options.ignoreCaseAndUnderscore?c.toLowerCase().replace(/_/g,""):c;return t.every(c=>o.some(p=>l(p)===l(c)))?[e]:[]}else if(e instanceof Q){let i=this.findUpstream(e.left,t,n),s=this.findUpstream(e.right,t,n);return[...i,...s]}return[]}collectCTEColumns(e,t){let n=[];if(e.withClause)for(let i of e.withClause.tables){let s=this.collectColumnsFromSelectQuery(i.query);n.push(...s)}return n}collectColumnsFromSelectQuery(e){if(e instanceof g)try{return this.columnCollector.collect(e).map(t=>t.name)}catch(t){return console.warn("Failed to collect columns from SimpleSelectQuery:",t),[]}else if(e instanceof Q)return this.collectColumnsFromSelectQuery(e.left);return[]}};var St=class{static parseFromLexeme(e,t){let n=t;if(n<e.length&&(e[n].type&64||e[n].type&2048)){let i=e[n],s=i.value;if(n++,n<e.length&&e[n].type&4){let o=[];for(n++;n<e.length&&e[n].type&64&&(o.push(e[n].value),n++,n<e.length&&e[n].type&16);)n++;if(e[n].type&8)n++;else throw new Error(`Syntax error at position ${n}: Missing closing parenthesis ')' for column alias list. Each opening parenthesis must have a matching closing parenthesis.`);if(o.length===0)throw new Error(`Syntax error at position ${t}: No column aliases found. Column alias declarations must contain at least one column name.`);let l=new ee(s,o);return i.positionedComments&&i.positionedComments.length>0&&(l.positionedComments=i.positionedComments),{value:l,newIndex:n}}let r=new ee(s,null);return i.positionedComments&&i.positionedComments.length>0&&(r.positionedComments=i.positionedComments),{value:r,newIndex:n}}throw new Error(`Syntax error at position ${t}: Expected an identifier for table alias but found "${e[t]?.value||"end of input"}".`)}};var Ye=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The source expression is complete but there are additional tokens.`);return i.value}static parseTableSourceFromLexemes(e,t){let n=wt.parseTableSourceFromLexemes(e,t);return{value:new B(n.value,null),newIndex:n.newIndex}}static parseFromLexeme(e,t){let n=t,i=wt.parseFromLexeme(e,n);if(n=i.newIndex,n<e.length){if(e[n].value==="as"){n++;let r=St.parseFromLexeme(e,n);return n=r.newIndex,{value:new B(i.value,r.value),newIndex:n}}if(n<e.length&&this.isTokenTypeAliasCandidate(e[n].type)){let r=St.parseFromLexeme(e,n);return n=r.newIndex,{value:new B(i.value,r.value),newIndex:n}}}return{value:new B(i.value,null),newIndex:n}}static isTokenTypeAliasCandidate(e){return(e&64)!==0||(e&2048)!==0}};var We=class a{static buildBinaryQuery(e,t){if(!e||e.length===0)throw new Error("No queries provided to combine.");if(e.length===1)throw new Error("At least two queries are required to create a BinarySelectQuery.");let n=s=>s instanceof Ce?a.buildSimpleQuery(s):s,i=new Q(n(e[0]),t,n(e[1]));st.normalize(i);for(let s=2;s<e.length;s++)i.appendSelectQuery(t,n(e[s]));return i}constructor(){}static buildSimpleQuery(e){if(e instanceof g)return e;if(e instanceof Q)return a.buildSimpleBinaryQuery(e);if(e instanceof Ce)return a.buildSimpleValuesQuery(e);throw new Error("Unsupported query type for buildSimpleQuery")}static buildSimpleBinaryQuery(e){let t=a.extractAndRemoveOrderByFromBinaryQuery(e),n=new M(e),i=new B(n,new ee("bq",null)),s=new K(i,null),r=a.createSelectAllClause(),o=new g({selectClause:r,fromClause:s,orderByClause:t});return st.normalize(o)}static extractAndRemoveOrderByFromBinaryQuery(e){return a.findAndRemoveRightmostOrderBy(e)}static findAndRemoveRightmostOrderBy(e){if(e instanceof Q){let t=a.findAndRemoveRightmostOrderBy(e.right);return t||a.findAndRemoveRightmostOrderBy(e.left)}else if(e instanceof g){let t=e.orderByClause;if(t)return e.orderByClause=null,t}return null}static buildSimpleValuesQuery(e){let t=e.tuples.length>0?e.tuples[0].values.length:0;if(e.tuples.length===0)throw new Error("Empty VALUES clause cannot be converted to a SimpleSelectQuery");if(!e.columnAliases)throw new Error("Column aliases are required to convert a VALUES clause to SimpleSelectQuery. Please specify column aliases.");if(e.columnAliases.length!==t)throw new Error(`The number of column aliases (${e.columnAliases.length}) does not match the number of columns in the first tuple (${t}).`);let n=new M(e),i=new B(n,new ee("vq",e.columnAliases)),s=new K(i,null),r=e.columnAliases.map(l=>new _(new b("vq",l),l)),o=new q(r,null);return new g({selectClause:o,fromClause:s})}static createSelectAllClause(){let e=new b(null,"*"),t=new _(e,"*");return new q([t],null)}static buildCreateTableQuery(e,t,n=!1){return new Nt({tableName:t,isTemporary:n,asSelectQuery:e})}static buildInsertQuery(e,t){let n,i=e.selectClause.items.length;if(n=new _e().collect(e).map(l=>l.name),!n.length||i!==n.length)throw new Error(`Columns cannot be inferred from the selectQuery. Make sure you are not using wildcards or unnamed columns.
20
- Select clause column count: ${i}, Columns with valid names: ${n.length}
21
- Detected column names: [${n.join(", ")}]`);let o=Ye.parse(t);return new ot({insertClause:new ct(o,n),selectQuery:e})}static buildUpdateQuery(e,t,n,i){let s=new It(Ye.parse(n)),r=Array.isArray(i)?i:[i],l=new _e().collect(e),c=new X().collect(e);new Lt().execute(e);for(let P of r)if(!l.some(T=>T.name===P))throw new Error(`Primary key column '${P}' is not present in selectQuery select list.`);let d=s.getSourceAliasName();if(!d)throw new Error("Source expression does not have an alias. Please provide an alias for the source expression.");let C=l.filter(P=>!r.includes(P.name)).map(P=>new ut(P.name,new b(d,P.name))),f=new at(C),J=new K(e.toSource(t),null),H=null;for(let P of r){let T=new S(new b(d,P),"=",new b(t,P));H=H?new S(H,"and",T):T}let E=new re(H);return new At({updateClause:s,setClause:f,fromClause:J,whereClause:E,withClause:c.length>0?new ae(!1,c):void 0})}};var rt=class{static set(e,t,n){let i=mt.collect(e),s=!1;for(let r of i)r.name.value===t&&(r.value=n,s=!0);if(!s)throw new Error(`Parameter '${t}' not found in query.`)}};var g=class extends v{constructor(t){super();this.__selectQueryType="SelectQuery";this.headerComments=null;this.cteNameCache=new Set;this.withClause=t.withClause??null,this.selectClause=t.selectClause,this.fromClause=t.fromClause??null,this.whereClause=t.whereClause??null,this.groupByClause=t.groupByClause??null,this.havingClause=t.havingClause??null,this.orderByClause=t.orderByClause??null,this.windowClause=t.windowClause??null,this.limitClause=t.limitClause??null,this.offsetClause=t.offsetClause??null,this.fetchClause=t.fetchClause??null,this.forClause=t.forClause??null,this.initializeCTECache()}static{this.kind=Symbol("SelectQuery")}initializeCTECache(){if(this.cteNameCache.clear(),this.withClause?.tables)for(let t of this.withClause.tables)this.cteNameCache.add(t.aliasExpression.table.name)}toUnion(t){return this.toBinaryQuery("union",t)}toUnionAll(t){return this.toBinaryQuery("union all",t)}toIntersect(t){return this.toBinaryQuery("intersect",t)}toIntersectAll(t){return this.toBinaryQuery("intersect all",t)}toExcept(t){return this.toBinaryQuery("except",t)}toExceptAll(t){return this.toBinaryQuery("except all",t)}toBinaryQuery(t,n){return We.buildBinaryQuery([this,n],t)}appendWhereRaw(t){let n=k.parse(t);this.appendWhere(n)}appendWhere(t){this.whereClause?this.whereClause.condition=new S(this.whereClause.condition,"and",t):this.whereClause=new re(t)}appendHavingRaw(t){let n=k.parse(t);this.appendHaving(n)}appendHaving(t){this.havingClause?this.havingClause.condition=new S(this.havingClause.condition,"and",t):this.havingClause=new de(t)}innerJoinRaw(t,n,i,s=null){this.joinSourceRaw("inner join",t,n,i,s)}leftJoinRaw(t,n,i,s=null){this.joinSourceRaw("left join",t,n,i,s)}rightJoinRaw(t,n,i,s=null){this.joinSourceRaw("right join",t,n,i,s)}innerJoin(t,n,i=null){this.joinSource("inner join",t,n,i)}leftJoin(t,n,i=null){this.joinSource("left join",t,n,i)}rightJoin(t,n,i=null){this.joinSource("right join",t,n,i)}joinSourceRaw(t,n,i,s,r=null){let o=wt.parse(n),l=new B(o,new ee(i,null));this.joinSource(t,l,s,r)}joinSource(t,n,i,s=null){if(!this.fromClause)throw new Error("A FROM clause is required to add a JOIN condition.");let r=Array.isArray(i)?i:[i],l=new ke(s).collect(this),u=null,c=0,p=n.getAliasName();if(!p)throw new Error("An alias is required for the source expression to add a JOIN condition.");for(let C of l)if(r.some(f=>f==C.name)){let f=new S(C.value,"=",new b([p],C.name));u?u=new S(u,"and",f):u=f,c++}if(!u||c!==r.length)throw new Error(`Invalid JOIN condition. The specified columns were not found: ${r.join(", ")}`);let d=new he(u),h=new fe(t,n,d,!1);this.fromClause&&(this.fromClause.joins?this.fromClause.joins.push(h):this.fromClause.joins=[h]),st.normalize(this)}toSource(t){if(!t||t.trim()==="")throw new Error("Alias is required for toSource(). Please specify a non-empty alias name.");return new B(new M(this),new ee(t,null))}appendWith(t){let n=Array.isArray(t)?t:[t];this.withClause?this.withClause.tables.push(...n):this.withClause=new ae(!1,n),st.normalize(this)}appendWithRaw(t,n){let i=A.parse(t),s=new ie(i,n,null);this.appendWith(s)}overrideSelectItemExpr(t,n){let i=this.selectClause.items.filter(u=>u.identifier?.name===t);if(i.length===0)throw new Error(`Column ${t} not found in the query`);if(i.length>1)throw new Error(`Duplicate column name ${t} found in the query`);let s=i[0],o=new dt().visit(s.value),l=n(o);s.value=k.parse(l)}appendWhereExpr(t,n,i){if(i&&i.upstream){let r=new Ot().find(this,[t]),o=new ke,l=new dt;for(let u of r){let c=o.collect(u).filter(d=>d.name===t).map(d=>d.value);if(c.length!==1)throw new Error(`Expected exactly one expression for column '${t}'`);let p=l.format(c[0]);u.appendWhereRaw(n(p))}}else{let s=new ke,r=new dt,o=s.collect(this).filter(u=>u.name===t).map(u=>u.value);if(o.length!==1)throw new Error(`Expected exactly one expression for column '${t}'`);let l=r.format(o[0]);this.appendWhereRaw(n(l))}}setParameter(t,n){return rt.set(this,t,n),this}toSimpleQuery(){return this}addCTE(t,n,i){if(!t||t.trim()==="")throw new Qt(t,"name cannot be empty or whitespace-only");if(this.hasCTE(t))throw new Ht(t);let s=i?.materialized??null,r=new ie(n,t,s);return this.appendWith(r),this.cteNameCache.add(t),this}removeCTE(t){if(!this.hasCTE(t))throw new Gt(t);return this.withClause&&(this.withClause.tables=this.withClause.tables.filter(n=>n.aliasExpression.table.name!==t),this.withClause.tables.length===0&&(this.withClause=null)),this.cteNameCache.delete(t),this}hasCTE(t){return this.cteNameCache.has(t)}getCTENames(){return this.withClause?.tables.map(t=>t.aliasExpression.table.name)??[]}replaceCTE(t,n,i){if(!t||t.trim()==="")throw new Qt(t,"name cannot be empty or whitespace-only");this.hasCTE(t)&&this.removeCTE(t);let s=i?.materialized??null,r=new ie(n,t,s);return this.appendWith(r),this.cteNameCache.add(t),this}};var Q=class a extends v{constructor(t,n,i){super();this.__selectQueryType="SelectQuery";this.headerComments=null;this.left=t,this.operator=new V(n),this.right=i}static{this.kind=Symbol("BinarySelectQuery")}union(t){return this.appendSelectQuery("union",t)}unionAll(t){return this.appendSelectQuery("union all",t)}intersect(t){return this.appendSelectQuery("intersect",t)}intersectAll(t){return this.appendSelectQuery("intersect all",t)}except(t){return this.appendSelectQuery("except",t)}exceptAll(t){return this.appendSelectQuery("except all",t)}appendSelectQuery(t,n){return this.left=new a(this.left,this.operator.value,this.right),this.operator=new V(t),this.right=n,st.normalize(this),this}unionRaw(t){let n=A.parse(t);return this.union(n)}unionAllRaw(t){let n=A.parse(t);return this.unionAll(n)}intersectRaw(t){let n=A.parse(t);return this.intersect(n)}intersectAllRaw(t){let n=A.parse(t);return this.intersectAll(n)}exceptRaw(t){let n=A.parse(t);return this.except(n)}exceptAllRaw(t){let n=A.parse(t);return this.exceptAll(n)}toSource(t="subq"){return new B(new M(this),new ee(t,null))}setParameter(t,n){return rt.set(this,t,n),this}toSimpleQuery(){return We.buildSimpleQuery(this)}};var Ce=class extends v{constructor(t,n=null){super();this.__selectQueryType="SelectQuery";this.headerComments=null;this.tuples=t,this.columnAliases=n}static{this.kind=Symbol("ValuesQuery")}toSimpleQuery(){return We.buildSimpleQuery(this)}setParameter(t,n){return rt.set(this,t,n),this}};var On=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The SELECT clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t,i=null,s=n<e.length?e[n].comments:null;if(e[n].value!=="select")throw new Error(`Syntax error at position ${n}: Expected 'SELECT' keyword but found "${e[n].value}". SELECT clauses must start with the SELECT keyword.`);n++;let r=[];for(;n<e.length&&pt.isHintClause(e[n].value);){let u=pt.extractHintContent(e[n].value);r.push(new pt(u)),n++}if(n<e.length&&e[n].value==="distinct")n++,i=new Tt;else if(n<e.length&&e[n].value==="distinct on"){n++;let u=k.parseArgument(4,8,e,n);i=new kt(u.value),n=u.newIndex}let o=[],l=Rn.parseItem(e,n);for(o.push(l.value),n=l.newIndex;n<e.length&&e[n].type&16;){n++;let u=Rn.parseItem(e,n);o.push(u.value),n=u.newIndex}if(o.length===0)throw new Error(`Syntax error at position ${t}: No select items found. The SELECT clause requires at least one expression to select.`);return{value:new q(o,i,r),newIndex:n}}},Rn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseItem(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The select item is complete but there are additional tokens.`);return i.value}static parseItem(e,t){let n=t,i=this.extractValueTokenComments(e,n),s=k.parseFromLexeme(e,n),r=s.value;n=s.newIndex;let{asComments:o,newIndex:l}=this.parseAsKeyword(e,n);if(n=l,n<e.length&&e[n].type&64){let c=e[n].value,p=e[n].comments,d=e[n].positionedComments;n++;let h=new _(r,c);return this.applyValueTokenComments(h,i),this.applyAsKeywordComments(h,o),this.applyAliasComments(h,p,d),{value:h,newIndex:n}}else if(r instanceof b&&r.column.name!=="*"){let c=new _(r,r.column.name);return this.applyValueTokenComments(c,i),this.applyAsKeywordComments(c,o),{value:c,newIndex:n}}let u=new _(r);return this.applyValueTokenComments(u,i),this.applyAsKeywordComments(u,o),{value:u,newIndex:n}}static clearPositionedCommentsRecursively(e){!e||typeof e!="object"||("positionedComments"in e&&(e.positionedComments=null),e.left&&this.clearPositionedCommentsRecursively(e.left),e.right&&this.clearPositionedCommentsRecursively(e.right),e.qualifiedName&&this.clearPositionedCommentsRecursively(e.qualifiedName),e.table&&this.clearPositionedCommentsRecursively(e.table),e.name&&this.clearPositionedCommentsRecursively(e.name),e.args&&Array.isArray(e.args)&&e.args.forEach(t=>{this.clearPositionedCommentsRecursively(t)}),e.value&&this.clearPositionedCommentsRecursively(e.value))}static extractValueTokenComments(e,t){if(t>=e.length)return{positioned:null,legacy:null};let n=e[t];return{positioned:n.positionedComments&&n.positionedComments.length>0?n.positionedComments:null,legacy:null}}static parseAsKeyword(e,t){if(t>=e.length||e[t].value!=="as")return{asComments:{positioned:null,legacy:null},newIndex:t};let n=e[t];return{asComments:{positioned:n.positionedComments&&n.positionedComments.length>0?n.positionedComments:null,legacy:n.comments&&n.comments.length>0?n.comments:null},newIndex:t+1}}static applyValueTokenComments(e,t){if(t.positioned){for(let n of t.positioned)e.addPositionedComments(n.position,n.comments);this.clearValueTokenComments(e)}}static applyAsKeywordComments(e,t){t.positioned?e.asKeywordPositionedComments=t.positioned:t.legacy&&(e.asKeywordComments=t.legacy)}static applyAliasComments(e,t,n){n&&n.length>0?e.aliasPositionedComments=n:t&&t.length>0&&(e.aliasComments=t)}static clearValueTokenComments(e){if("positionedComments"in e.value&&(e.value.positionedComments=null),e.value.constructor.name==="ColumnReference"){let t=e.value;t.qualifiedName&&t.qualifiedName.name&&(t.qualifiedName.name.positionedComments=null)}e.value.constructor.name==="BinaryExpression"&&this.clearPositionedCommentsRecursively(e.value)}};var Fn=class{static tryParse(e,t){let n=t;if(n<e.length&&e[n].value==="on"){n++;let i=k.parseFromLexeme(e,n);return n=i.newIndex,{value:new he(i.value),newIndex:n}}return null}};var Bn=class{static tryParse(e,t){let n=t;if(n<e.length&&e[n].value==="using"){n++;let i=k.parseArgument(4,8,e,n),s=i.value;return n=i.newIndex,{value:new Se(s),newIndex:n}}return null}};var Vn=class{static tryParse(e,t){let n=t,i=[];for(;this.isJoinCommand(e,n);){let s=this.parseJoinClause(e,n);i.push(s.value),n=s.newIndex}return i.length>0?{value:i,newIndex:n}:null}static isJoinKeyword(e){return!!Jt.parse(e,0)}static parseLateral(e,t){let n=t;return n<e.length&&e[n].value==="lateral"?(n++,{value:!0,newIndex:n}):{value:!1,newIndex:n}}static isJoinCommand(e,t){return t>=e.length?!1:!!(e[t].type&16||this.isJoinKeyword(e[t].value)===!0)}static parseJoinClause(e,t){let n=t,{joinType:i,joinComments:s,newIndex:r}=this.parseJoinKeyword(e,n);n=r;let o=this.parseLateral(e,n),l=o.value;n=o.newIndex;let u=Ye.parseFromLexeme(e,n);n=u.newIndex;let c=this.parseJoinCondition(e,n,i,u.value,l,s);if(c)return c;let p=new fe(i,u.value,null,l);return this.applyJoinComments(p,s),{value:p,newIndex:n}}static parseJoinKeyword(e,t){let n=e[t].value===","?"cross join":e[t].value,i=this.extractJoinKeywordComments(e[t]);return{joinType:n,joinComments:i,newIndex:t+1}}static extractJoinKeywordComments(e){return{positioned:e.positionedComments&&e.positionedComments.length>0?e.positionedComments:null,legacy:e.comments&&e.comments.length>0?e.comments:null}}static parseJoinCondition(e,t,n,i,s,r){if(t>=e.length)return null;let o=Fn.tryParse(e,t);if(o){let u=new fe(n,i,o.value,s);return this.applyJoinComments(u,r),{value:u,newIndex:o.newIndex}}let l=Bn.tryParse(e,t);if(l){let u=new fe(n,i,l.value,s);return this.applyJoinComments(u,r),{value:u,newIndex:l.newIndex}}return null}static applyJoinComments(e,t){t.positioned?e.joinKeywordPositionedComments=t.positioned:t.legacy&&(e.joinKeywordComments=t.legacy)}};var Rt=class{static collectClauseComments(e,t,n){if(t>=e.length||e[t].value.toLowerCase()!==n.toLowerCase())return null;let i=[];e[t].comments&&i.push(...e[t].comments);let s=t-1;for(;s>=0;){let r=e[s];if(r.comments&&r.comments.length>0){let o=r.comments.filter(l=>{let u=l.toLowerCase();return u.includes(n.toLowerCase())||u.includes("\u306E")||u.includes("\u30B3\u30E1\u30F3\u30C8")});o.length>0&&(i.unshift(...o),r.comments=r.comments.filter(l=>!o.includes(l)),r.comments.length===0&&(r.comments=null));break}if(this.isSignificantSqlKeyword(r.value))break;s--}return i.length>0?i:null}static isSignificantSqlKeyword(e){return new Set(["select","from","where","group by","having","order by","limit","offset"]).has(e.toLowerCase())}};var $n=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The FROM clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t,i=Rt.collectClauseComments(e,n,"from");if(e[n].value!=="from")throw new Error(`Syntax error at position ${n}: Expected 'FROM' keyword but found "${e[n].value}". FROM clauses must start with the FROM keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'FROM' keyword. The FROM clause requires a table reference.");let s=Ye.parseFromLexeme(e,n);n=s.newIndex;let r=Vn.tryParse(e,n);if(n=r?.newIndex||n,r!==null){let o=new K(s.value,r.value);return{value:o,newIndex:n}}else{let o=new K(s.value,null);return{value:o,newIndex:n}}}};var Mn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The WHERE clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t,i=Rt.collectClauseComments(e,n,"where");if(e[n].value!=="where")throw new Error(`Syntax error at position ${n}: Expected 'WHERE' keyword but found "${e[n].value}". WHERE clauses must start with the WHERE keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'WHERE' keyword. The WHERE clause requires a condition expression.");let s=k.parseFromLexeme(e,n),r=new re(s.value);return r.comments=i,{value:r,newIndex:s.newIndex}}};var Wn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The GROUP BY clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="group by")throw new Error(`Syntax error at position ${n}: Expected 'GROUP BY' keyword but found "${e[n].value}". GROUP BY clauses must start with the GROUP BY keywords.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'GROUP BY' keyword. The GROUP BY clause requires at least one expression to group by.");let i=[],s=this.parseItem(e,n);for(i.push(s.value),n=s.newIndex;n<e.length&&e[n].type&16;){n++;let r=this.parseItem(e,n);i.push(r.value),n=r.newIndex}if(i.length===0)throw new Error(`Syntax error at position ${t}: No grouping expressions found. The GROUP BY clause requires at least one expression to group by.`);return{value:new me(i),newIndex:n}}static parseItem(e,t){let n=t,i=k.parseFromLexeme(e,n),s=i.value;return n=i.newIndex,{value:s,newIndex:n}}};var jn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The HAVING clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="having")throw new Error(`Syntax error at position ${n}: Expected 'HAVING' keyword but found "${e[n].value}". HAVING clauses must start with the HAVING keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'HAVING' keyword. The HAVING clause requires a condition expression.");let i=k.parseFromLexeme(e,n);return{value:new de(i.value),newIndex:i.newIndex}}};var Dn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The WINDOW clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="window")throw new Error(`Syntax error at position ${n}: Expected 'WINDOW' keyword but found "${e[n].value}". WINDOW clauses must start with the WINDOW keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'WINDOW' keyword. The WINDOW clause requires at least one window definition.");let i=[];for(;n<e.length;){if(n>=e.length||e[n].type!==64)throw new Error("Syntax error: Expected window name after 'WINDOW' keyword.");let s=e[n].value;if(n++,n>=e.length||e[n].value!=="as")throw new Error(`Syntax error at position ${n}: Expected 'AS' keyword after window name.`);n++;let r=Pt.parseFromLexeme(e,n);if(n=r.newIndex,i.push(new Pe(s,r.value)),n<e.length&&e[n].type&16)n++;else break}if(i.length===0)throw new Error("At least one WINDOW clause is required after WINDOW keyword.");return{value:new nt(i),newIndex:n}}};var Un=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The LIMIT clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="limit")throw new Error(`Syntax error at position ${n}: Expected 'LIMIT' keyword but found "${e[n].value}". LIMIT clauses must start with the LIMIT keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'LIMIT' keyword. The LIMIT clause requires a numeric expression.");let i=k.parseFromLexeme(e,n);return n=i.newIndex,{value:new oe(i.value),newIndex:n}}};var Kn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The FOR clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value.toLowerCase()!=="for")throw new Error(`Syntax error at position ${n}: Expected 'FOR' keyword but found "${e[n].value}". FOR clauses must start with the FOR keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'FOR' keyword. The FOR clause requires a lock mode specification.");let i=e[n].value,s;switch(i){case"update":s="update",n++;break;case"share":s="share",n++;break;case"key share":s="key share",n++;break;case"no key update":s="no key update",n++;break;default:throw new Error(`Syntax error at position ${n}: Invalid lock mode "${i}". Valid lock modes are: UPDATE, SHARE, KEY SHARE, NO KEY UPDATE.`)}return{value:new Ae(s),newIndex:n}}};var Yt=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The CommonTable definition is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t,i=St.parseFromLexeme(e,n);n=i.newIndex,this.collectPrecedingComments(e,t,i),n=this.parseAsKeyword(e,n);let{materialized:s,newIndex:r}=this.parseMaterializedFlag(e,n);n=r;let{selectQuery:o,trailingComments:l,newIndex:u}=this.parseInnerSelectQuery(e,n);return n=u,{value:new ie(o,i.value,s),newIndex:n,trailingComments:l}}static collectPrecedingComments(e,t,n){if(!n.value?.table)return;let i=n.value.table;for(let s=t-1;s>=0;s--){let r=e[s];if(r.value.toLowerCase()==="with"){this.collectWithTokenComments(r,i);break}if(r.type&16||r.value.toLowerCase()==="recursive")break;this.collectTokenComments(r,i)}}static collectWithTokenComments(e,t){let n=!1;if(e.positionedComments&&e.positionedComments.length>0)for(let i of e.positionedComments)i.position==="after"&&i.comments&&(this.addPositionedComment(t,"before",i.comments),n=!0);!n&&e.comments&&e.comments.length>0&&this.addPositionedComment(t,"before",e.comments)}static collectTokenComments(e,t){e.comments&&e.comments.length>0&&this.addPositionedComment(t,"before",e.comments),e.positionedComments&&e.positionedComments.length>0&&(t.positionedComments||(t.positionedComments=[]),t.positionedComments.unshift(...e.positionedComments))}static addPositionedComment(e,t,n){e.positionedComments||(e.positionedComments=[]),e.positionedComments.unshift({position:t,comments:[...n]})}static parseAsKeyword(e,t){if(t<e.length&&e[t].value!=="as")throw new Error(`Syntax error at position ${t}: Expected 'AS' keyword after CTE name but found "${e[t].value}".`);return t+1}static parseMaterializedFlag(e,t){if(t>=e.length)return{materialized:null,newIndex:t};let n=e[t].value;return n==="materialized"?{materialized:!0,newIndex:t+1}:n==="not materialized"?{materialized:!1,newIndex:t+1}:{materialized:null,newIndex:t}}static parseInnerSelectQuery(e,t){let n=t;if(n<e.length&&e[n].type!==4)throw new Error(`Syntax error at position ${n}: Expected '(' after CTE name but found "${e[n].value}".`);let i=this.extractComments(e[n]);n++;let s=A.parseFromLexeme(e,n);if(n=s.newIndex,i.length>0&&(s.value.headerComments?s.value.headerComments=[...i,...s.value.headerComments]:s.value.headerComments=i),n<e.length&&e[n].type!==8)throw new Error(`Syntax error at position ${n}: Expected ')' after CTE query but found "${e[n].value}".`);let r=this.extractComments(e[n]);return n++,{selectQuery:s.value,trailingComments:r.length>0?r:null,newIndex:n}}static extractComments(e){let t=[];if(e.positionedComments)for(let n of e.positionedComments)n.comments&&t.push(...n.comments);return e.comments&&e.comments.length>0&&t.push(...e.comments),t}};var Ft=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The WITH clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t,i=this.extractWithTokenHeaderComments(e,n);n=this.parseWithKeyword(e,n);let{recursive:s,newIndex:r}=this.parseRecursiveFlag(e,n);n=r;let{tables:o,trailingComments:l,newIndex:u}=this.parseAllCommonTables(e,n);n=u;let c=new ae(s,o);return l.length>0&&(c.trailingComments=l),{value:c,newIndex:n,headerComments:i}}static extractWithTokenHeaderComments(e,t){if(t>=e.length)return null;let n=e[t],i=null;if(n.positionedComments&&n.positionedComments.length>0)for(let s of n.positionedComments)s.position==="before"&&s.comments&&(i||(i=[]),i.push(...s.comments));return!i&&n.comments&&n.comments.length>0&&(i=[...n.comments]),i}static parseWithKeyword(e,t){if(t<e.length&&e[t].value.toLowerCase()==="with")return t+1;throw new Error(`Syntax error at position ${t}: Expected WITH keyword.`)}static parseRecursiveFlag(e,t){let n=t<e.length&&e[t].value.toLowerCase()==="recursive";return{recursive:n,newIndex:n?t+1:t}}static parseAllCommonTables(e,t){let n=t,i=[],s=[],r=Yt.parseFromLexeme(e,n);for(i.push(r.value),n=r.newIndex,r.trailingComments&&s.push(...r.trailingComments);n<e.length&&e[n].type&16;){n++;let o=Yt.parseFromLexeme(e,n);i.push(o.value),n=o.newIndex,o.trailingComments&&s.push(...o.trailingComments)}return{tables:i,trailingComments:s,newIndex:n}}};var Jn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The VALUES clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value.toLowerCase()!=="values")throw new Error(`Syntax error at position ${n}: Expected 'VALUES' keyword but found "${e[n].value}". VALUES clauses must start with the VALUES keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'VALUES' keyword. The VALUES clause requires at least one tuple expression.");let i=[],s=this.parseTuple(e,n);for(i.push(s.value),n=s.newIndex;n<e.length&&e[n].type&16;){n++;let o=this.parseTuple(e,n);i.push(o.value),n=o.newIndex}return{value:new Ce(i),newIndex:n}}static parseTuple(e,t){let n=t;if(n>=e.length||e[n].type!==4)throw new Error(`Syntax error at position ${n}: Expected opening parenthesis but found "${n<e.length?e[n].value:"end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);n++;let i=[];if(n>=e.length)throw new Error("Syntax error: Unexpected end of input after opening parenthesis in tuple expression.");if(e[n].type&8)return n++,{value:new Ie([]),newIndex:n};let s=k.parseFromLexeme(e,n);for(i.push(s.value),n=s.newIndex;n<e.length&&e[n].type&16;){if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after comma in tuple expression.");let r=k.parseFromLexeme(e,n);i.push(r.value),n=r.newIndex}if(n>=e.length||e[n].type!==8)throw new Error(`Syntax error at position ${n}: Expected closing parenthesis but found "${n<e.length?e[n].value:"end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);return n++,{value:new Ie(i),newIndex:n}}};var _n=class{static parseFromLexeme(e,t){let n=t;if(e[n].value!=="fetch")throw new Error(`Syntax error at position ${n}: Expected 'FETCH' keyword but found "${e[n].value}".`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'FETCH' keyword.");let i=gi.parseFromLexeme(e,n),s=i.value;return n=i.newIndex,{value:new Ke(s),newIndex:n}}},gi=class{static parseFromLexeme(e,t){let n=t,i,s=e[n].value;if(s==="first")i="first";else if(s==="next")i="next";else throw new Error(`Syntax error at position ${n}: Expected 'FIRST' or 'NEXT' after 'FETCH' but found "${e[n].value}".`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'FETCH FIRST|NEXT'.");let r=null,o=null;if(e[n].value==="row only"||e[n].value==="rows only")return r=new Y(1),o="rows only",n++,{value:new gt(i,r,o),newIndex:n};let l=k.parseFromLexeme(e,n);if(r=l.value,n=l.newIndex,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'FETCH FIRST|NEXT <count>'.");if(e[n].value==="rows only"?(o="rows only",n++):e[n].value==="percent"?(o="percent",n++):e[n].value==="percent with ties"&&(o="percent with ties",n++),!o)throw new Error("Syntax error: Expected 'ROWS ONLY', 'PERCENT', or 'PERCENT WITH TIES' after 'FETCH FIRST|NEXT <count>'.");return{value:new gt(i,r,o),newIndex:n}}};var qn=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The OFFSET clause is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t;if(e[n].value!=="offset")throw new Error(`Syntax error at position ${n}: Expected 'OFFSET' keyword but found "${e[n].value}". OFFSET clauses must start with the OFFSET keyword.`);if(n++,n>=e.length)throw new Error("Syntax error: Unexpected end of input after 'OFFSET' keyword. The OFFSET clause requires a numeric expression.");let i=k.parseFromLexeme(e,n);return n=i.newIndex,n<e.length&&(e[n].value==="row"||e[n].value==="rows")&&n++,{value:new Fe(i.value),newIndex:n}}};var Ne=class{static{this.SQL_COMMANDS=new Set(["select","from","where","and","or","order","by","group","having","limit","offset","as","on","inner","left","right","join","union","insert","update","delete","into","values","set"])}static findLexemeAtLineColumn(e,t){let n=this.lineColumnToCharOffset(e,t);return n===-1?null:this.findLexemeAtPosition(e,n)}static findLexemeAtPosition(e,t){if(t<0||t>=e.length)return null;let n=this.getAllLexemesWithPosition(e);for(let i of n)if(i.position&&t>=i.position.startPosition&&t<i.position.endPosition)return i;return null}static getAllLexemesWithPosition(e){if(!e?.trim())return[];try{let t=[],n=0;for(;n<e.length&&(n=this.skipWhitespaceAndComments(e,n),!(n>=e.length));){let i=this.parseNextToken(e,n);i?(t.push(i),n=i.position.endPosition):n++}return t}catch{return[]}}static skipWhitespaceAndComments(e,t){return le.readWhiteSpaceAndComment(e,t).position}static parseNextToken(e,t){let n=e[t];return n==="'"||n==='"'?this.parseStringLiteral(e,t):/[=<>!+\-*/%().*]/.test(n)?this.parseOperator(e,t):n===","?this.createLexeme(16,",",t,t+1):/[a-zA-Z0-9_]/.test(n)?this.parseWordToken(e,t):null}static parseStringLiteral(e,t){let n=e[t],i=t+1,s=n;for(;i<e.length&&e[i]!==n;)s+=e[i++];return i<e.length&&(s+=e[i++]),this.createLexeme(1,s,t,i)}static parseOperator(e,t){let n=e[t],i=t+1;i<e.length&&/[=<>!]/.test(e[i])&&/[=<>!]/.test(n)&&(n+=e[i++]);let s=this.getOperatorTokenType(n);return this.createLexeme(s,n,t,i)}static parseWordToken(e,t){let n=t,i="";for(;n<e.length&&/[a-zA-Z0-9_]/.test(e[n]);)i+=e[n++];let s=this.getWordTokenType(i,e,n),r=this.shouldLowercase(s)?i.toLowerCase():i;return this.createLexeme(s,r,t,n)}static getOperatorTokenType(e){switch(e){case"(":return 4;case")":return 8;case"*":return 64;default:return 2}}static getWordTokenType(e,t,n){let i=e.toLowerCase();if(this.SQL_COMMANDS.has(i))return 128;let s=this.skipWhitespaceAndComments(t,n);return s<t.length&&t[s]==="("?2048:64}static shouldLowercase(e){return!!(e&128)||!!(e&2)||!!(e&2048)}static createLexeme(e,t,n,i){return{type:e,value:t,comments:null,position:{startPosition:n,endPosition:i}}}static lineColumnToCharOffset(e,t){if(t.line<1||t.column<1)return-1;let n=e.split(`
22
- `);if(t.line>n.length)return-1;let i=n[t.line-1];if(t.column>i.length+1)return-1;let s=0;for(let r=0;r<t.line-1;r++)s+=n[r].length+1;return s+=t.column-1,s}static charOffsetToLineColumn(e,t){if(t<0||t>e.length)return null;let n=e.split(`
23
- `),i=0;for(let s=0;s<n.length;s++){let r=n[s].length;if(t<i+r)return{line:s+1,column:t-i+1};if(t===i+r&&s<n.length-1)return{line:s+2,column:1};i+=r+1}if(t===e.length){let s=n[n.length-1];return{line:n.length,column:s.length+1}}return null}};var ht=class{static analyzeCursorPosition(e,t){let n=this.extractCTERegions(e),s=this.calculateExtendedCTEBoundaries(e,n).find(r=>t>=r.startPosition&&t<r.extendedEndPosition);return s?{isInCTE:!0,cteRegion:{name:s.name,startPosition:s.startPosition,endPosition:s.endPosition,sqlContent:s.sqlContent},executableSQL:s.sqlContent}:{isInCTE:!1,cteRegion:null,executableSQL:this.extractMainQuery(e,n)}}static getCursorCte(e,t){try{let n=this.analyzeCursorPosition(e,t);return n.isInCTE&&n.cteRegion?.name||null}catch{return null}}static getCursorCteAt(e,t,n){try{let i=this.lineColumnToPosition(e,t,n);return i===-1?null:this.getCursorCte(e,i)}catch{return null}}static lineColumnToPosition(e,t,n){if(t<1||n<1)return-1;let i=e.split(`
24
- `);if(t>i.length)return-1;let s=i[t-1];if(n>s.length+1)return-1;let r=0;for(let o=0;o<t-1;o++)r+=i[o].length+1;return r+=n-1,r}static positionToLineColumn(e,t){if(t<0||t>e.length)return null;let i=e.substring(0,t).split(`
25
- `);return{line:i.length,column:i[i.length-1].length+1}}static extractCTERegions(e){let t=Ne.getAllLexemesWithPosition(e),n=[],i=0,s=!1;for(;i<t.length;){let r=t[i];if(r.value.toLowerCase()==="with"&&!s){s=!0,i++;continue}if(s&&r.value.toLowerCase()==="recursive"){i++;continue}if(s&&r.type===64&&i+1<t.length&&t[i+1].value.toLowerCase()==="as"){let o=r.value,l=r.position.startPosition,u=i+2;for(;u<t.length&&t[u].value!=="(";)u++;if(u<t.length){let c=this.findMatchingParen(t,u);if(c){let p=c.endPosition,d=this.extractCTESQL(e,t,u,c.index);n.push({name:o,startPosition:l,endPosition:p,sqlContent:d}),i=c.index+1;continue}}}if(s&&r.value.toLowerCase()==="select"&&this.isMainQuerySelect(t,i))break;i++}return n}static findMatchingParen(e,t){let n=1,i=t+1;for(;i<e.length&&n>0;){if(e[i].value==="("?n++:e[i].value===")"&&n--,n===0)return{index:i,endPosition:e[i].position.endPosition};i++}return null}static extractCTESQL(e,t,n,i){let s=t[n+1].position.startPosition,r=t[i-1].position.endPosition;return e.substring(s,r).trim()}static isMainQuerySelect(e,t){let n=0;for(let i=t-1;i>=0;i--)e[i].value===")"?n++:e[i].value==="("&&n--;return n===0}static calculateExtendedCTEBoundaries(e,t){return t.length===0?[]:t.map((n,i)=>{let s;return i<t.length-1?s=t[i+1].startPosition:s=this.findMainQueryStart(e,n.endPosition),{...n,extendedEndPosition:s}})}static findMainQueryStart(e,t){let n=t;for(;n<e.length;){if(e.substring(n).toLowerCase().trim().startsWith("select")){let s=e.toLowerCase().indexOf("select",n);return s!==-1?s:n}n++}return e.length}static extractMainQuery(e,t){if(t.length===0)return e.trim();let s=t[t.length-1].endPosition;for(;s<e.length&&!e.substring(s).toLowerCase().trim().startsWith("select");)s++;return e.substring(s).trim()}static getCTEPositions(e){let t=this.extractCTERegions(e),n=[];if(t.forEach(i=>{n.push({name:i.name,startPosition:i.startPosition,type:"CTE"})}),t.length>0){let s=t[t.length-1].endPosition;for(;s<e.length;){if(e.substring(s).toLowerCase().trim().startsWith("select")){n.push({name:"MAIN_QUERY",startPosition:s,type:"MAIN_QUERY"});break}s++}}else n.push({name:"MAIN_QUERY",startPosition:0,type:"MAIN_QUERY"});return n}};var A=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`[SelectQueryParser] Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The SELECT query is complete but there are additional tokens.`);return i.value}static calculateCharacterPosition(e,t,n){if(n>=t.length)return e.length;let i=t[n];if(i.position?.startPosition!==void 0)return i.position.startPosition;let s=0;for(let l=0;l<n;l++){let u=t[l].value,c=e.indexOf(u,s);c!==-1&&(s=c+u.length)}let r=t[n].value,o=e.indexOf(r,s);return o!==-1?o:s}static analyze(e){let t=[];try{t=new R(e).readLexmes();let i=this.parseFromLexeme(t,0);if(i.newIndex<t.length){let s=t.slice(i.newIndex).map(l=>l.value),r=t[i.newIndex],o=this.calculateCharacterPosition(e,t,i.newIndex);return{success:!1,query:i.value,error:`Syntax error: Unexpected token "${r.value}" at character position ${o}. The SELECT query is complete but there are additional tokens.`,errorPosition:o,remainingTokens:s}}return{success:!0,query:i.value}}catch(n){let i,s=n instanceof Error?n.message:String(n),r=s.match(/position (\d+)/);if(r){let o=parseInt(r[1],10);i=this.calculateCharacterPosition(e,t,o)}return{success:!1,error:s,errorPosition:i}}}static async parseAsync(e){return Promise.resolve(this.parse(e))}static{this.unionCommandSet=new Set(["union","union all","intersect","intersect all","except","except all"])}static{this.selectCommandSet=new Set(["with","select"])}static transferHeaderComments(e,t){e.headerComments&&(t.headerComments=e.headerComments,e.headerComments=null)}static extractUnionTokenComments(e){let t=[];if(e.positionedComments&&e.positionedComments.length>0){for(let n of e.positionedComments)n.comments&&n.comments.length>0&&t.push(...n.comments);e.positionedComments=void 0}return e.comments&&e.comments.length>0&&(t.push(...e.comments),e.comments=null),t.length>0?t:null}static parseFromLexeme(e,t){let n=t;if(n>=e.length)throw new Error(`Syntax error: Unexpected end of input at position ${t}.`);let i=e[n].value;if(!this.selectCommandSet.has(i)&&i!=="values")throw new Error(`Syntax error at position ${n}: Expected 'SELECT' or 'VALUES' keyword but found "${e[n].value}".`);let s=this.selectCommandSet.has(i)?this.parseSimpleSelectQuery(e,n):this.parseValuesQuery(e,n),r=s.value;for(n=s.newIndex;n<e.length&&this.unionCommandSet.has(e[n].value.toLowerCase());){let o=e[n],l=o.value.toLowerCase(),u=this.extractUnionTokenComments(o);if(n++,n>=e.length)throw new Error(`Syntax error at position ${n}: Expected a query after '${l.toUpperCase()}' but found end of input.`);let c=e[n].value.toLowerCase();if(this.selectCommandSet.has(c)){let p=this.parseSimpleSelectQuery(e,n),d=new Q(r,l,p.value);this.transferHeaderComments(r,d),u&&u.length>0&&(p.value.headerComments?p.value.headerComments=[...u,...p.value.headerComments]:p.value.headerComments=u),r=d,n=p.newIndex}else if(c==="values"){let p=this.parseValuesQuery(e,n),d=new Q(r,l,p.value);this.transferHeaderComments(r,d),u&&u.length>0&&(p.value.headerComments?p.value.headerComments=[...u,...p.value.headerComments]:p.value.headerComments=u),r=d,n=p.newIndex}else throw new Error(`Syntax error at position ${n}: Expected 'SELECT' or 'VALUES' after '${l.toUpperCase()}' but found "${e[n].value}".`)}return{value:r,newIndex:n}}static parseSimpleSelectQuery(e,t){let n=t,{withClauseResult:i,newIndex:s,selectQuery:r}=this.parseWithClauseAndComments(e,n);n=s;let{clauses:o,newIndex:l,selectTokenComments:u}=this.parseAllClauses(e,n,i);if(n=l,u&&u.length>0)if(i){let d=[...r.betweenClauseComments??[]];for(let h of u)d.includes(h)||d.push(h);r.betweenClauseComments=d,r.mainSelectPrefixComments=void 0}else{let p=r.headerComments??[];r.headerComments=[...p,...u]}let c=new g({withClause:i?i.value:null,...o});return this.applyCommentsToQuery(c,r,i),{value:c,newIndex:n}}static parseWithClauseAndComments(e,t){let n=t,i=null,s={};for(s.headerComments=this.collectHeaderComments(e,n);n<e.length&&e[n].value.toLowerCase()!=="with"&&e[n].value.toLowerCase()!=="select";)n++;return n<e.length&&e[n].value.toLowerCase()==="with"&&this.collectWithTokenHeaderComments(e[n],s),n<e.length&&e[n].value==="with"&&(i=Ft.parseFromLexeme(e,n),n=i.newIndex,s.mainSelectPrefixComments=this.collectMainSelectPrefixComments(e,i,n),s.betweenClauseComments=this.collectBetweenClauseComments(e,i,n)),{withClauseResult:i,newIndex:n,selectQuery:s}}static parseAllClauses(e,t,n){let i=t;i=this.findMainSelectToken(e,i,n);let s=this.collectSelectTokenComments(e,i),r=On.parseFromLexeme(e,i);i=r.newIndex;let o=this.parseOptionalClause(e,i,"from",$n);i=o.newIndex;let l=this.parseOptionalClause(e,o.newIndex,"where",Mn);i=l.newIndex;let u=this.parseOptionalClause(e,l.newIndex,"group by",Wn);i=u.newIndex;let c=this.parseOptionalClause(e,u.newIndex,"having",jn);i=c.newIndex;let p=this.parseOptionalClause(e,c.newIndex,"window",Dn);i=p.newIndex;let d=this.parseOptionalClause(e,p.newIndex,"order by",it);i=d.newIndex;let h=this.parseOptionalClause(e,d.newIndex,"limit",Un);i=h.newIndex;let C=this.parseOptionalClause(e,h.newIndex,"offset",qn);i=C.newIndex;let f=this.parseOptionalClause(e,C.newIndex,"fetch",_n);i=f.newIndex;let J=this.parseOptionalClause(e,f.newIndex,"for",Kn);return i=J.newIndex,{clauses:{selectClause:r.value,fromClause:o.value,whereClause:l.value,groupByClause:u.value,havingClause:c.value,orderByClause:d.value,windowClause:p.value,limitClause:h.value,offsetClause:C.value,fetchClause:f.value,forClause:J.value},newIndex:i,selectTokenComments:s}}static parseOptionalClause(e,t,n,i){return t<e.length&&e[t].value.toLowerCase()===n?i.parseFromLexeme(e,t):{value:null,newIndex:t}}static collectHeaderComments(e,t){let n=[],i=t;for(;i<e.length&&e[i].value.toLowerCase()!=="with"&&e[i].value.toLowerCase()!=="select";){let s=e[i];if(s.positionedComments)for(let r of s.positionedComments)r.comments&&n.push(...r.comments);s.comments&&s.comments.length>0&&n.push(...s.comments),i++}return n}static collectWithTokenHeaderComments(e,t){if(!e.positionedComments)return;t.headerComments||(t.headerComments=[]);let n=[];for(let i of e.positionedComments)i.position==="before"&&i.comments?t.headerComments.push(...i.comments):n.push(i);e.positionedComments=n.length>0?n:void 0}static collectMainSelectPrefixComments(e,t,n){let i=[];t?.value.trailingComments&&i.push(...t.value.trailingComments);let s=this.findMainSelectIndex(e,t,n);if(t&&s>t.newIndex)for(let r=t.newIndex;r<s;r++){let o=e[r];if(o.positionedComments)for(let l of o.positionedComments)l.comments&&i.push(...l.comments);o.comments&&o.comments.length>0&&i.push(...o.comments)}return i}static collectBetweenClauseComments(e,t,n){if(!t)return[];let i=[],s=t.newIndex,r=Math.max(0,s-1);for(let o=r;o<n;o++){let l=e[o];if(l.positionedComments&&l.positionedComments.length>0){for(let u of l.positionedComments)u.comments&&i.push(...u.comments);l.positionedComments=void 0}l.comments&&l.comments.length>0&&(i.push(...l.comments),l.comments=null)}return i}static findMainSelectIndex(e,t,n){if(t){for(let i=t.newIndex;i<e.length;i++)if(e[i].value.toLowerCase()==="select")return i}return n}static findMainSelectToken(e,t,n){let i=this.findMainSelectIndex(e,n,t);if(i>=e.length||e[i].value!=="select")throw new Error(`Syntax error at position ${i}: Expected 'SELECT' keyword but found "${i<e.length?e[i].value:"end of input"}". SELECT queries must start with the SELECT keyword.`);return i}static collectSelectTokenComments(e,t){let n=e[t],i=[];if(n.comments&&n.comments.length>0&&(i.push(...n.comments),n.comments=null),n.positionedComments&&n.positionedComments.length>0){for(let s of n.positionedComments)s.position==="before"&&s.comments&&i.push(...s.comments);n.positionedComments=void 0}return i}static applyCommentsToQuery(e,t,n){t.headerComments?.length>0&&(e.headerComments=t.headerComments);let i=s=>{if(!s||s.length===0)return;let r=e.comments??[],o=[];for(let l of s)o.includes(l)||o.push(l);for(let l of r)o.includes(l)||o.push(l);e.comments=o};i(t.mainSelectPrefixComments),i(t.betweenClauseComments)}static parseValuesQuery(e,t){let n=Jn.parseFromLexeme(e,t);return{value:n.value,newIndex:n.newIndex}}static getCursorCte(e,t){return ht.getCursorCte(e,t)}static getCursorCteAt(e,t,n){return ht.getCursorCteAt(e,t,n)}static positionToLineColumn(e,t){return ht.positionToLineColumn(e,t)}};var Qi=class{static parse(e){let n=new R(e).readLexmes(),i=this.parseFromLexeme(n,0);if(i.newIndex<n.length)throw new Error(`Syntax error: Unexpected token "${n[i.newIndex].value}" at position ${i.newIndex}. The INSERT query is complete but there are additional tokens.`);return i.value}static parseFromLexeme(e,t){let n=t,i=null;if(e[n].value==="with"){let l=Ft.parseFromLexeme(e,n);i=l.value,n=l.newIndex}if(e[n].value!=="insert into")throw new Error(`Syntax error at position ${n}: Expected 'INSERT INTO' but found '${e[n].value}'.`);n++;let s=Ye.parseTableSourceFromLexemes(e,n);n=s.newIndex;let r=[];if(e[n]?.type===4){for(n++;n<e.length&&e[n].type===64&&(r.push(e[n].value),n++,e[n]?.type===16);)n++;if(e[n]?.type!==8)throw new Error(`Syntax error at position ${n}: Expected ')' after column list.`);n++}let o=A.parseFromLexeme(e,n);if(i)if(o.value instanceof g)o.value.withClause=i;else throw new Error("WITH clause is not supported in this context.");return n=o.newIndex,{value:new ot({insertClause:new ct(s.value,r),selectQuery:o.value}),newIndex:n}}};var zn=class{constructor(){this.tableSources=[];this.visitedNodes=new Set;this.tableNameMap=new Map;this.isRootVisit=!0;this.handlers=new Map,this.handlers.set(g.kind,e=>this.visitSimpleSelectQuery(e)),this.handlers.set(Q.kind,e=>this.visitBinarySelectQuery(e)),this.handlers.set(Ce.kind,e=>this.visitValuesQuery(e)),this.handlers.set(K.kind,e=>this.visitFromClause(e)),this.handlers.set(fe.kind,e=>this.visitJoinClause(e)),this.handlers.set(he.kind,e=>this.visitJoinOnClause(e)),this.handlers.set(Se.kind,e=>this.visitJoinUsingClause(e)),this.handlers.set(B.kind,e=>this.visitSourceExpression(e)),this.handlers.set(O.kind,e=>this.visitTableSource(e)),this.handlers.set(ze.kind,e=>this.visitFunctionSource(e)),this.handlers.set($e.kind,e=>this.visitParenSource(e)),this.handlers.set(M.kind,e=>this.visitSubQuerySource(e)),this.handlers.set(ge.kind,e=>this.visitInlineQuery(e)),this.handlers.set(re.kind,e=>this.visitWhereClause(e)),this.handlers.set(me.kind,e=>this.visitGroupByClause(e)),this.handlers.set(de.kind,e=>this.visitHavingClause(e)),this.handlers.set(pe.kind,e=>this.visitOrderByClause(e)),this.handlers.set(Pe.kind,e=>this.visitWindowFrameClause(e)),this.handlers.set(oe.kind,e=>this.visitLimitClause(e)),this.handlers.set(Fe.kind,e=>this.visitOffsetClause(e)),this.handlers.set(Ke.kind,e=>this.visitFetchClause(e)),this.handlers.set(Ae.kind,e=>this.visitForClause(e)),this.handlers.set(Le.kind,e=>this.visitOrderByItem(e)),this.handlers.set(q.kind,e=>this.visitSelectClause(e)),this.handlers.set(_.kind,e=>this.visitSelectItem(e)),this.handlers.set(Z.kind,e=>this.visitParenExpression(e)),this.handlers.set(S.kind,e=>this.visitBinaryExpression(e)),this.handlers.set(ne.kind,e=>this.visitUnaryExpression(e)),this.handlers.set(se.kind,e=>this.visitCaseExpression(e)),this.handlers.set(xe.kind,e=>this.visitCaseKeyValuePair(e)),this.handlers.set(Ee.kind,e=>this.visitSwitchCaseArgument(e)),this.handlers.set(we.kind,e=>this.visitBetweenExpression(e)),this.handlers.set(U.kind,e=>this.visitFunctionCall(e)),this.handlers.set(ye.kind,e=>this.visitArrayExpression(e)),this.handlers.set(ve.kind,e=>this.visitArrayQueryExpression(e)),this.handlers.set(Ie.kind,e=>this.visitTupleExpression(e)),this.handlers.set(ce.kind,e=>this.visitCastExpression(e)),this.handlers.set(D.kind,e=>this.visitValueList(e)),this.handlers.set(je.kind,e=>this.visitStringSpecifierExpression(e))}collect(e){return this.visit(e),this.getTableSources()}getTableSources(){return this.tableSources}reset(){this.tableSources=[],this.tableNameMap.clear(),this.visitedNodes.clear()}getTableIdentifier(e){return e.qualifiedName.namespaces&&e.qualifiedName.namespaces.length>0?e.qualifiedName.namespaces.map(t=>t.name).join(".")+"."+(e.qualifiedName.name instanceof V?e.qualifiedName.name.value:e.qualifiedName.name.name):e.qualifiedName.name instanceof V?e.qualifiedName.name.value:e.qualifiedName.name.name}visit(e){if(!this.isRootVisit){this.visitNode(e);return}this.reset(),this.isRootVisit=!1;try{this.visitNode(e)}finally{this.isRootVisit=!0}}visitNode(e){if(this.visitedNodes.has(e))return;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());if(t){t(e);return}}visitSimpleSelectQuery(e){if(e.fromClause&&e.fromClause.accept(this),e.whereClause&&e.whereClause.accept(this),e.groupByClause&&e.groupByClause.accept(this),e.havingClause&&e.havingClause.accept(this),e.orderByClause&&e.orderByClause.accept(this),e.windowClause)for(let t of e.windowClause.windows)t.accept(this);e.limitClause&&e.limitClause.accept(this),e.offsetClause&&e.offsetClause.accept(this),e.fetchClause&&e.fetchClause.accept(this),e.forClause&&e.forClause.accept(this),e.selectClause.accept(this)}visitBinarySelectQuery(e){e.left.accept(this),e.right.accept(this)}visitValuesQuery(e){for(let t of e.tuples)t.accept(this)}visitFromClause(e){if(e.source.accept(this),e.joins)for(let t of e.joins)t.accept(this)}visitSourceExpression(e){e.datasource.accept(this)}visitTableSource(e){let t=this.getTableIdentifier(e);this.tableNameMap.has(t)||(this.tableNameMap.set(t,!0),this.tableSources.push(e))}visitFunctionSource(e){e.argument&&this.visitValueComponent(e.argument)}visitValueComponent(e){e.accept(this)}visitParenSource(e){e.source.accept(this)}visitSubQuerySource(e){e.query.accept(this)}visitInlineQuery(e){e.selectQuery.accept(this)}visitJoinClause(e){e.source.accept(this),e.condition&&e.condition.accept(this)}visitJoinOnClause(e){e.condition.accept(this)}visitJoinUsingClause(e){e.condition.accept(this)}visitWhereClause(e){e.condition.accept(this)}visitGroupByClause(e){for(let t of e.grouping)t.accept(this)}visitHavingClause(e){e.condition.accept(this)}visitOrderByClause(e){for(let t of e.order)t.accept(this)}visitWindowFrameClause(e){e.expression.accept(this)}visitLimitClause(e){e.value.accept(this)}visitOffsetClause(e){e.value.accept(this)}visitFetchClause(e){e.expression.accept(this)}visitForClause(e){}visitOrderByItem(e){e.value.accept(this)}visitSelectClause(e){for(let t of e.items)t.accept(this)}visitSelectItem(e){e.value.accept(this)}visitParenExpression(e){e.expression.accept(this)}visitBinaryExpression(e){e.left.accept(this),e.right.accept(this)}visitUnaryExpression(e){e.expression.accept(this)}visitCaseExpression(e){e.condition&&e.condition.accept(this),e.switchCase.accept(this)}visitSwitchCaseArgument(e){for(let t of e.cases)t.accept(this);e.elseValue&&e.elseValue.accept(this)}visitCaseKeyValuePair(e){e.key.accept(this),e.value.accept(this)}visitBetweenExpression(e){e.expression.accept(this),e.lower.accept(this),e.upper.accept(this)}visitFunctionCall(e){e.argument&&e.argument.accept(this),e.over&&e.over.accept(this)}visitArrayExpression(e){e.expression.accept(this)}visitArrayQueryExpression(e){e.query.accept(this)}visitTupleExpression(e){for(let t of e.values)t.accept(this)}visitCastExpression(e){e.input.accept(this),e.castType.accept(this)}visitValueList(e){for(let t of e.values)t.accept(this)}visitStringSpecifierExpression(e){}};var ft=class a{constructor(){this.dependencyGraph=null;this.cteMap=new Map;this.sourceCollector=new Ge(!1),this.cteReferenceCollector=new zn,this.cteCollector=new X}static{this.ERROR_MESSAGES={NOT_ANALYZED:"Must call analyzeDependencies first",CIRCULAR_REFERENCE:"Circular reference detected in CTE"}}static{this.MAIN_QUERY_NAME="MAIN_QUERY"}analyzeDependencies(e){let t=this.cteCollector.collect(e);return this.buildCTEMap(t),this.dependencyGraph=this.buildDependencyGraph(t,e),this.dependencyGraph}getDependencies(e){this.ensureAnalyzed();let t=this.findNodeByName(e);return t?[...t.dependencies]:[]}getDependents(e){this.ensureAnalyzed();let t=this.findNodeByName(e);return t?[...t.dependents]:[]}getMainQueryDependencies(){this.ensureAnalyzed();let e=this.findNodeByName(a.MAIN_QUERY_NAME);return e?[...e.dependencies]:[]}getNodesByType(e){return this.ensureAnalyzed(),this.dependencyGraph.nodes.filter(t=>t.type===e)}getMainQueryNode(){return this.ensureAnalyzed(),this.findNodeByName(a.MAIN_QUERY_NAME)}hasCircularDependency(){this.ensureAnalyzed();try{return this.getExecutionOrder(),!1}catch(e){if(e instanceof Error&&e.message.includes(a.ERROR_MESSAGES.CIRCULAR_REFERENCE))return!0;throw e}}getExecutionOrder(){this.ensureAnalyzed();let e=new Set,t=new Set,n=[],i=new Map;for(let r of this.dependencyGraph.nodes)i.set(r.name,new Set(r.dependencies));let s=r=>{if(e.has(r))return;if(t.has(r))throw new Error(`${a.ERROR_MESSAGES.CIRCULAR_REFERENCE}: ${r}`);t.add(r);let o=i.get(r)||new Set;for(let l of o)s(l);t.delete(r),e.add(r),n.push(r)};for(let r of this.dependencyGraph.nodes)e.has(r.name)||s(r.name);return n}buildDependencyGraph(e,t){let n=[],i=[],s=new Map,r=new Map;for(let l of e){let u=a.getCTEName(l);s.set(u,new Set),r.set(u,new Set)}s.set(a.MAIN_QUERY_NAME,new Set),r.set(a.MAIN_QUERY_NAME,new Set);for(let l of e){let u=a.getCTEName(l),c=this.sourceCollector.collect(l.query);for(let p of c){let d=p.table.name;this.cteMap.has(d)&&d!==u&&(s.get(u).add(d),r.get(d).add(u),i.push({from:u,to:d}))}}let o=this.getMainQueryWithoutCTE(t);if(o){let l=this.cteReferenceCollector.collect(o);for(let u of l){let c=u.table.name;this.cteMap.has(c)&&(s.get(a.MAIN_QUERY_NAME).add(c),r.get(c).add(a.MAIN_QUERY_NAME),i.push({from:a.MAIN_QUERY_NAME,to:c}))}}for(let l of e){let u=a.getCTEName(l);n.push({name:u,type:"CTE",cte:l,dependencies:Array.from(s.get(u)||new Set),dependents:Array.from(r.get(u)||new Set)})}return n.push({name:a.MAIN_QUERY_NAME,type:"ROOT",cte:null,dependencies:Array.from(s.get(a.MAIN_QUERY_NAME)||new Set),dependents:Array.from(r.get(a.MAIN_QUERY_NAME)||new Set)}),{nodes:n,edges:i}}ensureAnalyzed(){if(!this.dependencyGraph)throw new Error(a.ERROR_MESSAGES.NOT_ANALYZED)}buildCTEMap(e){this.cteMap.clear();for(let t of e){let n=a.getCTEName(t);this.cteMap.set(n,t)}}findNodeByName(e){return this.dependencyGraph?.nodes.find(t=>t.name===e)}getMainQueryWithoutCTE(e){return e.withClause?new g({selectClause:e.selectClause,fromClause:e.fromClause,whereClause:e.whereClause,groupByClause:e.groupByClause,havingClause:e.havingClause,orderByClause:e.orderByClause,limitClause:e.limitClause,offsetClause:e.offsetClause,fetchClause:e.fetchClause,forClause:e.forClause,windowClause:e.windowClause}):e}static getCTEName(e){return e.aliasExpression.table.name}};var Hn=class{static addComment(e,t,n="before"){if(this.isSelectQuery(e)){let i=e;i.headerComments||(i.headerComments=[]),i.headerComments.push(t)}else e.addPositionedComments(n,[t])}static isSelectQuery(e){return"__selectQueryType"in e&&e.__selectQueryType==="SelectQuery"}static editComment(e,t,n,i="before"){if(this.isSelectQuery(e)){let s=e;if(!s.headerComments||t<0||t>=s.headerComments.length)throw new Error(`Invalid comment index: ${t}. Component has ${s.headerComments?.length||0} comments.`);s.headerComments[t]=n}else{let s=e.getPositionedComments(i);if(!s||t<0||t>=s.length)throw new Error(`Invalid comment index: ${t}. Component has ${s?.length||0} ${i} positioned comments.`);let r=e.positionedComments?.find(o=>o.position===i);r&&(r.comments[t]=n)}}static deleteComment(e,t,n="before"){if(this.isSelectQuery(e)){let i=e;if(!i.headerComments||t<0||t>=i.headerComments.length)throw new Error(`Invalid comment index: ${t}. Component has ${i.headerComments?.length||0} comments.`);i.headerComments.splice(t,1),i.headerComments.length===0&&(i.headerComments=null)}else{let i=e.getPositionedComments(n);if(!i||t<0||t>=i.length)throw new Error(`Invalid comment index: ${t}. Component has ${i?.length||0} ${n} positioned comments.`);let s=e.positionedComments?.find(r=>r.position===n);s&&(s.comments.splice(t,1),s.comments.length===0&&(e.positionedComments=e.positionedComments?.filter(r=>r.position!==n)||null,e.positionedComments?.length===0&&(e.positionedComments=null)))}}static deleteAllComments(e){if(this.isSelectQuery(e)){let t=e;t.headerComments=null}else e.positionedComments=null}static getComments(e){return this.isSelectQuery(e)?e.headerComments||[]:e.getAllPositionedComments()}static findComponentsWithComment(e,t,n=!1){let i=[],s=n?t:t.toLowerCase(),r=o=>{if(o&&o instanceof v){let l=!1,u=o.getAllPositionedComments();if(u&&u.some(c=>(n?c:c.toLowerCase()).includes(s))&&(l=!0),this.isSelectQuery(o)){let c=o;c.headerComments&&c.headerComments.some(p=>(n?p:p.toLowerCase()).includes(s))&&(l=!0)}l&&i.push(o)}for(let l in o)o[l]&&typeof o[l]=="object"&&(Array.isArray(o[l])?o[l].forEach(r):r(o[l]))};return r(e),i}static replaceInComments(e,t,n,i=!1){let s=0,r=o=>{if(o&&o instanceof v){if(o.comments)for(let l=0;l<o.comments.length;l++){let u=o.comments[l],c=i?"g":"gi",p=new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c),d=u.replace(p,n);d!==u&&(o.comments[l]=d,s++)}if(o.positionedComments){for(let l of o.positionedComments)if(l.comments)for(let u=0;u<l.comments.length;u++){let c=l.comments[u],p=i?"g":"gi",d=new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p),h=c.replace(d,n);h!==c&&(l.comments[u]=h,s++)}}if(this.isSelectQuery(o)){let l=o;if(l.headerComments)for(let u=0;u<l.headerComments.length;u++){let c=l.headerComments[u],p=i?"g":"gi",d=new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p),h=c.replace(d,n);h!==c&&(l.headerComments[u]=h,s++)}}}for(let l in o)o[l]&&typeof o[l]=="object"&&(Array.isArray(o[l])?o[l].forEach(r):r(o[l]))};return r(e),s}static countComments(e){let t=0,n=i=>{if(i&&i instanceof v){let s=i.getAllPositionedComments();if(s&&(t+=s.length),this.isSelectQuery(i)){let r=i;r.headerComments&&(t+=r.headerComments.length)}}for(let s in i)i[s]&&typeof i[s]=="object"&&(Array.isArray(i[s])?i[s].forEach(n):n(i[s]))};return n(e),t}static getAllComments(e){let t=[],n=i=>{if(i&&i instanceof v){let s=i.getAllPositionedComments();if(s&&s.forEach((r,o)=>{t.push({comment:r,component:i,index:o})}),this.isSelectQuery(i)){let r=i;r.headerComments&&r.headerComments.forEach((o,l)=>{t.push({comment:o,component:i,index:l})})}}for(let s in i)i[s]&&typeof i[s]=="object"&&(Array.isArray(i[s])?i[s].forEach(n):n(i[s]))};return n(e),t}};var lt=class{constructor(e,t){this.name=e,this.columns=t}},Bt=class{constructor(e=null,t=!1){this.tableColumnResolver=e;this.allowWildcardWithoutResolver=t;this.tableSchemas=[];this.visitedNodes=new Set;this.commonTables=[];this.running=!1;this.unresolvedColumns=[];this.analysisError=void 0;this.isAnalyzeMode=!1;this.handlers=new Map,this.handlers.set(g.kind,n=>this.visitSimpleSelectQuery(n)),this.handlers.set(Q.kind,n=>this.visitBinarySelectQuery(n))}collect(e){return this.visit(e),this.tableSchemas}analyze(e){this.isAnalyzeMode=!0;try{return this.visit(e),{success:this.unresolvedColumns.length===0&&!this.analysisError,schemas:this.tableSchemas,unresolvedColumns:this.unresolvedColumns,error:this.analysisError}}finally{this.isAnalyzeMode=!1}}visit(e){if(this.running){this.visitNode(e);return}this.reset(),this.running=!0;try{if(!(e instanceof g||e instanceof Q))throw new Error(`Unsupported SQL component type for schema collection. Received: ${e.constructor.name}. Expected: SimpleSelectQuery or BinarySelectQuery.`);let t=new X;this.commonTables=t.collect(e),this.visitNode(e),this.consolidateTableSchemas()}finally{this.running=!1}}visitNode(e){if(this.visitedNodes.has(e))return;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());if(t){t(e);return}}reset(){this.tableSchemas=[],this.visitedNodes=new Set,this.commonTables=[],this.unresolvedColumns=[],this.analysisError=void 0}consolidateTableSchemas(){let e=new Map;for(let t of this.tableSchemas)if(!e.has(t.name))e.set(t.name,new Set(t.columns));else{let n=e.get(t.name);t.columns.forEach(i=>n?.add(i))}this.tableSchemas=Array.from(e.entries()).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>new lt(t,Array.from(n).sort()))}handleSourceExpression(e,t,n){if(e.datasource instanceof O){let i=e.datasource.getSourceName(),s=this.commonTables.filter(r=>r.getSourceAliasName()===i);if(s.length>0){s[0].query.accept(this);let r=e.getAliasName()??i;this.processCTETableSchema(s[0],r,t,n)}else{let r=e.getAliasName()??i;this.processCollectTableSchema(i,r,t,n)}}else e.datasource instanceof M&&this.visitNode(e.datasource.query)}visitSimpleSelectQuery(e){if(e.fromClause===null)return;let n=new ke(this.tableColumnResolver,!0,"fullName").collect(e),i;if(this.allowWildcardWithoutResolver){let s=this.getSelectClauseColumns(e);i=n.filter(r=>r.value instanceof b).map(r=>r.value).filter(r=>{let o=r.getNamespace(),l=r.column.name;return s.some(u=>{if(u.value instanceof b){let c=u.value.getNamespace(),p=u.value.column.name;if(c===o&&p===l)return!0;if(p==="*"){if(this.allowWildcardWithoutResolver&&this.tableColumnResolver===null)return!1;if(c===""||c===o)return!0}}return!1})}).map(r=>({table:r.getNamespace(),column:r.column.name}))}else i=n.filter(s=>s.value instanceof b).map(s=>s.value).map(s=>({table:s.getNamespace(),column:s.column.name}));if(e.fromClause.joins!==null&&e.fromClause.joins.length>0){let s=i.filter(r=>r.table==="").map(r=>r.column);if(s.length>0)if(this.isAnalyzeMode)this.unresolvedColumns.push(...s),this.analysisError=`Column reference(s) without table name found in query: ${s.join(", ")}`;else throw new Error(`Column reference(s) without table name found in query: ${s.join(", ")}`)}if(e.fromClause.source.datasource instanceof O?this.handleSourceExpression(e.fromClause.source,i,!0):e.fromClause.source.datasource instanceof M&&e.fromClause.source.datasource.query.accept(this),e.fromClause?.joins)for(let s of e.fromClause.joins)s.source.datasource instanceof O?this.handleSourceExpression(s.source,i,!1):s.source.datasource instanceof M&&s.source.datasource.query.accept(this)}visitBinarySelectQuery(e){this.visitNode(e.left),this.visitNode(e.right)}getSelectClauseColumns(e){if(!e.selectClause)return[];let t=[];for(let n of e.selectClause.items)if(n.value instanceof b){let i=n.value.column.name;t.push({name:i,value:n.value})}return t}processCollectTableSchema(e,t,n,i=!1){if(this.tableColumnResolver===null&&n.filter(l=>l.table===t||i&&l.table==="").filter(l=>l.column==="*").length>0&&!this.allowWildcardWithoutResolver){let l=e?`Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards. Target table: ${e}`:"Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards.";if(this.isAnalyzeMode){this.analysisError=l;let u=n.filter(c=>c.table===t||i&&c.table==="").filter(c=>c.column==="*").map(c=>c.table?`${c.table}.*`:"*");this.unresolvedColumns.push(...u)}else throw new Error(l)}let s=n.filter(o=>o.column!=="*").filter(o=>o.table===t||i&&o.table==="").map(o=>o.column),r=new lt(e,s);this.tableSchemas.push(r)}processCTETableSchema(e,t,n,i=!1){let s=e.getSourceAliasName(),r=this.getCTEColumns(e),o=n.filter(c=>c.table===t||i&&c.table==="").map(c=>c.column);if(o.includes("*")){if(this.tableColumnResolver!==null){let c=this.tableColumnResolver(s);if(c.length>0){let p=new lt(s,c);this.tableSchemas.push(p);return}}if(r.length>0){let c=new lt(s,r);this.tableSchemas.push(c);return}else if(this.allowWildcardWithoutResolver){let c=new lt(s,[]);this.tableSchemas.push(c);return}else{let c=`Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards. Target table: ${s}`;if(this.isAnalyzeMode)this.analysisError=c,this.unresolvedColumns.push(t?`${t}.*`:"*");else throw new Error(c);return}}let l=o.filter(c=>c!=="*");if(this.isAnalyzeMode){let c=r;if(this.tableColumnResolver){let p=this.tableColumnResolver(s);p.length>0&&(c=p)}if(c.length>0){let p=l.filter(d=>!c.includes(d));p.length>0&&(this.unresolvedColumns.push(...p),this.analysisError||(this.analysisError=`Undefined column(s) found in CTE "${s}": ${p.join(", ")}`))}else if(!this.allowWildcardWithoutResolver){let p=l;p.length>0&&(this.unresolvedColumns.push(...p),this.analysisError||(this.analysisError=`Undefined column(s) found in CTE "${s}": ${p.join(", ")}`))}}let u=new lt(s,l);this.tableSchemas.push(u)}getCTEColumns(e){try{return e.query instanceof g&&e.query.selectClause?this.extractColumnsFromSelectItems(e.query.selectClause.items,e):this.extractColumnsUsingCollector(e.query)}catch{return[]}}extractColumnsFromSelectItems(e,t){let n=[];for(let i of e)if(i.value instanceof b){let s=i.identifier?.name||i.value.column.name;if(i.value.column.name==="*"){let r=this.resolveWildcardInCTE(i.value,t);if(r===null)return[];n.push(...r)}else n.push(s)}else i.identifier&&n.push(i.identifier.name);return this.removeDuplicates(n)}resolveWildcardInCTE(e,t){let n=e.getNamespace();return n?this.resolveQualifiedWildcard(n):this.resolveUnqualifiedWildcard(t)}resolveQualifiedWildcard(e){let t=this.commonTables.find(n=>n.getSourceAliasName()===e);if(t){let n=this.getCTEColumns(t);if(n.length>0)return n}return null}resolveUnqualifiedWildcard(e){if(!(e.query instanceof g)||!e.query.fromClause)return null;let t=e.query.fromClause.source;return t.datasource instanceof O?this.resolveTableWildcard(t.datasource.table.name):(t.datasource instanceof M,null)}resolveTableWildcard(e){if(this.tableColumnResolver){let t=this.tableColumnResolver(e);if(t.length>0)return t}return this.allowWildcardWithoutResolver,null}extractColumnsUsingCollector(e){return new ke(null,!0,"fullName").collect(e).filter(i=>i.value instanceof b).map(i=>i.value).map(i=>i.column.name).filter((i,s,r)=>r.indexOf(i)===s)}removeDuplicates(e){return e.filter((t,n,i)=>i.indexOf(t)===n)}};var Gn=class{static validate(e,t){let n=typeof e=="string"?A.parse(e):e,i=Array.isArray(t)?l=>{let u=t.find(c=>c.name===l);return u?u.columns:[]}:t,r=new Bt(i).collect(n),o=[];for(let l of r){let u=i(l.name);if(u.length===0){o.push(`Table '${l.name}' is not defined.`);continue}let c=l.columns.filter(p=>!u.includes(p));c.length>0&&o.push(`Table '${l.name}' contains undefined columns: ${c.join(", ")}.`)}if(o.length>0)throw new Error(o.join(`
26
- `))}};var Yn=class{constructor(e={}){this.knownCTENames=[];this.options=e,this.formatter=new Be(e),this.dependencyAnalyzer=new ft}compose(e,t){if(e.length===0)return t;this.knownCTENames=e.map(p=>p.name);let n=e.map(p=>({name:p.name,query:this.extractPureQuery(p.query,p.name)})),i=this.buildTempQueryForAnalysis(n,t),s=this.dependencyAnalyzer.analyzeDependencies(i),r=this.sortCTEsByDependencies(n,s),o=this.detectRecursiveFromOriginalQueries(e),l=r.map(p=>`${p.name} as (${p.query})`),c=`${o?"with recursive":"with"} ${l.join(", ")} ${t}`;return this.options.validateSchema&&this.options.schema&&this.validateComposedQuery(c),this.formatFinalQuery(c)}extractPureQuery(e,t){if(!/^\s*with\s+/i.test(e)||/^\s*with\s+recursive\s+/i.test(e))return e;try{let s=A.parse(e);if(s.withClause&&s.withClause.tables){let r=this.getKnownCTENames();if(s.withClause.tables.map(u=>this.getCTEName(u)).every(u=>r.includes(u))){let u=new g({selectClause:s.selectClause,fromClause:s.fromClause,whereClause:s.whereClause,groupByClause:s.groupByClause,havingClause:s.havingClause,orderByClause:s.orderByClause,windowClause:s.windowClause,limitClause:s.limitClause,offsetClause:s.offsetClause,fetchClause:s.fetchClause,forClause:s.forClause,withClause:void 0});return new Be({identifierEscape:{start:"",end:""}}).format(u).formattedSql}}}catch{}return e}getKnownCTENames(){return this.knownCTENames||[]}getCTEName(e){return e.aliasExpression.table.name}extractCTEWithRegex(e,t){let n=new RegExp(`${t}\\s+as\\s*\\(`,"i"),i=e.match(n);if(!i)return e;let s=i.index+i[0].length,r=1,o=s;for(;o<e.length&&r>0;){let l=e[o];l==="("?r++:l===")"&&r--,o++}return r===0?e.substring(s,o-1).trim():e}buildTempQueryForAnalysis(e,t){let i=`with ${e.map(s=>`${s.name} as (${s.query})`).join(", ")} ${t}`;try{return A.parse(i)}catch(s){throw new Error(`Failed to parse temporary query for dependency analysis: ${s}`)}}sortCTEsByDependencies(e,t){let n=new Map;return e.forEach(i=>n.set(i.name,i.query)),t.nodes.map(i=>({name:i.name,query:n.get(i.name)||""})).filter(i=>i.query!=="")}detectRecursiveFromOriginalQueries(e){return e.some(t=>t.query.toLowerCase().includes("with recursive"))}detectRecursiveCTEs(e){return e.withClause?this.formatter.format(e).formattedSql.toLowerCase().includes("with recursive"):!1}validateComposedQuery(e){try{let t=A.parse(e),n=Object.entries(this.options.schema).map(([i,s])=>({name:i,columns:s}));Gn.validate(t,n)}catch(t){throw t instanceof Error?new Error(`Schema validation failed: ${t.message}`):t}}formatFinalQuery(e){if(this.options.preset||this.options.keywordCase)try{let t=A.parse(e);return this.formatter.format(t).formattedSql}catch{return e}return e}};var Oi=class a{static{this.ERROR_MESSAGES={CIRCULAR_REFERENCE:"Circular reference detected in non-recursive CTEs",PARSING_FAILED:"Failed to parse query for comment injection"}}static{this.COMMENT_TEXTS={AUTO_GENERATED:"Auto-generated by CTE decomposer",ORIGINAL_CTE:"Original CTE:",DEPENDENCIES:"Dependencies:",DEPENDENTS:"Dependents:",RECURSIVE_TYPE:"Type: Recursive CTE",NONE:"none"}}constructor(e={}){this.options=e,this.dependencyAnalyzer=new ft,this.cteCollector=new X,this.formatter=new Be(e)}decompose(e){let t=this.cteCollector.collect(e);if(t.length===0)return[];let n=this.findRecursiveCTEs(e,t),i=this.dependencyAnalyzer.analyzeDependencies(e);return this.validateCircularDependencies(n.length>0),this.processCTENodes(e,i.nodes,n)}synchronize(e,t){if(e.length===0)return[];let n=this.flattenNestedWithClauses(e),i={...this.options,addComments:void 0},r=new Yn(i).compose(n,t),o=A.parse(r);return this.decompose(o)}extractCTE(e,t){let n=[],i=this.cteCollector.collect(e);if(i.length===0)throw new Error("Query does not contain any CTEs");if(!i.find(C=>this.getCTEName(C)===t))throw new Error(`CTE not found in query: ${t}`);if(this.findRecursiveCTEs(e,i).includes(t))return n.push("Recursive CTE restoration requires the full query context"),{name:t,executableSql:this.formatter.format(e).formattedSql,dependencies:this.getAllCTENames(i).filter(C=>C!==t),warnings:n};let l=this.dependencyAnalyzer.analyzeDependencies(e);if(this.dependencyAnalyzer.hasCircularDependency())throw new Error("Circular dependency detected in CTEs");let u=l.nodes.find(C=>C.name===t);if(!u||!u.cte)throw new Error(`CTE not found in dependency graph: ${t}`);let c=this.buildExecutableQuery(u,l.nodes),d=this.collectRequiredCTEs(u,l.nodes).map(C=>C.name),h=this.options.addComments?this.addRestorationComments(c,u,n):c;return{name:t,executableSql:h,dependencies:d,warnings:n}}flattenNestedWithClauses(e){let t=[],n=new Map;for(let s of e)try{if(/^\s*with\s+/i.test(s.query)){let o=A.parse(s.query);if(o.withClause&&o.withClause.tables){for(let p of o.withClause.tables){let d=this.getCTEName(p);if(!n.has(d)){let C=new Be({identifierEscape:{start:"",end:""}}).format(p.query).formattedSql;n.set(d,C)}}let l=new g({selectClause:o.selectClause,fromClause:o.fromClause,whereClause:o.whereClause,groupByClause:o.groupByClause,havingClause:o.havingClause,orderByClause:o.orderByClause,windowClause:o.windowClause,limitClause:o.limitClause,offsetClause:o.offsetClause,fetchClause:o.fetchClause,forClause:o.forClause,withClause:void 0}),c=new Be({identifierEscape:{start:"",end:""}}).format(l).formattedSql;t.push({name:s.name,query:c})}else t.push(s)}else t.push(s)}catch{t.push(s)}let i=[];for(let[s,r]of n)i.push({name:s,query:r});return i.push(...t),i}validateCircularDependencies(e){if(this.dependencyAnalyzer.hasCircularDependency()&&!e)throw new Error(a.ERROR_MESSAGES.CIRCULAR_REFERENCE)}processCTENodes(e,t,n){let i=[];for(let s of t){if(s.type==="ROOT")continue;n.includes(s.name)?i.push(this.createRecursiveCTE(s,e)):i.push(this.createStandardCTE(s,t))}return i}createRecursiveCTE(e,t){let n=this.formatter.format(t).formattedSql,i=e.dependents.filter(r=>r!=="MAIN_QUERY"),s=this.addCommentsToQuery(n,e.name,e.dependencies,e.dependents,!0);return{name:e.name,query:s,dependencies:[...e.dependencies],dependents:i,isRecursive:!0}}createStandardCTE(e,t){let n=this.buildExecutableQuery(e,t),i=this.addCommentsToQuery(n,e.name,e.dependencies,e.dependents,!1),s=e.dependents.filter(r=>r!=="MAIN_QUERY");return{name:e.name,query:i,dependencies:[...e.dependencies],dependents:s,isRecursive:!1}}buildExecutableQuery(e,t){if(e.type==="ROOT"||!e.cte)throw new Error(`Cannot build executable query for ROOT node: ${e.name}`);let n=this.collectRequiredCTEs(e,t);if(n.length===0)return this.formatter.format(e.cte.query).formattedSql;let i=this.buildWithClause(n),s=this.formatter.format(e.cte.query).formattedSql;return`${i} ${s}`}collectRequiredCTEs(e,t){let n=new Set,i=[],s=new Map;for(let o of t)s.set(o.name,o);let r=o=>{if(n.has(o))return;n.add(o);let l=s.get(o);if(l){for(let u of l.dependencies)r(u);o!==e.name&&l.type!=="ROOT"&&i.push(l)}};for(let o of e.dependencies)r(o);return i}buildWithClause(e){return e.length===0?"":`with ${e.map(n=>{if(n.type==="ROOT"||!n.cte)throw new Error(`Cannot include ROOT node in WITH clause: ${n.name}`);let i=n.name,s=this.formatter.format(n.cte.query).formattedSql;return`${i} as (${s})`}).join(", ")}`}findRecursiveCTEs(e,t){return!e.withClause||!this.isRecursiveWithClause(e)?[]:t.map(n=>this.getCTEName(n))}isRecursiveWithClause(e){return this.formatter.format(e).formattedSql.toLowerCase().includes("with recursive")}addCommentsToQuery(e,t,n,i,s){if(this.options.addComments!==!0)return e;try{let r=A.parse(e);return this.generateComments(t,n,i,s).forEach(u=>{Hn.addComment(r,u)}),new Be({...this.options,exportComment:!0}).format(r).formattedSql}catch(r){return console.warn(`${a.ERROR_MESSAGES.PARSING_FAILED}: ${r}`),this.addTextCommentsToQuery(e,t,n,i,s)}}generateComments(e,t,n,i){let{AUTO_GENERATED:s,ORIGINAL_CTE:r,DEPENDENCIES:o,DEPENDENTS:l,RECURSIVE_TYPE:u,NONE:c}=a.COMMENT_TEXTS,p=[];p.push(s),p.push(`${r} ${e}`),i&&p.push(u);let d=t.length>0?t.join(", "):c;p.push(`${o} ${d}`);let h=n.filter(f=>f!=="MAIN_QUERY"),C=h.length>0?h.join(", "):c;return p.push(`${l} ${C}`),p}addTextCommentsToQuery(e,t,n,i,s){return`${this.generateComments(t,n,i,s).map(l=>`-- ${l}`).join(`
15
+ ${context}`;return new _ParseError(message,index,context)}};var FunctionExpressionParser=class{static{this.AGGREGATE_FUNCTIONS_WITH_ORDER_BY=new Set(["string_agg","array_agg","json_agg","jsonb_agg","json_object_agg","jsonb_object_agg","xmlagg"])}static parseArrayExpression(lexemes,index){let idx=index;if(idx+1<lexemes.length&&lexemes[idx+1].type&512){idx++;let arg=ValueParser.parseArgument(512,1024,lexemes,idx);return idx=arg.newIndex,{value:new ArrayExpression(arg.value),newIndex:idx}}else if(idx+1<lexemes.length&&lexemes[idx+1].type&4){idx++,idx++;let arg=SelectQueryParser.parseFromLexeme(lexemes,idx);return idx=arg.newIndex,idx++,{value:new ArrayQueryExpression(arg.value),newIndex:idx}}throw new Error(`Invalid ARRAY syntax at index ${idx}, expected ARRAY[... or ARRAY(...)`)}static parseFromLexeme(lexemes,index){let idx=index,current=lexemes[idx];return current.value==="array"?this.parseArrayExpression(lexemes,idx):current.value==="substring"||current.value==="overlay"?this.parseKeywordFunction(lexemes,idx,[{key:"from",required:!1},{key:"for",required:!1}]):current.value==="cast"?this.parseKeywordFunction(lexemes,idx,[{key:"as",required:!0}]):current.value==="trim"?this.parseKeywordFunction(lexemes,idx,[{key:"from",required:!1}]):this.parseFunctionCall(lexemes,idx)}static tryParseBinaryExpression(lexemes,index,left,allowAndOperator=!0,allowOrOperator=!0){let idx=index;if(idx<lexemes.length&&lexemes[idx].type&2){let operator=lexemes[idx].value.toLowerCase();if(!allowAndOperator&&operator==="and"||!allowOrOperator&&operator==="or")return null;if(idx++,operator==="between")return this.parseBetweenExpression(lexemes,idx,left,!1);if(operator==="not between")return this.parseBetweenExpression(lexemes,idx,left,!0);if(operator==="::"){let typeValue=this.parseTypeValue(lexemes,idx);return idx=typeValue.newIndex,{value:new CastExpression(left,typeValue.value),newIndex:idx}}let rightResult=ValueParser.parseFromLexeme(lexemes,idx);return idx=rightResult.newIndex,{value:new BinaryExpression(left,operator,rightResult.value),newIndex:idx}}return null}static parseBetweenExpression(lexemes,index,value,negated){let idx=index,lower=ValueParser.parseFromLexeme(lexemes,idx,!1);if(idx=lower.newIndex,idx<lexemes.length&&lexemes[idx].type&2&&lexemes[idx].value!=="and")throw new Error(`Expected 'and' after 'between' at index ${idx}`);idx++;let upper=this.parseBetweenUpperBound(lexemes,idx);return idx=upper.newIndex,{value:new BetweenExpression(value,lower.value,upper.value,negated),newIndex:idx}}static parseBetweenUpperBound(lexemes,index){return ValueParser.parseFromLexeme(lexemes,index,!1,!1)}static parseFunctionCall(lexemes,index){let idx=index,fullNameResult=FullNameParser.parseFromLexeme(lexemes,idx),namespaces=fullNameResult.namespaces,name=fullNameResult.name;if(idx=fullNameResult.newIndex,idx<lexemes.length&&lexemes[idx].type&4){let functionName=name.name.toLowerCase(),arg,closingComments=null,internalOrderBy=null;if(this.AGGREGATE_FUNCTIONS_WITH_ORDER_BY.has(functionName)){let result=this.parseAggregateArguments(lexemes,idx);arg={value:result.arguments,newIndex:result.newIndex},internalOrderBy=result.orderByClause,closingComments=result.closingComments}else{let argWithComments=this.parseArgumentWithComments(lexemes,idx);arg={value:argWithComments.value,newIndex:argWithComments.newIndex},closingComments=argWithComments.closingComments}idx=arg.newIndex;let withinGroup=null;if(idx<lexemes.length&&lexemes[idx].value==="within group"){let withinGroupResult=this.parseWithinGroupClause(lexemes,idx);withinGroup=withinGroupResult.value,idx=withinGroupResult.newIndex}let withOrdinality=!1;if(idx<lexemes.length&&lexemes[idx].value==="with ordinality"&&(withOrdinality=!0,idx++),idx<lexemes.length&&lexemes[idx].value==="over"){let over=OverExpressionParser.parseFromLexeme(lexemes,idx);idx=over.newIndex;let value=new FunctionCall(namespaces,name.name,arg.value,over.value,withinGroup,withOrdinality,internalOrderBy);return closingComments&&closingComments.length>0,{value,newIndex:idx}}else{let value=new FunctionCall(namespaces,name.name,arg.value,null,withinGroup,withOrdinality,internalOrderBy);return closingComments&&closingComments.length>0,{value,newIndex:idx}}}else throw ParseError.fromUnparsedLexemes(lexemes,idx,`Expected opening parenthesis after function name '${name.name}'.`)}static parseKeywordFunction(lexemes,index,keywords2){let idx=index,fullNameResult=FullNameParser.parseFromLexeme(lexemes,idx),namespaces=fullNameResult.namespaces,name=fullNameResult.name;if(idx=fullNameResult.newIndex,idx<lexemes.length&&lexemes[idx].type&4){idx++;let input=ValueParser.parseFromLexeme(lexemes,idx),arg=input.value;if(idx=input.newIndex,idx<lexemes.length&&lexemes[idx].type&16)return this.parseFunctionCall(lexemes,index);for(let{key,required}of keywords2)if(idx<lexemes.length&&lexemes[idx].type&128&&lexemes[idx].value===key)if(idx++,idx<lexemes.length&&lexemes[idx].type&8192){let typeValue=this.parseTypeValue(lexemes,idx);arg=new BinaryExpression(arg,key,typeValue.value),idx=typeValue.newIndex}else{let right=ValueParser.parseFromLexeme(lexemes,idx);arg=new BinaryExpression(arg,key,right.value),idx=right.newIndex}else if(required)throw ParseError.fromUnparsedLexemes(lexemes,idx,`Keyword '${key}' is required for ${name.name} function.`);if(idx<lexemes.length&&lexemes[idx].type&8){idx++;let withinGroup=null;if(idx<lexemes.length&&lexemes[idx].value==="within group"){let withinGroupResult=this.parseWithinGroupClause(lexemes,idx);withinGroup=withinGroupResult.value,idx=withinGroupResult.newIndex}let withOrdinality=!1;if(idx<lexemes.length&&lexemes[idx].value==="with ordinality"&&(withOrdinality=!0,idx++),idx<lexemes.length&&lexemes[idx].value==="over"){idx++;let over=OverExpressionParser.parseFromLexeme(lexemes,idx);return idx=over.newIndex,{value:new FunctionCall(namespaces,name.name,arg,over.value,withinGroup,withOrdinality,null),newIndex:idx}}else return{value:new FunctionCall(namespaces,name.name,arg,null,withinGroup,withOrdinality,null),newIndex:idx}}else throw ParseError.fromUnparsedLexemes(lexemes,idx,`Missing closing parenthesis for function '${name.name}'.`)}else throw ParseError.fromUnparsedLexemes(lexemes,idx,`Missing opening parenthesis for function '${name.name}'.`)}static parseTypeValue(lexemes,index){let idx=index,{namespaces,name,newIndex}=FullNameParser.parseFromLexeme(lexemes,idx);if(idx=newIndex,idx<lexemes.length&&lexemes[idx].type&4){let arg=ValueParser.parseArgument(4,8,lexemes,idx);idx=arg.newIndex;let value=new TypeValue(namespaces,new RawString(name.name),arg.value);return arg.value.positionedComments&&(value.positionedComments=arg.value.positionedComments),arg.value.comments,{value,newIndex:idx}}else return{value:new TypeValue(namespaces,new RawString(name.name)),newIndex:idx}}static parseWithinGroupClause(lexemes,index){let idx=index;if(idx>=lexemes.length||lexemes[idx].value!=="within group")throw new Error(`Expected 'WITHIN GROUP' at index ${idx}`);if(idx++,idx>=lexemes.length||!(lexemes[idx].type&4))throw new Error(`Expected '(' after 'WITHIN GROUP' at index ${idx}`);idx++;let orderByResult=OrderByClauseParser.parseFromLexeme(lexemes,idx);if(idx=orderByResult.newIndex,idx>=lexemes.length||!(lexemes[idx].type&8))throw new Error(`Expected ')' after WITHIN GROUP ORDER BY clause at index ${idx}`);return idx++,{value:orderByResult.value,newIndex:idx}}static parseAggregateArguments(lexemes,index){let idx=index,args=[],orderByClause=null;if(idx>=lexemes.length||!(lexemes[idx].type&4))throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected opening parenthesis.");if(idx++,idx<lexemes.length&&lexemes[idx].type&8){let closingComments2=lexemes[idx].comments;return idx++,{arguments:new ValueList([]),orderByClause:null,closingComments:closingComments2,newIndex:idx}}if(idx<lexemes.length&&lexemes[idx].value==="*"){let wildcard=new ColumnReference(null,"*");if(idx++,idx<lexemes.length&&lexemes[idx].type&8){let closingComments2=lexemes[idx].comments;return idx++,{arguments:wildcard,orderByClause:null,closingComments:closingComments2,newIndex:idx}}else throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected closing parenthesis after wildcard '*'.")}let firstArg=ValueParser.parseFromLexeme(lexemes,idx);for(idx=firstArg.newIndex,args.push(firstArg.value);idx<lexemes.length&&(lexemes[idx].type&16||lexemes[idx].value==="order by");){if(lexemes[idx].value==="order by"){let orderByResult=OrderByClauseParser.parseFromLexeme(lexemes,idx);idx=orderByResult.newIndex,orderByClause=orderByResult.value;break}if(lexemes[idx].type&16){if(idx++,idx<lexemes.length&&lexemes[idx].value==="order by"){let orderByResult=OrderByClauseParser.parseFromLexeme(lexemes,idx);idx=orderByResult.newIndex,orderByClause=orderByResult.value;break}let argResult=ValueParser.parseFromLexeme(lexemes,idx);idx=argResult.newIndex,args.push(argResult.value)}}if(idx>=lexemes.length||!(lexemes[idx].type&8))throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected closing parenthesis.");let closingComments=lexemes[idx].comments;return idx++,{arguments:args.length===1?args[0]:new ValueList(args),orderByClause,closingComments,newIndex:idx}}static parseArgumentWithComments(lexemes,index){let idx=index;if(idx>=lexemes.length||!(lexemes[idx].type&4))throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected opening parenthesis.");let openParenToken=lexemes[idx];idx++;let args=[];if(idx<lexemes.length&&lexemes[idx].type&8){let closingComments2=lexemes[idx].comments;return idx++,{value:new ValueList([]),closingComments:closingComments2,newIndex:idx}}if(idx<lexemes.length&&lexemes[idx].value==="*"){let wildcard=new ColumnReference(null,"*");if(idx++,idx>=lexemes.length||!(lexemes[idx].type&8))throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected closing parenthesis after wildcard '*'.");let closingComments2=lexemes[idx].comments;return idx++,{value:wildcard,closingComments:closingComments2,newIndex:idx}}let result=ValueParser.parseFromLexeme(lexemes,idx);if(idx=result.newIndex,openParenToken.positionedComments&&openParenToken.positionedComments.length>0){let afterComments=openParenToken.positionedComments.filter(pc=>pc.position==="after");if(afterComments.length>0){let beforeComments=afterComments.map(pc=>({position:"before",comments:pc.comments}));result.value.positionedComments=[...beforeComments,...result.value.positionedComments||[]],result.value,"qualifiedName"in result.value&&result.value.qualifiedName&&"name"in result.value.qualifiedName&&result.value.qualifiedName.name&&(result.value.qualifiedName.name.positionedComments=null,result.value.qualifiedName.name)}}for(args.push(result.value);idx<lexemes.length&&lexemes[idx].type&16;){idx++;let argResult=ValueParser.parseFromLexeme(lexemes,idx);idx=argResult.newIndex,args.push(argResult.value)}if(idx>=lexemes.length||!(lexemes[idx].type&8))throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected closing parenthesis.");let closingComments=lexemes[idx].comments;return idx++,{value:args.length===1?args[0]:new ValueList(args),closingComments,newIndex:idx}}};var OperatorPrecedence=class{static{this.precedenceMap={or:1,and:2,"=":10,"!=":10,"<>":10,"<":10,"<=":10,">":10,">=":10,like:10,ilike:10,"not like":10,"not ilike":10,"similar to":10,"not similar to":10,in:10,"not in":10,is:10,"is not":10,"->":10,"->>":10,"#>":10,"#>>":10,"@>":10,"<@":10,"?":10,"?|":10,"?&":10,"~":10,"~*":10,"!~":10,"!~*":10,rlike:10,regexp:10,mod:30,xor:2,between:15,"not between":15,"+":20,"-":20,"*":30,"/":30,"%":30,"^":40,"::":50,"unary+":100,"unary-":100,not:100}}static getPrecedence(operator){let precedence=this.precedenceMap[operator.toLowerCase()];return precedence!==void 0?precedence:0}static hasHigherOrEqualPrecedence(operator1,operator2){return this.getPrecedence(operator1)>=this.getPrecedence(operator2)}static isLogicalOperator(operator){let op=operator.toLowerCase();return op==="and"||op==="or"}static isBetweenOperator(operator){let op=operator.toLowerCase();return op==="between"||op==="not between"}static isComparisonOperator(operator){let lowerOp=operator.toLowerCase();return["=","!=","<>","<",">","<=",">=","like","ilike","similar to","in","not in","->","->>","#>","#>>","@>","<@","?","?|","?&","~","~*","!~","!~*","rlike","regexp"].includes(lowerOp)}};var ValueParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw ParseError.fromUnparsedLexemes(lexemes,result.newIndex,"[ValueParser]");return result.value}static parseFromLexeme(lexemes,index,allowAndOperator=!0,allowOrOperator=!0){return this.parseExpressionWithPrecedence(lexemes,index,0,allowAndOperator,allowOrOperator)}static parseExpressionWithPrecedence(lexemes,index,minPrecedence,allowAndOperator=!0,allowOrOperator=!0){let idx=index,comment=lexemes[idx].comments,positionedComments=lexemes[idx].positionedComments,left=this.parseItem(lexemes,idx);positionedComments&&positionedComments.length>0&&!left.value.positionedComments?left.value.positionedComments=positionedComments:left.value.comments===null&&comment&&comment.length>0&&(left.value.comments=comment),idx=left.newIndex;let result=left.value,arrayAccessResult=this.parseArrayAccess(lexemes,idx,result);for(result=arrayAccessResult.value,idx=arrayAccessResult.newIndex;idx<lexemes.length&&lexemes[idx].type&2;){let operatorToken=lexemes[idx],operator=operatorToken.value;if(!allowAndOperator&&operator.toLowerCase()==="and"||!allowOrOperator&&operator.toLowerCase()==="or")break;let precedence=OperatorPrecedence.getPrecedence(operator);if(precedence<minPrecedence)break;if(idx++,OperatorPrecedence.isBetweenOperator(operator)){let betweenResult=FunctionExpressionParser.parseBetweenExpression(lexemes,idx,result,operator.toLowerCase().includes("not"));result=betweenResult.value,idx=betweenResult.newIndex;continue}if(operator==="::"){let typeValue=FunctionExpressionParser.parseTypeValue(lexemes,idx);result=new CastExpression(result,typeValue.value),idx=typeValue.newIndex;continue}let nextMinPrecedence=precedence+1,rightResult=this.parseExpressionWithPrecedence(lexemes,idx,nextMinPrecedence,allowAndOperator,allowOrOperator);idx=rightResult.newIndex;let binaryExpr=new BinaryExpression(result,operator,rightResult.value);operatorToken.comments&&operatorToken.comments.length>0&&(binaryExpr.operator.comments=operatorToken.comments),operatorToken.positionedComments&&operatorToken.positionedComments.length>0&&(binaryExpr.operator.positionedComments=operatorToken.positionedComments),result=binaryExpr}return{value:result,newIndex:idx}}static transferPositionedComments(lexeme,value){lexeme.positionedComments&&lexeme.positionedComments.length>0&&!value.positionedComments?value.positionedComments=lexeme.positionedComments:value.comments===null&&lexeme.comments&&lexeme.comments.length>0&&(value.comments=lexeme.comments)}static parseItem(lexemes,index){let idx=index;if(idx>=lexemes.length)throw new Error(`Unexpected end of lexemes at index ${index}`);let current=lexemes[idx];if(current.type&64&&current.type&2&&current.type&8192){if(idx+1<lexemes.length&&lexemes[idx+1].type&4)if(this.isTypeConstructor(lexemes,idx+1,current.value)){let result=FunctionExpressionParser.parseTypeValue(lexemes,idx);return this.transferPositionedComments(current,result.value),{value:result.value,newIndex:result.newIndex}}else{let result=FunctionExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}let first=IdentifierParser.parseFromLexeme(lexemes,idx);if(first.newIndex>=lexemes.length)return this.transferPositionedComments(current,first.value),first;if(lexemes[first.newIndex].type&1){let second=LiteralParser.parseFromLexeme(lexemes,first.newIndex),result=new UnaryExpression(lexemes[idx].value,second.value);return this.transferPositionedComments(current,result),{value:result,newIndex:second.newIndex}}return this.transferPositionedComments(current,first.value),first}else if(current.type&64){let{namespaces,name,newIndex}=FullNameParser.parseFromLexeme(lexemes,idx);if(lexemes[newIndex-1].type&2048){let result=FunctionExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(lexemes[newIndex-1].type&8192)if(newIndex<lexemes.length&&lexemes[newIndex].type&4)if(this.isTypeConstructor(lexemes,newIndex,name.name)){let result=FunctionExpressionParser.parseTypeValue(lexemes,idx);return this.transferPositionedComments(current,result.value),{value:result.value,newIndex:result.newIndex}}else{let result=FunctionExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else{let value2=new TypeValue(namespaces,name);return this.transferPositionedComments(current,value2),{value:value2,newIndex}}let value=new ColumnReference(namespaces,name);return this.transferPositionedComments(current,value),{value,newIndex}}else if(current.type&1){let result=LiteralParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&4){let result=ParenExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&2048){let result=FunctionExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&2){let result=UnaryExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&256){let result=ParameterExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&4096){let result=StringSpecifierExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&128){let result=CommandExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else if(current.type&512){let{namespaces,name,newIndex}=FullNameParser.parseFromLexeme(lexemes,idx),value=new ColumnReference(namespaces,name);return this.transferPositionedComments(current,value),{value,newIndex}}else if(current.type&8192){let{namespaces,name,newIndex}=FullNameParser.parseFromLexeme(lexemes,idx);if(newIndex<lexemes.length&&lexemes[newIndex].type&4)if(this.isTypeConstructor(lexemes,newIndex,name.name)){let result=FunctionExpressionParser.parseTypeValue(lexemes,idx);return this.transferPositionedComments(current,result.value),{value:result.value,newIndex:result.newIndex}}else{let result=FunctionExpressionParser.parseFromLexeme(lexemes,idx);return this.transferPositionedComments(current,result.value),result}else{let value=new TypeValue(namespaces,name);return this.transferPositionedComments(current,value),{value,newIndex}}}throw ParseError.fromUnparsedLexemes(lexemes,idx,"[ValueParser] Invalid lexeme.")}static parseArgument(openToken,closeToken,lexemes,index){let idx=index,args=[];if(idx<lexemes.length&&lexemes[idx].type===openToken){let openParenToken=lexemes[idx];if(idx++,idx<lexemes.length&&lexemes[idx].type===closeToken)return idx++,{value:new ValueList([]),newIndex:idx};if(idx<lexemes.length&&lexemes[idx].value==="*"){let wildcard=new ColumnReference(null,"*");if(openParenToken.positionedComments&&openParenToken.positionedComments.length>0){let beforeComments=openParenToken.positionedComments.filter(pc=>pc.position==="after");beforeComments.length>0&&(wildcard.positionedComments=beforeComments.map(pc=>({position:"before",comments:pc.comments})))}else openParenToken.comments&&openParenToken.comments.length>0&&(wildcard.comments=openParenToken.comments);if(idx++,idx<lexemes.length&&lexemes[idx].type===closeToken)return idx++,{value:wildcard,newIndex:idx};throw ParseError.fromUnparsedLexemes(lexemes,idx,"Expected closing parenthesis after wildcard '*'.")}let result=this.parseFromLexeme(lexemes,idx);if(idx=result.newIndex,openParenToken.positionedComments&&openParenToken.positionedComments.length>0){let afterComments=openParenToken.positionedComments.filter(pc=>pc.position==="after");if(afterComments.length>0){let beforeComments=afterComments.map(pc=>({position:"before",comments:pc.comments}));result.value.positionedComments?result.value.positionedComments=[...beforeComments,...result.value.positionedComments]:result.value.positionedComments=beforeComments}}else openParenToken.comments&&openParenToken.comments.length>0&&(result.value.comments?result.value.comments=openParenToken.comments.concat(result.value.comments):result.value.comments=openParenToken.comments);for(args.push(result.value);idx<lexemes.length&&lexemes[idx].type&16;){idx++;let argResult=this.parseFromLexeme(lexemes,idx);idx=argResult.newIndex,args.push(argResult.value)}if(idx<lexemes.length&&lexemes[idx].type===closeToken)return idx++,args.length===1?{value:args[0],newIndex:idx}:{value:new ValueList(args),newIndex:idx};throw ParseError.fromUnparsedLexemes(lexemes,idx,"Missing closing parenthesis.")}throw ParseError.fromUnparsedLexemes(lexemes,index,"Expected opening parenthesis.")}static parseArrayAccess(lexemes,index,baseExpression){let idx=index,result=baseExpression;for(;idx<lexemes.length&&lexemes[idx].type&512&&!this.isSqlServerBracketIdentifier(lexemes,idx);){if(idx++,idx>=lexemes.length)throw new Error(`Expected array index or slice after '[' at index ${idx-1}`);if(lexemes[idx].type&1024)throw new Error(`Empty array access brackets not supported at index ${idx}`);let startExpr=null,isSlice=!1;if(lexemes[idx].type&2&&lexemes[idx].value===":")isSlice=!0,idx++;else{let colonPrecedence=OperatorPrecedence.getPrecedence(":"),firstResult=this.parseExpressionWithPrecedence(lexemes,idx,colonPrecedence+1);startExpr=firstResult.value,idx=firstResult.newIndex,idx<lexemes.length&&lexemes[idx].type&2&&lexemes[idx].value===":"&&(isSlice=!0,idx++)}if(isSlice){let endExpr=null;if(idx<lexemes.length&&!(lexemes[idx].type&1024)){let colonPrecedence=OperatorPrecedence.getPrecedence(":"),endResult=this.parseExpressionWithPrecedence(lexemes,idx,colonPrecedence+1);endExpr=endResult.value,idx=endResult.newIndex}if(idx>=lexemes.length||!(lexemes[idx].type&1024))throw new Error(`Expected ']' after array slice at index ${idx}`);idx++,result=new ArraySliceExpression(result,startExpr,endExpr)}else{if(!startExpr){let indexResult=this.parseFromLexeme(lexemes,idx);startExpr=indexResult.value,idx=indexResult.newIndex}if(idx>=lexemes.length||!(lexemes[idx].type&1024))throw new Error(`Expected ']' after array index at index ${idx}`);idx++,result=new ArrayIndexExpression(result,startExpr)}}return{value:result,newIndex:idx}}static isSqlServerBracketIdentifier(lexemes,bracketIndex){let idx=bracketIndex+1;if(idx>=lexemes.length)return!1;for(;idx<lexemes.length&&!(lexemes[idx].type&1024);){let token=lexemes[idx];if(token.type&64||token.type&2&&token.value==="."){idx++;continue}return!1}if(idx>=lexemes.length)return!1;let closingBracketIndex=idx;if(closingBracketIndex+1<lexemes.length){let nextToken=lexemes[closingBracketIndex+1];if(nextToken.type&2&&nextToken.value===".")return!0}idx=bracketIndex+1;let hasOnlyIdentifiersAndDots=!0;for(;idx<closingBracketIndex;){let token=lexemes[idx];if(!(token.type&64||token.type&2&&token.value===".")){hasOnlyIdentifiersAndDots=!1;break}idx++}return hasOnlyIdentifiersAndDots}static isTypeConstructor(lexemes,openParenIndex,typeName){let alwaysTypeConstructors=["NUMERIC","DECIMAL","VARCHAR","CHAR","CHARACTER","TIMESTAMP","TIME","INTERVAL"],upperTypeName=typeName.toUpperCase();if(alwaysTypeConstructors.includes(upperTypeName))return!0;if(upperTypeName==="DATE"){let firstArgIndex=openParenIndex+1;if(firstArgIndex<lexemes.length){let firstArg=lexemes[firstArgIndex];return!(firstArg.type&1&&typeof firstArg.value=="string"&&isNaN(Number(firstArg.value)))}}return!1}};var CTECollector=class{constructor(){this.commonTables=[];this.visitedNodes=new Set;this.isRootVisit=!0;this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr)),this.handlers.set(ValuesQuery.kind,expr=>this.visitValuesQuery(expr)),this.handlers.set(WithClause.kind,expr=>this.visitWithClause(expr)),this.handlers.set(CommonTable.kind,expr=>this.visitCommonTable(expr)),this.handlers.set(SelectItem.kind,expr=>this.visitSelectItem(expr)),this.handlers.set(IdentifierString.kind,expr=>this.visitIdentifierString(expr)),this.handlers.set(RawString.kind,expr=>this.visitRawString(expr)),this.handlers.set(ColumnReference.kind,expr=>this.visitColumnReference(expr)),this.handlers.set(ParameterExpression.kind,expr=>this.visitParameterExpression(expr)),this.handlers.set(LiteralValue.kind,expr=>this.visitLiteralValue(expr)),this.handlers.set(SourceExpression.kind,expr=>this.visitSourceExpression(expr)),this.handlers.set(TableSource.kind,expr=>this.visitTableSource(expr)),this.handlers.set(FunctionSource.kind,expr=>this.visitFunctionSource(expr)),this.handlers.set(ParenSource.kind,expr=>this.visitParenSource(expr)),this.handlers.set(SubQuerySource.kind,expr=>this.visitSubQuerySource(expr)),this.handlers.set(InlineQuery.kind,expr=>this.visitInlineQuery(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr)),this.handlers.set(JoinClause.kind,expr=>this.visitJoinClause(expr)),this.handlers.set(JoinOnClause.kind,expr=>this.visitJoinOnClause(expr)),this.handlers.set(JoinUsingClause.kind,expr=>this.visitJoinUsingClause(expr)),this.handlers.set(WhereClause.kind,expr=>this.visitWhereClause(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(CaseKeyValuePair.kind,expr=>this.visitCaseKeyValuePair(expr)),this.handlers.set(SwitchCaseArgument.kind,expr=>this.visitSwitchCaseArgument(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(FunctionCall.kind,expr=>this.visitFunctionCall(expr)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(TupleExpression.kind,expr=>this.visitTupleExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(WindowFrameExpression.kind,expr=>this.visitWindowFrameExpression(expr)),this.handlers.set(WindowFrameSpec.kind,expr=>this.visitWindowFrameSpec(expr)),this.handlers.set(TypeValue.kind,expr=>this.visitTypeValue(expr)),this.handlers.set(ValueList.kind,expr=>this.visitValueList(expr)),this.handlers.set(StringSpecifierExpression.kind,expr=>this.visitStringSpecifierExpression(expr)),this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(GroupByClause.kind,expr=>this.visitGroupByClause(expr)),this.handlers.set(HavingClause.kind,expr=>this.visitHavingClause(expr)),this.handlers.set(OrderByClause.kind,expr=>this.visitOrderByClause(expr)),this.handlers.set(WindowFrameClause.kind,expr=>this.visitWindowFrameClause(expr)),this.handlers.set(LimitClause.kind,expr=>this.visitLimitClause(expr)),this.handlers.set(ForClause.kind,expr=>this.visitForClause(expr)),this.handlers.set(OrderByItem.kind,expr=>this.visitOrderByItem(expr)),this.handlers.set(PartitionByClause.kind,expr=>this.visitPartitionByClause(expr))}getCommonTables(){return this.commonTables}reset(){this.commonTables=[],this.visitedNodes.clear()}collect(query){return this.visit(query),this.getCommonTables()}visit(arg){if(!this.isRootVisit){this.visitNode(arg);return}this.reset(),this.isRootVisit=!1;try{this.visitNode(arg)}finally{this.isRootVisit=!0}}visitNode(arg){if(this.visitedNodes.has(arg))return;this.visitedNodes.add(arg);let handler=this.handlers.get(arg.getKind());if(handler){handler(arg);return}let kindSymbol=arg.getKind()?.toString()||"unknown",constructor=arg.constructor?.name||"unknown";throw new Error(`[CTECollector] No handler for ${constructor} with kind ${kindSymbol}.`)}visitSimpleSelectQuery(query){if(query.fromClause&&query.fromClause.accept(this),query.whereClause&&query.whereClause.accept(this),query.groupByClause&&query.groupByClause.accept(this),query.havingClause&&query.havingClause.accept(this),query.orderByClause&&query.orderByClause.accept(this),query.windowClause)for(let win of query.windowClause.windows)win.accept(this);query.limitClause&&query.limitClause.accept(this),query.forClause&&query.forClause.accept(this),query.selectClause.accept(this),query.withClause&&query.withClause.accept(this)}visitBinarySelectQuery(query){query.left.accept(this),query.right.accept(this)}visitValuesQuery(query){for(let tuple of query.tuples)tuple.accept(this)}visitWithClause(withClause){for(let i=0;i<withClause.tables.length;i++)withClause.tables[i].accept(this)}visitCommonTable(commonTable){commonTable.query.accept(this),this.commonTables.push(commonTable)}visitSelectClause(clause){for(let item of clause.items)item.accept(this)}visitSelectItem(item){item.value.accept(this)}visitFromClause(fromClause){if(fromClause.source.accept(this),fromClause.joins)for(let join of fromClause.joins)join.accept(this)}visitSourceExpression(source){source.datasource.accept(this)}visitTableSource(source){}visitFunctionSource(source){source.argument&&source.argument.accept(this)}visitParenSource(source){source.source.accept(this)}visitSubQuerySource(subQuery){subQuery.query.accept(this)}visitInlineQuery(inlineQuery){inlineQuery.selectQuery.accept(this)}visitJoinClause(joinClause){joinClause.source.accept(this),joinClause.condition&&joinClause.condition.accept(this)}visitJoinOnClause(joinOn){joinOn.condition.accept(this)}visitJoinUsingClause(joinUsing){joinUsing.condition.accept(this)}visitWhereClause(whereClause){whereClause.condition.accept(this)}visitGroupByClause(clause){for(let item of clause.grouping)item.accept(this)}visitHavingClause(clause){clause.condition.accept(this)}visitOrderByClause(clause){for(let item of clause.order)item.accept(this)}visitWindowFrameClause(clause){clause.expression.accept(this)}visitLimitClause(clause){clause.value.accept(this)}visitForClause(clause){}visitOrderByItem(item){item.value.accept(this)}visitParenExpression(expr){expr.expression.accept(this)}visitBinaryExpression(expr){expr.left.accept(this),expr.right.accept(this)}visitUnaryExpression(expr){expr.expression.accept(this)}visitCaseExpression(expr){expr.condition&&expr.condition.accept(this),expr.switchCase.accept(this)}visitSwitchCaseArgument(switchCase){for(let caseItem of switchCase.cases)caseItem.accept(this);switchCase.elseValue&&switchCase.elseValue.accept(this)}visitCaseKeyValuePair(pair){pair.key.accept(this),pair.value.accept(this)}visitBetweenExpression(expr){expr.expression.accept(this),expr.lower.accept(this),expr.upper.accept(this)}visitFunctionCall(func){func.argument&&func.argument.accept(this),func.over&&func.over.accept(this)}visitArrayExpression(expr){expr.expression.accept(this)}visitArrayQueryExpression(expr){expr.query.accept(this)}visitTupleExpression(expr){for(let value of expr.values)value.accept(this)}visitCastExpression(expr){expr.input.accept(this),expr.castType.accept(this)}visitTypeValue(expr){expr.argument&&expr.argument.accept(this)}visitWindowFrameExpression(expr){expr.partition&&expr.partition.accept(this),expr.order&&expr.order.accept(this),expr.frameSpec&&expr.frameSpec.accept(this)}visitWindowFrameSpec(spec){}visitIdentifierString(ident){}visitRawString(raw){}visitColumnReference(column){}visitParameterExpression(param){}visitLiteralValue(value){}visitPartitionByClause(partitionBy){}visitValueList(valueList){for(let value of valueList.values)value.accept(this)}visitStringSpecifierExpression(expr){}};var CTEDisabler=class{constructor(){this.visitedNodes=new Set;this.isRootVisit=!0;this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr)),this.handlers.set(ValuesQuery.kind,expr=>this.visitValuesQuery(expr)),this.handlers.set(SelectItem.kind,expr=>this.visitSelectItem(expr)),this.handlers.set(IdentifierString.kind,expr=>this.visitIdentifierString(expr)),this.handlers.set(RawString.kind,expr=>this.visitRawString(expr)),this.handlers.set(ColumnReference.kind,expr=>this.visitColumnReference(expr)),this.handlers.set(ParameterExpression.kind,expr=>this.visitParameterExpression(expr)),this.handlers.set(LiteralValue.kind,expr=>this.visitLiteralValue(expr)),this.handlers.set(SourceExpression.kind,expr=>this.visitSourceExpression(expr)),this.handlers.set(TableSource.kind,expr=>this.visitTableSource(expr)),this.handlers.set(ParenSource.kind,expr=>this.visitParenSource(expr)),this.handlers.set(SubQuerySource.kind,expr=>this.visitSubQuerySource(expr)),this.handlers.set(InlineQuery.kind,expr=>this.visitInlineQuery(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr)),this.handlers.set(JoinClause.kind,expr=>this.visitJoinClause(expr)),this.handlers.set(JoinOnClause.kind,expr=>this.visitJoinOnClause(expr)),this.handlers.set(JoinUsingClause.kind,expr=>this.visitJoinUsingClause(expr)),this.handlers.set(WhereClause.kind,expr=>this.visitWhereClause(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(CaseKeyValuePair.kind,expr=>this.visitCaseKeyValuePair(expr)),this.handlers.set(SwitchCaseArgument.kind,expr=>this.visitSwitchCaseArgument(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(FunctionCall.kind,expr=>this.visitFunctionCall(expr)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(TupleExpression.kind,expr=>this.visitTupleExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(WindowFrameExpression.kind,expr=>this.visitWindowFrameExpression(expr)),this.handlers.set(WindowFrameSpec.kind,expr=>this.visitWindowFrameSpec(expr)),this.handlers.set(TypeValue.kind,expr=>this.visitTypeValue(expr)),this.handlers.set(ValueList.kind,expr=>this.visitValueList(expr)),this.handlers.set(ArraySliceExpression.kind,expr=>this.visitArraySliceExpression(expr)),this.handlers.set(ArrayIndexExpression.kind,expr=>this.visitArrayIndexExpression(expr)),this.handlers.set(StringSpecifierExpression.kind,expr=>this.visitStringSpecifierExpression(expr)),this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(GroupByClause.kind,expr=>this.visitGroupByClause(expr)),this.handlers.set(HavingClause.kind,expr=>this.visitHavingClause(expr)),this.handlers.set(OrderByClause.kind,expr=>this.visitOrderByClause(expr)),this.handlers.set(WindowFrameClause.kind,expr=>this.visitWindowFrameClause(expr)),this.handlers.set(LimitClause.kind,expr=>this.visitLimitClause(expr)),this.handlers.set(ForClause.kind,expr=>this.visitForClause(expr)),this.handlers.set(OrderByItem.kind,expr=>this.visitOrderByItem(expr)),this.handlers.set(PartitionByClause.kind,expr=>this.visitPartitionByClause(expr))}reset(){this.visitedNodes.clear()}execute(arg){return this.reset(),this.visit(arg)}visit(arg){if(!this.isRootVisit)return this.visitNode(arg);this.reset(),this.isRootVisit=!1;try{return this.visitNode(arg)}finally{this.isRootVisit=!0}}visitNode(arg){if(this.visitedNodes.has(arg))return arg;this.visitedNodes.add(arg);let handler=this.handlers.get(arg.getKind());if(handler)return handler(arg);let kindSymbol=arg.getKind()?.toString()||"unknown",constructor=arg.constructor?.name||"unknown";throw new Error(`[CTEDisabler] No handler for ${constructor} with kind ${kindSymbol}.`)}visitSimpleSelectQuery(arg){return arg.withClause&&arg.withClause.tables.forEach(table=>{this.visit(table.query)}),arg.withClause=null,arg.selectClause=this.visit(arg.selectClause),arg.fromClause=arg.fromClause?this.visit(arg.fromClause):null,arg.whereClause=arg.whereClause?this.visit(arg.whereClause):null,arg.groupByClause=arg.groupByClause?this.visit(arg.groupByClause):null,arg.havingClause=arg.havingClause?this.visit(arg.havingClause):null,arg.orderByClause=arg.orderByClause?this.visit(arg.orderByClause):null,arg.windowClause&&(arg.windowClause=new WindowsClause(arg.windowClause.windows.map(w=>this.visit(w)))),arg.limitClause=arg.limitClause?this.visit(arg.limitClause):null,arg.forClause=arg.forClause?this.visit(arg.forClause):null,arg}visitBinarySelectQuery(query){return query.left=this.visit(query.left),query.right=this.visit(query.right),query}visitValuesQuery(query){let newTuples=query.tuples.map(tuple=>this.visit(tuple));return new ValuesQuery(newTuples)}visitSelectClause(clause){let newItems=clause.items.map(item=>this.visit(item));return new SelectClause(newItems,clause.distinct)}visitFromClause(clause){let newSource=this.visit(clause.source),newJoins=clause.joins?clause.joins.map(join=>this.visit(join)):null;return new FromClause(newSource,newJoins)}visitSubQuerySource(subQuery){let newQuery=this.visit(subQuery.query);return new SubQuerySource(newQuery)}visitInlineQuery(inlineQuery){let newQuery=this.visit(inlineQuery.selectQuery);return new InlineQuery(newQuery)}visitJoinClause(joinClause){let newSource=this.visit(joinClause.source),newCondition=joinClause.condition?this.visit(joinClause.condition):null;return new JoinClause(joinClause.joinType.value,newSource,newCondition,joinClause.lateral)}visitJoinOnClause(joinOn){let newCondition=this.visit(joinOn.condition);return new JoinOnClause(newCondition)}visitJoinUsingClause(joinUsing){let newCondition=this.visit(joinUsing.condition);return new JoinUsingClause(newCondition)}visitWhereClause(whereClause){let newCondition=this.visit(whereClause.condition);return new WhereClause(newCondition)}visitGroupByClause(clause){let newGrouping=clause.grouping.map(item=>this.visit(item));return new GroupByClause(newGrouping)}visitHavingClause(clause){let newCondition=this.visit(clause.condition);return new HavingClause(newCondition)}visitOrderByClause(clause){let newOrder=clause.order.map(item=>this.visit(item));return new OrderByClause(newOrder)}visitWindowFrameClause(clause){let newExpression=this.visit(clause.expression);return new WindowFrameClause(clause.name.name,newExpression)}visitLimitClause(clause){let newLimit=this.visit(clause.value);return new LimitClause(newLimit)}visitForClause(clause){return new ForClause(clause.lockMode)}visitParenExpression(expr){let newExpression=this.visit(expr.expression);return new ParenExpression(newExpression)}visitBinaryExpression(expr){let newLeft=this.visit(expr.left),newRight=this.visit(expr.right);return new BinaryExpression(newLeft,expr.operator.value,newRight)}visitUnaryExpression(expr){let newExpression=this.visit(expr.expression);return new UnaryExpression(expr.operator.value,newExpression)}visitCaseExpression(expr){let newCondition=expr.condition?this.visit(expr.condition):null,newSwitchCase=this.visit(expr.switchCase);return new CaseExpression(newCondition,newSwitchCase)}visitSwitchCaseArgument(switchCase){let newCases=switchCase.cases.map(caseItem=>this.visit(caseItem)),newElseValue=switchCase.elseValue?this.visit(switchCase.elseValue):null;return new SwitchCaseArgument(newCases,newElseValue)}visitCaseKeyValuePair(pair){let newKey=this.visit(pair.key),newValue=this.visit(pair.value);return new CaseKeyValuePair(newKey,newValue)}visitBetweenExpression(expr){let newExpression=this.visit(expr.expression),newLower=this.visit(expr.lower),newUpper=this.visit(expr.upper);return new BetweenExpression(newExpression,newLower,newUpper,expr.negated)}visitFunctionCall(func){let newArgument=func.argument?this.visit(func.argument):null,newOver=func.over?this.visit(func.over):null;return new FunctionCall(func.namespaces,func.name,newArgument,newOver)}visitArrayExpression(expr){let newExpression=this.visit(expr.expression);return new ArrayExpression(newExpression)}visitArrayQueryExpression(expr){let newQuery=this.visit(expr.query);return new ArrayQueryExpression(newQuery)}visitTupleExpression(expr){let newValues=expr.values.map(value=>this.visit(value));return new TupleExpression(newValues)}visitCastExpression(expr){let newInput=this.visit(expr.input),newCastType=this.visit(expr.castType);return new CastExpression(newInput,newCastType)}visitTypeValue(typeValue){let newArgument=typeValue.argument?this.visit(typeValue.argument):null;return new TypeValue(typeValue.namespaces,typeValue.name,newArgument)}visitSelectItem(item){let newValue=this.visit(item.value);return new SelectItem(newValue,item.identifier?.name)}visitIdentifierString(ident){return ident}visitRawString(raw){return raw}visitColumnReference(column){return column}visitSourceExpression(source){let newSource=this.visit(source.datasource),newAlias=source.aliasExpression;return new SourceExpression(newSource,newAlias)}visitTableSource(source){return source}visitParenSource(source){let newSource=this.visit(source.source);return new ParenSource(newSource)}visitParameterExpression(param){return param}visitWindowFrameExpression(expr){let newPartition=expr.partition?this.visit(expr.partition):null,newOrder=expr.order?this.visit(expr.order):null,newFrameSpec=expr.frameSpec?this.visit(expr.frameSpec):null;return new WindowFrameExpression(newPartition,newOrder,newFrameSpec)}visitWindowFrameSpec(spec){return spec}visitLiteralValue(value){return value}visitOrderByItem(item){let newValue=this.visit(item.value);return new OrderByItem(newValue,item.sortDirection,item.nullsPosition)}visitValueList(valueList){let newValues=valueList.values.map(value=>this.visit(value));return new ValueList(newValues)}visitArraySliceExpression(expr){return expr}visitArrayIndexExpression(expr){return expr}visitStringSpecifierExpression(expr){return expr}visitPartitionByClause(clause){let newValue=this.visit(clause.value);return new PartitionByClause(newValue)}};var TableSourceCollector=class{constructor(selectableOnly=!0){this.tableSources=[];this.visitedNodes=new Set;this.tableNameMap=new Map;this.cteNames=new Set;this.isRootVisit=!0;this.selectableOnly=selectableOnly,this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr)),this.handlers.set(ValuesQuery.kind,expr=>this.visitValuesQuery(expr)),this.handlers.set(WithClause.kind,expr=>this.visitWithClause(expr)),this.handlers.set(CommonTable.kind,expr=>this.visitCommonTable(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr)),this.handlers.set(JoinClause.kind,expr=>this.visitJoinClause(expr)),this.handlers.set(JoinOnClause.kind,expr=>this.visitJoinOnClause(expr)),this.handlers.set(JoinUsingClause.kind,expr=>this.visitJoinUsingClause(expr)),this.handlers.set(SourceExpression.kind,expr=>this.visitSourceExpression(expr)),this.handlers.set(TableSource.kind,expr=>this.visitTableSource(expr)),this.handlers.set(FunctionSource.kind,expr=>this.visitFunctionSource(expr)),this.handlers.set(ParenSource.kind,expr=>this.visitParenSource(expr)),this.handlers.set(SubQuerySource.kind,expr=>this.visitSubQuerySource(expr)),this.handlers.set(InlineQuery.kind,expr=>this.visitInlineQuery(expr)),selectableOnly||(this.handlers.set(WhereClause.kind,expr=>this.visitWhereClause(expr)),this.handlers.set(GroupByClause.kind,expr=>this.visitGroupByClause(expr)),this.handlers.set(HavingClause.kind,expr=>this.visitHavingClause(expr)),this.handlers.set(OrderByClause.kind,expr=>this.visitOrderByClause(expr)),this.handlers.set(WindowFrameClause.kind,expr=>this.visitWindowFrameClause(expr)),this.handlers.set(LimitClause.kind,expr=>this.visitLimitClause(expr)),this.handlers.set(OffsetClause.kind,expr=>this.visitOffsetClause(expr)),this.handlers.set(FetchClause.kind,expr=>this.visitFetchClause(expr)),this.handlers.set(ForClause.kind,expr=>this.visitForClause(expr)),this.handlers.set(OrderByItem.kind,expr=>this.visitOrderByItem(expr)),this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(SelectItem.kind,expr=>this.visitSelectItem(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(CaseKeyValuePair.kind,expr=>this.visitCaseKeyValuePair(expr)),this.handlers.set(SwitchCaseArgument.kind,expr=>this.visitSwitchCaseArgument(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(FunctionCall.kind,expr=>this.visitFunctionCall(expr)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(TupleExpression.kind,expr=>this.visitTupleExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(ValueList.kind,expr=>this.visitValueList(expr)),this.handlers.set(StringSpecifierExpression.kind,expr=>this.visitStringSpecifierExpression(expr)))}getTableSources(){return this.tableSources}reset(){this.tableSources=[],this.tableNameMap.clear(),this.visitedNodes.clear(),this.cteNames.clear()}getTableIdentifier(source){return source.qualifiedName.namespaces&&source.qualifiedName.namespaces.length>0?source.qualifiedName.namespaces.map(ns=>ns.name).join(".")+"."+(source.qualifiedName.name instanceof RawString?source.qualifiedName.name.value:source.qualifiedName.name.name):source.qualifiedName.name instanceof RawString?source.qualifiedName.name.value:source.qualifiedName.name.name}collect(query){return this.visit(query),this.getTableSources()}visit(arg){if(!this.isRootVisit){this.visitNode(arg);return}this.reset(),this.isRootVisit=!1;try{this.selectableOnly||this.collectCTEs(arg),this.visitNode(arg)}finally{this.isRootVisit=!0}}visitNode(arg){if(this.visitedNodes.has(arg))return;this.visitedNodes.add(arg);let handler=this.handlers.get(arg.getKind());if(handler){handler(arg);return}}collectCTEs(query){let cteCollector=new CTECollector;cteCollector.visit(query);let commonTables=cteCollector.getCommonTables();for(let cte of commonTables)this.cteNames.add(cte.aliasExpression.table.name)}visitSimpleSelectQuery(query){if(query.fromClause&&query.fromClause.accept(this),!this.selectableOnly){if(query.withClause&&query.withClause.accept(this),query.whereClause&&query.whereClause.accept(this),query.groupByClause&&query.groupByClause.accept(this),query.havingClause&&query.havingClause.accept(this),query.orderByClause&&query.orderByClause.accept(this),query.windowClause)for(let win of query.windowClause.windows)win.accept(this);query.limitClause&&query.limitClause.accept(this),query.offsetClause&&query.offsetClause.accept(this),query.fetchClause&&query.fetchClause.accept(this),query.forClause&&query.forClause.accept(this),query.selectClause.accept(this)}}visitBinarySelectQuery(query){query.left.accept(this),query.right.accept(this)}visitValuesQuery(query){if(!this.selectableOnly)for(let tuple of query.tuples)tuple.accept(this)}visitWithClause(withClause){if(!this.selectableOnly)for(let table of withClause.tables)table.accept(this)}visitCommonTable(commonTable){this.selectableOnly||commonTable.query.accept(this)}visitFromClause(fromClause){if(fromClause.source.accept(this),fromClause.joins)for(let join of fromClause.joins)join.accept(this)}visitSourceExpression(source){source.datasource.accept(this)}visitTableSource(source){let identifier=this.getTableIdentifier(source);!this.tableNameMap.has(identifier)&&!this.isCTETable(source.table.name)&&(this.tableNameMap.set(identifier,!0),this.tableSources.push(source))}visitFunctionSource(source){source.argument&&this.visitValueComponent(source.argument)}visitValueComponent(value){value.accept(this)}isCTETable(tableName){return this.cteNames.has(tableName)}visitParenSource(source){source.source.accept(this)}visitSubQuerySource(subQuery){this.selectableOnly||subQuery.query.accept(this)}visitInlineQuery(inlineQuery){this.selectableOnly||inlineQuery.selectQuery.accept(this)}visitJoinClause(joinClause){joinClause.source.accept(this),!this.selectableOnly&&joinClause.condition&&joinClause.condition.accept(this)}visitJoinOnClause(joinOn){this.selectableOnly||joinOn.condition.accept(this)}visitJoinUsingClause(joinUsing){this.selectableOnly||joinUsing.condition.accept(this)}visitWhereClause(whereClause){whereClause.condition.accept(this)}visitGroupByClause(clause){for(let item of clause.grouping)item.accept(this)}visitHavingClause(clause){clause.condition.accept(this)}visitOrderByClause(clause){for(let item of clause.order)item.accept(this)}visitWindowFrameClause(clause){clause.expression.accept(this)}visitLimitClause(clause){clause.value.accept(this)}visitOffsetClause(clause){clause.value.accept(this)}visitFetchClause(clause){clause.expression.accept(this)}visitForClause(_clause){}visitOrderByItem(item){item.value.accept(this)}visitSelectClause(clause){for(let item of clause.items)item.accept(this)}visitSelectItem(item){item.value.accept(this)}visitParenExpression(expr){expr.expression.accept(this)}visitBinaryExpression(expr){expr.left.accept(this),expr.right.accept(this)}visitUnaryExpression(expr){expr.expression.accept(this)}visitCaseExpression(expr){expr.condition&&expr.condition.accept(this),expr.switchCase.accept(this)}visitSwitchCaseArgument(switchCase){for(let caseItem of switchCase.cases)caseItem.accept(this);switchCase.elseValue&&switchCase.elseValue.accept(this)}visitCaseKeyValuePair(pair){pair.key.accept(this),pair.value.accept(this)}visitBetweenExpression(expr){expr.expression.accept(this),expr.lower.accept(this),expr.upper.accept(this)}visitFunctionCall(func){func.argument&&func.argument.accept(this),func.over&&func.over.accept(this)}visitArrayExpression(expr){expr.expression.accept(this)}visitArrayQueryExpression(expr){expr.query.accept(this)}visitTupleExpression(expr){for(let value of expr.values)value.accept(this)}visitCastExpression(expr){expr.input.accept(this),expr.castType.accept(this)}visitValueList(valueList){for(let value of valueList.values)value.accept(this)}visitStringSpecifierExpression(_expr){}};var HintClause=class extends SqlComponent{static{this.kind=Symbol("HintClause")}constructor(hintContent){super(),this.hintContent=hintContent}getFullHint(){return"/*+ "+this.hintContent+" */"}static isHintClause(value){let trimmed=value.trim();return trimmed.length>=5&&trimmed.substring(0,3)==="/*+"&&trimmed.substring(trimmed.length-2)==="*/"}static extractHintContent(hintClause){let trimmed=hintClause.trim();if(!this.isHintClause(trimmed))throw new Error("Not a valid hint clause: "+hintClause);return trimmed.slice(3,-2).trim()}};var SqlPrintToken=class{constructor(type,text="",containerType=""){this.innerTokens=[];this.type=type,this.text=text,this.containerType=containerType}};var ParameterCollector=class{static collect(node){let result=[];function walk(n){if(!(!n||typeof n!="object")){n.constructor&&n.constructor.kind===ParameterExpression.kind&&result.push(n);for(let key of Object.keys(n)){let v=n[key];Array.isArray(v)?v.forEach(walk):v&&typeof v=="object"&&v.constructor&&v.constructor.kind&&walk(v)}}}return walk(node),result}};var IdentifierDecorator=class{constructor(identifierEscape){this.start=identifierEscape?.start??'"',this.end=identifierEscape?.end??'"'}decorate(text){return text=this.start+text+this.end,text}};var ParameterDecorator=class{constructor(options){this.prefix=options?.prefix??":",this.suffix=options?.suffix??"",this.style=options?.style??"named"}decorate(text,index){let paramText="";return this.style==="anonymous"?paramText=this.prefix:this.style==="indexed"?paramText=this.prefix+index:this.style==="named"&&(paramText=this.prefix+text+this.suffix),text=paramText,text}};var UpdateQuery=class extends SqlComponent{static{this.kind=Symbol("UpdateQuery")}constructor(params){super(),this.withClause=params.withClause??null,this.updateClause=params.updateClause,this.setClause=params.setClause instanceof SetClause?params.setClause:new SetClause(params.setClause),this.whereClause=params.whereClause??null,this.fromClause=params.fromClause??null,this.returningClause=params.returning??null}};var SelectValueCollector=class _SelectValueCollector{constructor(tableColumnResolver=null,initialCommonTables=null){this.selectValues=[];this.visitedNodes=new Set;this.isRootVisit=!0;this.tableColumnResolver=tableColumnResolver??null,this.commonTableCollector=new CTECollector,this.commonTables=[],this.initialCommonTables=initialCommonTables,this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(SourceExpression.kind,expr=>this.visitSourceExpression(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr))}getValues(){return this.selectValues}reset(){this.selectValues=[],this.visitedNodes.clear(),this.initialCommonTables?this.commonTables=this.initialCommonTables:this.commonTables=[]}collect(arg){this.visit(arg);let items=this.getValues();return this.reset(),items}visit(arg){if(!this.isRootVisit){this.visitNode(arg);return}this.reset(),this.isRootVisit=!1;try{this.visitNode(arg)}finally{this.isRootVisit=!0}}visitNode(arg){if(this.visitedNodes.has(arg))return;this.visitedNodes.add(arg);let handler=this.handlers.get(arg.getKind());if(handler){handler(arg);return}}visitSimpleSelectQuery(query){this.commonTables.length===0&&this.initialCommonTables===null&&(this.commonTables=this.commonTableCollector.collect(query)),query.selectClause&&query.selectClause.accept(this);let wildcards=this.selectValues.filter(item=>item.name==="*");if(wildcards.length===0)return;if(this.selectValues.some(item=>item.value instanceof ColumnReference&&item.value.namespaces===null)){query.fromClause&&this.processFromClause(query.fromClause,!0),this.selectValues=this.selectValues.filter(item=>item.name!=="*");return}let wildSourceNames=wildcards.filter(item=>item.value instanceof ColumnReference&&item.value.namespaces).map(item=>item.value.getNamespace());if(query.fromClause){let fromSourceName=query.fromClause.getSourceAliasName();if(fromSourceName&&wildSourceNames.includes(fromSourceName)&&this.processFromClause(query.fromClause,!1),query.fromClause.joins)for(let join of query.fromClause.joins){let joinSourceName=join.getSourceAliasName();joinSourceName&&wildSourceNames.includes(joinSourceName)&&this.processJoinClause(join)}}this.selectValues=this.selectValues.filter(item=>item.name!=="*")}processFromClause(clause,joinCascade){if(clause){let fromSourceName=clause.getSourceAliasName();if(this.processSourceExpression(fromSourceName,clause.source),clause.joins&&joinCascade)for(let join of clause.joins)this.processJoinClause(join)}}processJoinClause(clause){let sourceName=clause.getSourceAliasName();this.processSourceExpression(sourceName,clause.source)}processSourceExpression(sourceName,source){let commonTable=this.commonTables.find(item=>item.aliasExpression.table.name===sourceName);if(commonTable){let innerCommonTables=this.commonTables.filter(item=>item.aliasExpression.table.name!==sourceName);new _SelectValueCollector(this.tableColumnResolver,innerCommonTables).collect(commonTable.query).forEach(item=>{this.addSelectValueAsUnique(item.name,new ColumnReference(sourceName?[sourceName]:null,item.name))})}else new _SelectValueCollector(this.tableColumnResolver,this.commonTables).collect(source).forEach(item=>{this.addSelectValueAsUnique(item.name,new ColumnReference(sourceName?[sourceName]:null,item.name))})}visitSelectClause(clause){for(let item of clause.items)this.processSelectItem(item)}processSelectItem(item){if(item.identifier)this.addSelectValueAsUnique(item.identifier.name,item.value);else if(item.value instanceof ColumnReference){let columnName=item.value.column.name;columnName==="*"?this.selectValues.push({name:columnName,value:item.value}):this.addSelectValueAsUnique(columnName,item.value)}}visitSourceExpression(source){if(source.aliasExpression&&source.aliasExpression.columns){let sourceName=source.getAliasName();source.aliasExpression.columns.forEach(column=>{this.addSelectValueAsUnique(column.name,new ColumnReference(sourceName?[sourceName]:null,column.name))});return}else if(source.datasource instanceof TableSource){if(this.tableColumnResolver){let sourceName=source.datasource.getSourceName();this.tableColumnResolver(sourceName).forEach(column=>{this.addSelectValueAsUnique(column,new ColumnReference([sourceName],column))})}return}else if(source.datasource instanceof SubQuerySource){let sourceName=source.getAliasName();new _SelectValueCollector(this.tableColumnResolver,this.commonTables).collect(source.datasource.query).forEach(item=>{this.addSelectValueAsUnique(item.name,new ColumnReference(sourceName?[sourceName]:null,item.name))});return}else if(source.datasource instanceof ParenSource)return this.visit(source.datasource.source)}visitFromClause(clause){clause&&this.processFromClause(clause,!0)}addSelectValueAsUnique(name,value){this.selectValues.some(item=>item.name===name)||this.selectValues.push({name,value})}};var CreateTableQuery=class extends SqlComponent{static{this.kind=Symbol("CreateTableQuery")}constructor(params){super(),this.tableName=new IdentifierString(params.tableName),this.isTemporary=params.isTemporary??!1,this.asSelectQuery=params.asSelectQuery}getSelectQuery(){let selectItems;return this.asSelectQuery?selectItems=new SelectValueCollector().collect(this.asSelectQuery).map(val=>new SelectItem(val.value,val.name)):selectItems=[new SelectItem(new RawString("*"))],new SimpleSelectQuery({selectClause:new SelectClause(selectItems),fromClause:new FromClause(new SourceExpression(new TableSource(null,this.tableName.name),null),null)})}getCountQuery(){return new SimpleSelectQuery({selectClause:new SelectClause([new SelectItem(new FunctionCall(null,"count",new ColumnReference(null,"*"),null))]),fromClause:new FromClause(new SourceExpression(new TableSource(null,this.tableName.name),null),null)})}};var PRESETS={mysql:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},postgres:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"$",parameterStyle:"indexed"},postgresWithNamedParams:{identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"},sqlserver:{identifierEscape:{start:"[",end:"]"},parameterSymbol:"@",parameterStyle:"named"},sqlite:{identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"},oracle:{identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"},clickhouse:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},firebird:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},db2:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},snowflake:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},cloudspanner:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"@",parameterStyle:"named"},duckdb:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},cockroachdb:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"$",parameterStyle:"indexed"},athena:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"},bigquery:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"@",parameterStyle:"named"},hive:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},mariadb:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},redshift:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"$",parameterStyle:"indexed"},flinksql:{identifierEscape:{start:"`",end:"`"},parameterSymbol:"?",parameterStyle:"anonymous"},mongodb:{identifierEscape:{start:'"',end:'"'},parameterSymbol:"?",parameterStyle:"anonymous"}},SqlPrintTokenParser=class _SqlPrintTokenParser{constructor(options){this.handlers=new Map;this.index=1;this.commentStyle="block";options?.preset&&(options={...options.preset,...options}),this.parameterDecorator=new ParameterDecorator({prefix:typeof options?.parameterSymbol=="string"?options.parameterSymbol:options?.parameterSymbol?.start??":",suffix:typeof options?.parameterSymbol=="object"?options.parameterSymbol.end:"",style:options?.parameterStyle??"named"}),this.identifierDecorator=new IdentifierDecorator({start:options?.identifierEscape?.start??'"',end:options?.identifierEscape?.end??'"'}),this.commentStyle=options?.commentStyle??"block",this.handlers.set(ValueList.kind,expr=>this.visitValueList(expr)),this.handlers.set(ColumnReference.kind,expr=>this.visitColumnReference(expr)),this.handlers.set(QualifiedName.kind,expr=>this.visitQualifiedName(expr)),this.handlers.set(FunctionCall.kind,expr=>this.visitFunctionCall(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(LiteralValue.kind,expr=>this.visitLiteralValue(expr)),this.handlers.set(ParameterExpression.kind,expr=>this.visitParameterExpression(expr)),this.handlers.set(SwitchCaseArgument.kind,expr=>this.visitSwitchCaseArgument(expr)),this.handlers.set(CaseKeyValuePair.kind,expr=>this.visitCaseKeyValuePair(expr)),this.handlers.set(RawString.kind,expr=>this.visitRawString(expr)),this.handlers.set(IdentifierString.kind,expr=>this.visitIdentifierString(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(ArraySliceExpression.kind,expr=>this.visitArraySliceExpression(expr)),this.handlers.set(ArrayIndexExpression.kind,expr=>this.visitArrayIndexExpression(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(StringSpecifierExpression.kind,expr=>this.visitStringSpecifierExpression(expr)),this.handlers.set(TypeValue.kind,expr=>this.visitTypeValue(expr)),this.handlers.set(TupleExpression.kind,expr=>this.visitTupleExpression(expr)),this.handlers.set(InlineQuery.kind,expr=>this.visitInlineQuery(expr)),this.handlers.set(WindowFrameExpression.kind,expr=>this.visitWindowFrameExpression(expr)),this.handlers.set(WindowFrameSpec.kind,expr=>this.visitWindowFrameSpec(expr)),this.handlers.set(WindowFrameBoundStatic.kind,expr=>this.visitWindowFrameBoundStatic(expr)),this.handlers.set(WindowFrameBoundaryValue.kind,expr=>this.visitWindowFrameBoundaryValue(expr)),this.handlers.set(PartitionByClause.kind,expr=>this.visitPartitionByClause(expr)),this.handlers.set(OrderByClause.kind,expr=>this.visitOrderByClause(expr)),this.handlers.set(OrderByItem.kind,expr=>this.visitOrderByItem(expr)),this.handlers.set(SelectItem.kind,expr=>this.visitSelectItem(expr)),this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(Distinct.kind,expr=>this.visitDistinct(expr)),this.handlers.set(DistinctOn.kind,expr=>this.visitDistinctOn(expr)),this.handlers.set(HintClause.kind,expr=>this.visitHintClause(expr)),this.handlers.set(TableSource.kind,expr=>this.visitTableSource(expr)),this.handlers.set(FunctionSource.kind,expr=>this.visitFunctionSource(expr)),this.handlers.set(SourceExpression.kind,expr=>this.visitSourceExpression(expr)),this.handlers.set(SourceAliasExpression.kind,expr=>this.visitSourceAliasExpression(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr)),this.handlers.set(JoinClause.kind,expr=>this.visitJoinClause(expr)),this.handlers.set(JoinOnClause.kind,expr=>this.visitJoinOnClause(expr)),this.handlers.set(JoinUsingClause.kind,expr=>this.visitJoinUsingClause(expr)),this.handlers.set(WhereClause.kind,expr=>this.visitWhereClause(expr)),this.handlers.set(GroupByClause.kind,expr=>this.visitGroupByClause(expr)),this.handlers.set(HavingClause.kind,expr=>this.visitHavingClause(expr)),this.handlers.set(WindowsClause.kind,expr=>this.visitWindowClause(expr)),this.handlers.set(WindowFrameClause.kind,expr=>this.visitWindowFrameClause(expr)),this.handlers.set(LimitClause.kind,expr=>this.visitLimitClause(expr)),this.handlers.set(OffsetClause.kind,expr=>this.visitOffsetClause(expr)),this.handlers.set(FetchClause.kind,expr=>this.visitFetchClause(expr)),this.handlers.set(FetchExpression.kind,expr=>this.visitFetchExpression(expr)),this.handlers.set(ForClause.kind,expr=>this.visitForClause(expr)),this.handlers.set(WithClause.kind,expr=>this.visitWithClause(expr)),this.handlers.set(CommonTable.kind,expr=>this.visitCommonTable(expr)),this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleQuery(expr)),this.handlers.set(SubQuerySource.kind,expr=>this.visitSubQuerySource(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr)),this.handlers.set(ValuesQuery.kind,expr=>this.visitValuesQuery(expr)),this.handlers.set(TupleExpression.kind,expr=>this.visitTupleExpression(expr)),this.handlers.set(InsertQuery.kind,expr=>this.visitInsertQuery(expr)),this.handlers.set(InsertClause.kind,expr=>this.visitInsertClause(expr)),this.handlers.set(UpdateQuery.kind,expr=>this.visitUpdateQuery(expr)),this.handlers.set(UpdateClause.kind,expr=>this.visitUpdateClause(expr)),this.handlers.set(SetClause.kind,expr=>this.visitSetClause(expr)),this.handlers.set(SetClauseItem.kind,expr=>this.visitSetClauseItem(expr)),this.handlers.set(ReturningClause.kind,expr=>this.visitReturningClause(expr)),this.handlers.set(CreateTableQuery.kind,expr=>this.visitCreateTableQuery(expr))}static{this.SPACE_TOKEN=new SqlPrintToken(10," ")}static{this.COMMA_TOKEN=new SqlPrintToken(3,",")}static{this.ARGUMENT_SPLIT_COMMA_TOKEN=new SqlPrintToken(11,",")}static{this.PAREN_OPEN_TOKEN=new SqlPrintToken(4,"(")}static{this.PAREN_CLOSE_TOKEN=new SqlPrintToken(4,")")}static{this.DOT_TOKEN=new SqlPrintToken(8,".")}static{this._selfHandlingComponentTypes=null}static getSelfHandlingComponentTypes(){return this._selfHandlingComponentTypes||(this._selfHandlingComponentTypes=new Set([SimpleSelectQuery.kind,SelectItem.kind,CaseKeyValuePair.kind,SwitchCaseArgument.kind,ColumnReference.kind,LiteralValue.kind,ParameterExpression.kind,TableSource.kind,SourceAliasExpression.kind,TypeValue.kind,FunctionCall.kind,IdentifierString.kind,QualifiedName.kind])),this._selfHandlingComponentTypes}visitBinarySelectQuery(arg){let token=new SqlPrintToken(0,"");if(arg.positionedComments&&arg.positionedComments.length>0)this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null;else if(arg.headerComments&&arg.headerComments.length>0){if(this.commentStyle==="smart"&&arg.headerComments.length>1){let mergedHeaderComment=this.createHeaderMultiLineCommentBlock(arg.headerComments);token.innerTokens.push(mergedHeaderComment)}else{let headerCommentBlocks=this.createCommentBlocks(arg.headerComments);token.innerTokens.push(...headerCommentBlocks)}token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}return token.innerTokens.push(this.visit(arg.left)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,arg.operator.value,"BinarySelectQueryOperator")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.right)),token}static commaSpaceTokens(){return[_SqlPrintTokenParser.COMMA_TOKEN,_SqlPrintTokenParser.SPACE_TOKEN]}static argumentCommaSpaceTokens(){return[_SqlPrintTokenParser.ARGUMENT_SPLIT_COMMA_TOKEN,_SqlPrintTokenParser.SPACE_TOKEN]}visitQualifiedName(arg){let token=new SqlPrintToken(0,"","QualifiedName");if(arg.namespaces)for(let i=0;i<arg.namespaces.length;i++)token.innerTokens.push(arg.namespaces[i].accept(this)),token.innerTokens.push(_SqlPrintTokenParser.DOT_TOKEN);let originalNameComments=arg.name.positionedComments,originalNameLegacyComments=arg.name.comments;arg.name.positionedComments=null,arg.name.comments=null;let nameToken=arg.name.accept(this);return token.innerTokens.push(nameToken),arg.name.positionedComments=originalNameComments,arg.name.comments=originalNameLegacyComments,(this.hasPositionedComments(arg.name)||this.hasLegacyComments(arg.name))&&this.addComponentComments(token,arg.name),this.addComponentComments(token,arg),token}visitPartitionByClause(arg){let token=new SqlPrintToken(1,"partition by","PartitionByClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.value)),token}visitOrderByClause(arg){let token=new SqlPrintToken(1,"order by","OrderByClause");token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let i=0;i<arg.order.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(this.visit(arg.order[i]));return token}visitOrderByItem(arg){let token=new SqlPrintToken(0,"","OrderByItem");return token.innerTokens.push(this.visit(arg.value)),arg.sortDirection&&arg.sortDirection!=="asc"&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"desc"))),arg.nullsPosition&&(arg.nullsPosition==="first"?(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"nulls first"))):arg.nullsPosition==="last"&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"nulls last")))),token}parse(arg){this.index=1;let token=this.visit(arg),paramsRaw=ParameterCollector.collect(arg).sort((a,b)=>(a.index??0)-(b.index??0)),style=this.parameterDecorator.style;if(style==="named"){let paramsObj={};for(let p of paramsRaw){let key=p.name.value;if(paramsObj.hasOwnProperty(key)){if(paramsObj[key]!==p.value)throw new Error(`Duplicate parameter name '${key}' with different values detected during query composition.`);continue}paramsObj[key]=p.value}return{token,params:paramsObj}}else if(style==="indexed"){let paramsArr=paramsRaw.map(p=>p.value);return{token,params:paramsArr}}else if(style==="anonymous"){let paramsArr=paramsRaw.map(p=>p.value);return{token,params:paramsArr}}return{token,params:[]}}componentHandlesOwnComments(component){return"handlesOwnComments"in component&&typeof component.handlesOwnComments=="function"?component.handlesOwnComments():_SqlPrintTokenParser.getSelfHandlingComponentTypes().has(component.getKind())}visit(arg){let handler=this.handlers.get(arg.getKind());if(handler){let token=handler(arg);return this.componentHandlesOwnComments(arg)||this.addComponentComments(token,arg),token}throw new Error(`[SqlPrintTokenParser] No handler for kind: ${arg.getKind().toString()}`)}hasPositionedComments(component){return(component.positionedComments?.length??0)>0}hasLegacyComments(component){return(component.comments?.length??0)>0}addComponentComments(token,component){this.hasPositionedComments(component)?this.addPositionedCommentsToToken(token,component):this.hasLegacyComments(component)&&this.addCommentsToToken(token,component.comments)}addPositionedCommentsToToken(token,component){if(!this.hasPositionedComments(component))return;let beforeComments=component.getPositionedComments("before");if(beforeComments.length>0){let commentBlocks=this.createCommentBlocks(beforeComments),beforeTokens=[];for(let commentBlock of commentBlocks)beforeTokens.push(commentBlock),beforeTokens.push(new SqlPrintToken(10," "));token.innerTokens.unshift(...beforeTokens)}let afterComments=component.getPositionedComments("after");if(afterComments.length>0){let commentBlocks=this.createCommentBlocks(afterComments);for(let commentBlock of commentBlocks)token.innerTokens.push(new SqlPrintToken(10," ")),token.innerTokens.push(commentBlock)}let componentsWithDuplicationIssues=["CaseExpression","SwitchCaseArgument","CaseKeyValuePair","SelectClause","LiteralValue","IdentifierString","DistinctOn","SourceAliasExpression","SimpleSelectQuery","WhereClause"];token.containerType&&componentsWithDuplicationIssues.includes(token.containerType)&&(component.positionedComments=null)}addCommentsToToken(token,comments){if(comments?.length)if(comments.length>1){let inlineComments=this.createInlineCommentSequence(comments);this.insertCommentBlocksWithSpacing(token,inlineComments)}else{let commentBlocks=this.createCommentBlocks(comments);this.insertCommentBlocksWithSpacing(token,commentBlocks)}}createInlineCommentSequence(comments){let commentTokens=[];for(let i=0;i<comments.length;i++){let comment=comments[i];if(comment.trim()){let commentToken=new SqlPrintToken(6,this.formatBlockComment(comment));if(commentTokens.push(commentToken),i<comments.length-1){let spaceToken=new SqlPrintToken(10," ");commentTokens.push(spaceToken)}}}return commentTokens}createCommentBlocks(comments){if(this.commentStyle==="smart")return this.createSmartCommentBlocks(comments);let commentBlocks=[];for(let comment of comments){let trimmed=comment.trim(),isSeparatorLine=/^[-=_+*#]+$/.test(trimmed);(trimmed||isSeparatorLine||comment==="")&&commentBlocks.push(this.createSingleCommentBlock(comment))}return commentBlocks}createSmartCommentBlocks(comments){let commentBlocks=[],blockComments=[],flushBlockComments=()=>{blockComments.length>0&&(blockComments.length===1?commentBlocks.push(this.createSingleCommentBlock(blockComments[0])):commentBlocks.push(this.createMultiLineCommentBlock(blockComments)),blockComments.length=0)};for(let comment of comments){let trimmed=comment.trim(),isSeparatorLine=/^[-=_+*#]+$/.test(trimmed);!trimmed&&!isSeparatorLine&&comment!==""||(this.shouldMergeComment(trimmed)?blockComments.push(comment):(flushBlockComments(),commentBlocks.push(this.createSingleCommentBlock(comment))))}return flushBlockComments(),commentBlocks}shouldMergeComment(trimmed){return!(!/^[-=_+*#]+$/.test(trimmed)&&trimmed.startsWith("--")||trimmed.startsWith("/*")&&trimmed.endsWith("*/")&&trimmed.includes(`
16
+ `))}createMultiLineCommentBlock(comments){let lines=[];for(let comment of comments){let trimmed=comment.trim();if(trimmed.startsWith("/*")&&trimmed.endsWith("*/")){let content=trimmed.slice(2,-2);if(content.trim()){let contentLines=content.replace(/\*\//g,"*").replace(/\/\*/g,"*").split(`
17
+ `).map(line=>line.trim()).filter(line=>line);lines.push(...contentLines)}}else if(trimmed){let contentLines=trimmed.replace(/\*\//g,"*").replace(/\/\*/g,"*").split(`
18
+ `).map(line=>line.trim()).filter(line=>line);lines.push(...contentLines)}}let commentBlock=new SqlPrintToken(0,"","CommentBlock");if(lines.length===0){let commentToken=new SqlPrintToken(6,"/* */");commentBlock.innerTokens.push(commentToken)}else{let openToken=new SqlPrintToken(6,"/*");commentBlock.innerTokens.push(openToken),commentBlock.innerTokens.push(new SqlPrintToken(12,""));for(let line of lines){let lineToken=new SqlPrintToken(6,` ${line}`);commentBlock.innerTokens.push(lineToken),commentBlock.innerTokens.push(new SqlPrintToken(12,""))}let closeToken=new SqlPrintToken(6,"*/");commentBlock.innerTokens.push(closeToken)}return commentBlock.innerTokens.push(new SqlPrintToken(12,"")),commentBlock.innerTokens.push(new SqlPrintToken(10," ")),commentBlock}createHeaderMultiLineCommentBlock(headerComments){let lines=headerComments,commentBlock=new SqlPrintToken(0,"","CommentBlock");if(lines.length===0){let commentToken=new SqlPrintToken(6,"/* */");commentBlock.innerTokens.push(commentToken)}else{let openToken=new SqlPrintToken(6,"/*");commentBlock.innerTokens.push(openToken),commentBlock.innerTokens.push(new SqlPrintToken(12,""));for(let line of lines){let sanitized=line.replace(/\*\//g,"*").replace(/\/\*/g,"*"),lineToken=new SqlPrintToken(6,` ${sanitized}`);commentBlock.innerTokens.push(lineToken),commentBlock.innerTokens.push(new SqlPrintToken(12,""))}let closeToken=new SqlPrintToken(6,"*/");commentBlock.innerTokens.push(closeToken)}return commentBlock.innerTokens.push(new SqlPrintToken(12,"")),commentBlock.innerTokens.push(new SqlPrintToken(10," ")),commentBlock}createSingleCommentBlock(comment){let commentBlock=new SqlPrintToken(0,"","CommentBlock"),commentToken=new SqlPrintToken(6,this.formatComment(comment));commentBlock.innerTokens.push(commentToken);let commentNewlineToken=new SqlPrintToken(12,"");commentBlock.innerTokens.push(commentNewlineToken);let spaceToken=new SqlPrintToken(10," ");return commentBlock.innerTokens.push(spaceToken),commentBlock}formatComment(comment){let trimmed=comment.trim();return this.commentStyle==="smart"?this.formatCommentSmart(trimmed):trimmed.startsWith("--")&&!/^--[-=_+*#]*$/.test(trimmed)?trimmed:trimmed.startsWith("/*")&&trimmed.endsWith("*/")?this.formatBlockComment(trimmed):this.formatBlockComment(trimmed)}formatCommentSmart(comment){return this.formatBlockComment(comment)}insertCommentBlocksWithSpacing(token,commentBlocks){if(token.containerType==="SelectItem"){token.innerTokens.length>0&&token.innerTokens[token.innerTokens.length-1].type!==10&&token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(...commentBlocks);return}if(token.containerType==="SelectClause"){token.innerTokens.unshift(_SqlPrintTokenParser.SPACE_TOKEN,...commentBlocks);return}if(token.containerType==="IdentifierString"){token.innerTokens.length>0&&token.innerTokens[token.innerTokens.length-1].type!==10&&token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(...commentBlocks);return}if(token.innerTokens.unshift(...commentBlocks),this.shouldAddSeparatorSpace(token.containerType)){let separatorSpace=new SqlPrintToken(10," ");token.innerTokens.splice(commentBlocks.length,0,separatorSpace),token.innerTokens.length>commentBlocks.length+1&&token.innerTokens[commentBlocks.length+1].type===10&&token.innerTokens.splice(commentBlocks.length+1,1)}else token.innerTokens.length>commentBlocks.length&&token.innerTokens[commentBlocks.length].type===10&&token.innerTokens.splice(commentBlocks.length,1)}addPositionedCommentsToParenExpression(token,component){if(!component.positionedComments)return;let beforeComments=component.getPositionedComments("before");if(beforeComments.length>0){let commentBlocks=this.createCommentBlocks(beforeComments),insertIndex=1;for(let commentBlock of commentBlocks)token.innerTokens.splice(insertIndex,0,commentBlock),insertIndex++}let afterComments=component.getPositionedComments("after");if(afterComments.length>0){let commentBlocks=this.createCommentBlocks(afterComments),insertIndex=token.innerTokens.length;for(let commentBlock of commentBlocks)token.innerTokens.splice(insertIndex-1,0,commentBlock)}}shouldAddSeparatorSpace(containerType){return this.isClauseLevelContainer(containerType)}isClauseLevelContainer(containerType){switch(containerType){case"SelectClause":case"FromClause":case"WhereClause":case"GroupByClause":case"HavingClause":case"OrderByClause":case"LimitClause":case"OffsetClause":case"WithClause":case"SimpleSelectQuery":return!0;default:return!1}}formatBlockComment(comment){let sanitizedComment=comment.replace(/\*\//g,"*").replace(/\/\*/g,"*"),trimmed=sanitizedComment.trim();return/^[-=_+*#]+$/.test(trimmed)?`/* ${trimmed} */`:(sanitizedComment=sanitizedComment.replace(/\r?\n/g," ").replace(/\s+/g," ").trim(),sanitizedComment?`/* ${sanitizedComment} */`:"")}visitValueList(arg){let token=new SqlPrintToken(0,"","ValueList");for(let i=0;i<arg.values.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.argumentCommaSpaceTokens()),token.innerTokens.push(this.visit(arg.values[i]));return token}visitColumnReference(arg){let token=new SqlPrintToken(0,"","ColumnReference");return token.innerTokens.push(arg.qualifiedName.accept(this)),this.addComponentComments(token,arg),token}visitFunctionCall(arg){let token=new SqlPrintToken(0,"","FunctionCall");if(this.addComponentComments(token,arg),token.innerTokens.push(arg.qualifiedName.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),arg.argument&&token.innerTokens.push(this.visit(arg.argument)),arg.internalOrderBy&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.internalOrderBy))),arg.comments&&arg.comments.length>0){let closingParenToken=new SqlPrintToken(4,")");this.addCommentsToToken(closingParenToken,arg.comments),token.innerTokens.push(closingParenToken),arg.comments=null}else token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN);return arg.withOrdinality&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"with ordinality"))),arg.over&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"over")),arg.over instanceof IdentifierString?(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.over.accept(this))):(token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),token.innerTokens.push(this.visit(arg.over)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN))),token}visitUnaryExpression(arg){let token=new SqlPrintToken(0,"","UnaryExpression");return token.innerTokens.push(this.visit(arg.operator)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.expression)),token}visitBinaryExpression(arg){let token=new SqlPrintToken(0,"","BinaryExpression");token.innerTokens.push(this.visit(arg.left)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let operatorToken=this.visit(arg.operator),operatorLower=operatorToken.text.toLowerCase();return(operatorLower==="and"||operatorLower==="or")&&(operatorToken.type=5),token.innerTokens.push(operatorToken),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.right)),token}visitLiteralValue(arg){let text;arg.value===null?text="null":arg.isStringLiteral?text=`'${arg.value.replace(/'/g,"''")}'`:typeof arg.value=="string"?text=arg.value:text=arg.value.toString();let token=new SqlPrintToken(2,text,"LiteralValue");return arg.positionedComments&&arg.positionedComments.length>0?(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null):arg.comments&&arg.comments.length>0&&this.addCommentsToToken(token,arg.comments),token}visitParameterExpression(arg){arg.index=this.index;let text=this.parameterDecorator.decorate(arg.name.value,arg.index),token=new SqlPrintToken(7,text);return this.addComponentComments(token,arg),this.index++,token}visitSwitchCaseArgument(arg){let token=new SqlPrintToken(0,"","SwitchCaseArgument");this.addComponentComments(token,arg);for(let kv of arg.cases)token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(kv.accept(this));if(arg.elseValue)token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.createElseToken(arg.elseValue,arg.comments));else if(arg.comments&&arg.comments.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(arg.comments);token.innerTokens.push(...commentTokens)}return token}createElseToken(elseValue,switchCaseComments){let elseToken=new SqlPrintToken(0,"","ElseClause");if(elseToken.innerTokens.push(new SqlPrintToken(1,"else")),switchCaseComments&&switchCaseComments.length>0){elseToken.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(switchCaseComments);elseToken.innerTokens.push(...commentTokens)}elseToken.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let elseValueContainer=new SqlPrintToken(0,"","CaseElseValue");return elseValueContainer.innerTokens.push(this.visit(elseValue)),elseToken.innerTokens.push(elseValueContainer),elseToken}visitCaseKeyValuePair(arg){let token=new SqlPrintToken(0,"","CaseKeyValuePair");if(arg.positionedComments&&arg.positionedComments.length>0&&(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null),token.innerTokens.push(new SqlPrintToken(1,"when")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.key)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"then")),arg.comments&&arg.comments.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(arg.comments);token.innerTokens.push(...commentTokens)}token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let thenValueContainer=new SqlPrintToken(0,"","CaseThenValue");return thenValueContainer.innerTokens.push(this.visit(arg.value)),token.innerTokens.push(thenValueContainer),token}visitRawString(arg){return new SqlPrintToken(2,arg.value,"RawString")}visitIdentifierString(arg){let text=arg.name==="*"?arg.name:this.identifierDecorator.decorate(arg.name);if(arg.positionedComments&&arg.positionedComments.length>0){let token2=new SqlPrintToken(0,"","IdentifierString");this.addPositionedCommentsToToken(token2,arg),arg.positionedComments=null;let valueToken=new SqlPrintToken(2,text);return token2.innerTokens.push(valueToken),token2}if(arg.comments&&arg.comments.length>0){let token2=new SqlPrintToken(0,"","IdentifierString"),valueToken=new SqlPrintToken(2,text);return token2.innerTokens.push(valueToken),this.addComponentComments(token2,arg),token2}return new SqlPrintToken(2,text,"IdentifierString")}visitParenExpression(arg){let token=new SqlPrintToken(0,"","ParenExpression"),hasOwnComments=arg.positionedComments&&arg.positionedComments.length>0,hasInnerComments=arg.expression.positionedComments&&arg.expression.positionedComments.length>0,innerBeforeComments=[],innerAfterComments=[];if(hasInnerComments&&(innerBeforeComments=arg.expression.getPositionedComments("before"),innerAfterComments=arg.expression.getPositionedComments("after"),arg.expression.positionedComments=null),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),token.innerTokens.push(this.visit(arg.expression)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),innerBeforeComments.length>0){let commentBlocks=this.createCommentBlocks(innerBeforeComments),insertIndex=1;for(let commentBlock of commentBlocks)token.innerTokens.splice(insertIndex,0,commentBlock),insertIndex++}if(innerAfterComments.length>0){let commentBlocks=this.createCommentBlocks(innerAfterComments),insertIndex=token.innerTokens.length;for(let commentBlock of commentBlocks)token.innerTokens.splice(insertIndex-1,0,commentBlock)}return hasOwnComments&&(this.addPositionedCommentsToParenExpression(token,arg),arg.positionedComments=null),token}visitCastExpression(arg){let token=new SqlPrintToken(0,"","CastExpression");return token.innerTokens.push(this.visit(arg.input)),token.innerTokens.push(new SqlPrintToken(5,"::")),token.innerTokens.push(this.visit(arg.castType)),token}visitCaseExpression(arg){let token=new SqlPrintToken(0,"","CaseExpression");return arg.positionedComments&&arg.positionedComments.length>0&&(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null),token.innerTokens.push(new SqlPrintToken(1,"case")),arg.condition&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.condition))),token.innerTokens.push(this.visit(arg.switchCase)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"end")),token}visitArrayExpression(arg){let token=new SqlPrintToken(0,"","ArrayExpression");return token.innerTokens.push(new SqlPrintToken(1,"array")),token.innerTokens.push(new SqlPrintToken(4,"[")),token.innerTokens.push(this.visit(arg.expression)),token.innerTokens.push(new SqlPrintToken(4,"]")),token}visitArrayQueryExpression(arg){let token=new SqlPrintToken(0,"","ArrayExpression");return token.innerTokens.push(new SqlPrintToken(1,"array")),token.innerTokens.push(new SqlPrintToken(4,"(")),token.innerTokens.push(this.visit(arg.query)),token.innerTokens.push(new SqlPrintToken(4,")")),token}visitArraySliceExpression(arg){let token=new SqlPrintToken(0,"","ArrayExpression");return token.innerTokens.push(this.visit(arg.array)),token.innerTokens.push(new SqlPrintToken(4,"[")),arg.startIndex&&token.innerTokens.push(this.visit(arg.startIndex)),token.innerTokens.push(new SqlPrintToken(5,":")),arg.endIndex&&token.innerTokens.push(this.visit(arg.endIndex)),token.innerTokens.push(new SqlPrintToken(4,"]")),token}visitArrayIndexExpression(arg){let token=new SqlPrintToken(0,"","ArrayExpression");return token.innerTokens.push(this.visit(arg.array)),token.innerTokens.push(new SqlPrintToken(4,"[")),token.innerTokens.push(this.visit(arg.index)),token.innerTokens.push(new SqlPrintToken(4,"]")),token}visitBetweenExpression(arg){let token=new SqlPrintToken(0,"","BetweenExpression");return token.innerTokens.push(this.visit(arg.expression)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),arg.negated&&(token.innerTokens.push(new SqlPrintToken(1,"not")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)),token.innerTokens.push(new SqlPrintToken(1,"between")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.lower)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"and")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.upper)),token}visitStringSpecifierExpression(arg){let specifier=arg.specifier.accept(this).text,value=arg.value.accept(this).text;return new SqlPrintToken(2,specifier+value,"StringSpecifierExpression")}visitTypeValue(arg){let token=new SqlPrintToken(0,"","TypeValue");return this.addComponentComments(token,arg),token.innerTokens.push(arg.qualifiedName.accept(this)),arg.argument&&(token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),token.innerTokens.push(this.visit(arg.argument)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN)),token}visitTupleExpression(arg){let token=new SqlPrintToken(0,"","TupleExpression");token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN);for(let i=0;i<arg.values.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.argumentCommaSpaceTokens()),token.innerTokens.push(this.visit(arg.values[i]));return token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),this.addComponentComments(token,arg),token}visitWindowFrameExpression(arg){let token=new SqlPrintToken(0,"","WindowFrameExpression"),first=!0;return arg.partition&&(token.innerTokens.push(this.visit(arg.partition)),first=!1),arg.order&&(first?first=!1:token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.order))),arg.frameSpec&&(first?first=!1:token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.frameSpec))),token}visitWindowFrameSpec(arg){let token=new SqlPrintToken(0,"","WindowFrameSpec");return token.innerTokens.push(new SqlPrintToken(1,arg.frameType)),arg.endBound===null?(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.startBound.accept(this))):(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"between")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.startBound.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"and")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.endBound.accept(this))),token}visitWindowFrameBoundaryValue(arg){let token=new SqlPrintToken(0,"","WindowFrameBoundaryValue");return token.innerTokens.push(arg.value.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,arg.isFollowing?"following":"preceding")),token}visitWindowFrameBoundStatic(arg){return new SqlPrintToken(1,arg.bound)}visitSelectItem(arg){let token=new SqlPrintToken(0,"","SelectItem"),originalSelectItemPositionedComments=arg.positionedComments,originalValuePositionedComments=arg.value.positionedComments;arg.value.positionedComments=null;let beforeComments=arg.getPositionedComments("before");if(beforeComments.length>0){let commentTokens=this.createInlineCommentSequence(beforeComments);token.innerTokens.push(...commentTokens),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}token.innerTokens.push(this.visit(arg.value));let afterComments=arg.getPositionedComments("after"),isParenExpression=arg.value.constructor.name==="ParenExpression";if(afterComments.length>0&&!isParenExpression){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(afterComments);token.innerTokens.push(...commentTokens)}if(arg.positionedComments=originalSelectItemPositionedComments,arg.value.positionedComments=originalValuePositionedComments,!arg.identifier)return token;if(arg.value instanceof ColumnReference){let defaultName=arg.value.column.name;if(arg.identifier.name===defaultName)return token}token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let asKeywordPositionedComments="asKeywordPositionedComments"in arg?arg.asKeywordPositionedComments:null;if(asKeywordPositionedComments){let beforeComments2=asKeywordPositionedComments.filter(pc=>pc.position==="before");if(beforeComments2.length>0)for(let posComment of beforeComments2){let commentTokens=this.createInlineCommentSequence(posComment.comments);token.innerTokens.push(...commentTokens),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}}if(token.innerTokens.push(new SqlPrintToken(1,"as")),asKeywordPositionedComments){let afterComments2=asKeywordPositionedComments.filter(pc=>pc.position==="after");if(afterComments2.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let posComment of afterComments2){let commentTokens=this.createInlineCommentSequence(posComment.comments);token.innerTokens.push(...commentTokens)}}}let asKeywordComments="asKeywordComments"in arg?arg.asKeywordComments:null;if(asKeywordComments&&asKeywordComments.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(asKeywordComments);token.innerTokens.push(...commentTokens)}token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let identifierToken=this.visit(arg.identifier);token.innerTokens.push(identifierToken);let aliasPositionedComments="aliasPositionedComments"in arg?arg.aliasPositionedComments:null;if(aliasPositionedComments){let afterComments2=aliasPositionedComments.filter(pc=>pc.position==="after");if(afterComments2.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let posComment of afterComments2){let commentTokens=this.createInlineCommentSequence(posComment.comments);token.innerTokens.push(...commentTokens)}}}let aliasComments=arg.aliasComments;if(aliasComments&&aliasComments.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(aliasComments);token.innerTokens.push(...commentTokens)}return token}visitSelectClause(arg){let token=new SqlPrintToken(1,"select","SelectClause");arg.positionedComments&&arg.positionedComments.length>0&&(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null);let selectKeywordText="select";for(let hint of arg.hints)selectKeywordText+=" "+this.visit(hint).text;if(arg.distinct){let distinctToken=arg.distinct.accept(this);if(distinctToken.innerTokens&&distinctToken.innerTokens.length>0){let distinctText=distinctToken.text;for(let innerToken of distinctToken.innerTokens)distinctText+=this.flattenTokenText(innerToken);selectKeywordText+=" "+distinctText}else selectKeywordText+=" "+distinctToken.text}token.text=selectKeywordText,token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let i=0;i<arg.items.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(this.visit(arg.items[i]));return token}flattenTokenText(token){let result=token.text;if(token.innerTokens)for(let innerToken of token.innerTokens)result+=this.flattenTokenText(innerToken);return result}visitHintClause(arg){return new SqlPrintToken(2,arg.getFullHint())}visitDistinct(arg){let token=new SqlPrintToken(1,"distinct");return arg.positionedComments&&arg.positionedComments.length>0&&(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null),token}visitDistinctOn(arg){let token=new SqlPrintToken(0,"","DistinctOn");return token.innerTokens.push(new SqlPrintToken(1,"distinct on")),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),token.innerTokens.push(arg.value.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),token}visitTableSource(arg){let fullName="";Array.isArray(arg.namespaces)&&arg.namespaces.length>0&&(fullName=arg.namespaces.map(ns=>ns.accept(this).text).join(".")+"."),fullName+=arg.table.accept(this).text;let token=new SqlPrintToken(2,fullName);return this.addComponentComments(token,arg),arg.identifier&&(arg.identifier.name,arg.table.name),token}visitSourceExpression(arg){let token=new SqlPrintToken(0,"","SourceExpression");if(token.innerTokens.push(arg.datasource.accept(this)),!arg.aliasExpression)return token;if(arg.datasource instanceof TableSource){let defaultName=arg.datasource.table.name;return arg.aliasExpression.table.name===defaultName||(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"as")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.aliasExpression.accept(this))),token}else return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"as")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.aliasExpression.accept(this)),token}visitFromClause(arg){let token=new SqlPrintToken(1,"from","FromClause");if(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.source)),arg.joins)for(let i=0;i<arg.joins.length;i++)token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.joins[i]));return token}visitJoinClause(arg){let token=new SqlPrintToken(0,"","JoinClause"),joinKeywordPositionedComments=arg.joinKeywordPositionedComments;if(joinKeywordPositionedComments){let beforeComments=joinKeywordPositionedComments.filter(pc=>pc.position==="before");if(beforeComments.length>0)for(let posComment of beforeComments){let commentTokens=this.createInlineCommentSequence(posComment.comments);token.innerTokens.push(...commentTokens),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}}if(token.innerTokens.push(new SqlPrintToken(1,arg.joinType.value)),joinKeywordPositionedComments){let afterComments=joinKeywordPositionedComments.filter(pc=>pc.position==="after");if(afterComments.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let posComment of afterComments){let commentTokens=this.createInlineCommentSequence(posComment.comments);token.innerTokens.push(...commentTokens)}}}let joinKeywordComments=arg.joinKeywordComments;if(joinKeywordComments&&joinKeywordComments.length>0){token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let commentTokens=this.createInlineCommentSequence(joinKeywordComments);token.innerTokens.push(...commentTokens)}return arg.lateral&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"lateral"))),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.source)),arg.condition&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.condition))),token}visitJoinOnClause(arg){let token=new SqlPrintToken(0,"","JoinOnClause");return token.innerTokens.push(new SqlPrintToken(1,"on")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.condition)),token}visitJoinUsingClause(arg){let token=new SqlPrintToken(0,"","JoinUsingClause");return token.innerTokens.push(new SqlPrintToken(1,"using")),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),token.innerTokens.push(this.visit(arg.condition)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),token}visitFunctionSource(arg){let token=new SqlPrintToken(0,"","FunctionSource");return token.innerTokens.push(arg.qualifiedName.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),arg.argument&&token.innerTokens.push(this.visit(arg.argument)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),token}visitSourceAliasExpression(arg){let token=new SqlPrintToken(0,"","SourceAliasExpression");if(token.innerTokens.push(this.visit(arg.table)),arg.columns){token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN);for(let i=0;i<arg.columns.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.argumentCommaSpaceTokens()),token.innerTokens.push(this.visit(arg.columns[i]));token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN)}return arg.positionedComments&&arg.positionedComments.length>0?(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null):arg.comments&&arg.comments.length>0&&this.addCommentsToToken(token,arg.comments),token}visitWhereClause(arg){let token=new SqlPrintToken(1,"where","WhereClause");return this.addComponentComments(token,arg),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.condition)),token}visitGroupByClause(arg){let token=new SqlPrintToken(1,"group by","GroupByClause");token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let i=0;i<arg.grouping.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(this.visit(arg.grouping[i]));return token}visitHavingClause(arg){let token=new SqlPrintToken(1,"having","HavingClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.condition)),token}visitWindowClause(arg){let token=new SqlPrintToken(1,"window","WindowClause");token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let i=0;i<arg.windows.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(this.visit(arg.windows[i]));return token}visitWindowFrameClause(arg){let token=new SqlPrintToken(0,"","WindowFrameClause");return token.innerTokens.push(arg.name.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"as")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN),token.innerTokens.push(this.visit(arg.expression)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),token}visitLimitClause(arg){let token=new SqlPrintToken(1,"limit","LimitClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.value)),token}visitOffsetClause(arg){let token=new SqlPrintToken(1,"offset","OffsetClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.value)),token}visitFetchClause(arg){let token=new SqlPrintToken(1,"fetch","FetchClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.expression)),token}visitFetchExpression(arg){let token=new SqlPrintToken(0,"","FetchExpression");return token.innerTokens.push(new SqlPrintToken(1,arg.type)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.count.accept(this)),arg.unit&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,arg.unit))),token}visitForClause(arg){let token=new SqlPrintToken(1,"for","ForClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,arg.lockMode)),token}visitWithClause(arg){let token=new SqlPrintToken(1,"with","WithClause");token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),arg.recursive&&(token.innerTokens.push(new SqlPrintToken(1,"recursive")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN));for(let i=0;i<arg.tables.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(arg.tables[i].accept(this));return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),this.addComponentComments(token,arg),token}visitCommonTable(arg){let token=new SqlPrintToken(0,"","CommonTable");arg.positionedComments&&arg.positionedComments.length>0?(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null):arg.comments&&arg.comments.length>0&&this.addCommentsToToken(token,arg.comments),token.innerTokens.push(arg.aliasExpression.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"as")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),arg.materialized!==null&&(arg.materialized?token.innerTokens.push(new SqlPrintToken(1,"materialized")):token.innerTokens.push(new SqlPrintToken(1,"not materialized")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)),token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN);let query=new SqlPrintToken(0,"","SubQuerySource");return query.innerTokens.push(arg.query.accept(this)),token.innerTokens.push(query),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),token}visitSimpleQuery(arg){let token=new SqlPrintToken(0,"","SimpleSelectQuery");if(arg.headerComments&&arg.headerComments.length>0){if(this.commentStyle==="smart"&&arg.headerComments.length>1){let mergedHeaderComment=this.createHeaderMultiLineCommentBlock(arg.headerComments);token.innerTokens.push(mergedHeaderComment)}else{let headerCommentBlocks=this.createCommentBlocks(arg.headerComments);token.innerTokens.push(...headerCommentBlocks)}arg.withClause&&token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}if(arg.positionedComments&&arg.positionedComments.length>0&&(this.addPositionedCommentsToToken(token,arg),arg.positionedComments=null),arg.withClause&&token.innerTokens.push(arg.withClause.accept(this)),arg.comments&&arg.comments.length>0){let commentBlocks=this.createCommentBlocks(arg.comments);token.innerTokens.push(...commentBlocks),arg.selectClause&&token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}return token.innerTokens.push(arg.selectClause.accept(this)),arg.fromClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.fromClause.accept(this)),arg.whereClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.whereClause.accept(this))),arg.groupByClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.groupByClause.accept(this))),arg.havingClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.havingClause.accept(this))),arg.orderByClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.orderByClause.accept(this))),arg.windowClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.windowClause.accept(this))),arg.limitClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.limitClause.accept(this))),arg.offsetClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.offsetClause.accept(this))),arg.fetchClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.fetchClause.accept(this))),arg.forClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.forClause.accept(this)))),token}visitSubQuerySource(arg){let token=new SqlPrintToken(0,"");token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN);let subQuery=new SqlPrintToken(0,"","SubQuerySource");return subQuery.innerTokens.push(arg.query.accept(this)),token.innerTokens.push(subQuery),token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN),token}visitValuesQuery(arg){let token=new SqlPrintToken(1,"values","ValuesQuery");if(arg.headerComments&&arg.headerComments.length>0){let headerCommentBlocks=this.createCommentBlocks(arg.headerComments);for(let commentBlock of headerCommentBlocks)token.innerTokens.push(commentBlock),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN)}token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);let values=new SqlPrintToken(0,"","Values");for(let i=0;i<arg.tuples.length;i++)i>0&&values.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),values.innerTokens.push(arg.tuples[i].accept(this));return token.innerTokens.push(values),this.addCommentsToToken(token,arg.comments),token}visitInlineQuery(arg){let token=new SqlPrintToken(0,"");token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN);let queryToken=new SqlPrintToken(0,"","InlineQuery");if(queryToken.innerTokens.push(arg.selectQuery.accept(this)),token.innerTokens.push(queryToken),arg.comments&&arg.comments.length>0){let closingParenToken=new SqlPrintToken(4,")");this.addCommentsToToken(closingParenToken,arg.comments),token.innerTokens.push(closingParenToken),arg.comments=null}else token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN);return token}visitInsertQuery(arg){let token=new SqlPrintToken(0,"","InsertQuery");return token.innerTokens.push(this.visit(arg.insertClause)),arg.selectQuery&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(this.visit(arg.selectQuery))),token}visitInsertClause(arg){let token=new SqlPrintToken(0,"");if(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"insert into")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.source.accept(this)),arg.columns.length>0){token.innerTokens.push(_SqlPrintTokenParser.PAREN_OPEN_TOKEN);for(let i=0;i<arg.columns.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(arg.columns[i].accept(this));token.innerTokens.push(_SqlPrintTokenParser.PAREN_CLOSE_TOKEN)}return token}visitUpdateQuery(arg){let token=new SqlPrintToken(0,"","UpdateQuery");return arg.withClause&&token.innerTokens.push(arg.withClause.accept(this)),token.innerTokens.push(arg.updateClause.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.setClause.accept(this)),arg.fromClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.fromClause.accept(this))),arg.whereClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.whereClause.accept(this))),arg.returningClause&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.returningClause.accept(this))),token}visitUpdateClause(arg){let token=new SqlPrintToken(1,"update","UpdateClause");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.source.accept(this)),token}visitSetClause(arg){let token=new SqlPrintToken(1,"set","SelectClause");token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let i=0;i<arg.items.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(this.visit(arg.items[i]));return token}visitSetClauseItem(arg){let token=new SqlPrintToken(0,"","SetClauseItem");return token.innerTokens.push(arg.column.accept(this)),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(5,"=")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.value.accept(this)),token}visitReturningClause(arg){let token=new SqlPrintToken(1,"returning","ReturningClause");token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN);for(let i=0;i<arg.columns.length;i++)i>0&&token.innerTokens.push(..._SqlPrintTokenParser.commaSpaceTokens()),token.innerTokens.push(this.visit(arg.columns[i]));return token}visitCreateTableQuery(arg){let token=new SqlPrintToken(1,arg.isTemporary?"create temporary table":"create table","CreateTableQuery");return token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.tableName.accept(this)),arg.asSelectQuery&&(token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(new SqlPrintToken(1,"as")),token.innerTokens.push(_SqlPrintTokenParser.SPACE_TOKEN),token.innerTokens.push(arg.asSelectQuery.accept(this))),token}};var LinePrinter=class{constructor(indentChar=" ",indentSize=0,newline=`\r
19
+ `,commaBreak="none"){this.indentChar=indentChar,this.indentSize=indentSize,this.newline=newline,this.commaBreak=commaBreak,this.lines=[],this.appendNewline(0)}print(){let result="";for(let line of this.lines)line.text!==""&&(result+=this.indent(line.level)+line.text);return result.trimEnd()}indent(level){return this.indentChar.repeat(this.indentSize*level)}appendNewline(level){if(this.lines.length>0){let current=this.lines[this.lines.length-1];current.text!==""&&(current.text=current.text.trimEnd()+this.newline)}this.lines.push(new PrintLine(level,""))}appendText(text){if(this.cleanupLine(text)){let previousLine=this.lines[this.lines.length-1];previousLine.text=previousLine.text.trimEnd()+text;return}let workLine=this.getCurrentLine();text===" "&&workLine.text===""||(workLine.text+=text)}cleanupLine(text){let workLine=this.getCurrentLine();return text===","&&workLine.text.trim()===""&&this.lines.length>1&&(this.commaBreak==="after"||this.commaBreak==="none")?(this.lines.pop(),!0):!1}getCurrentLine(){if(this.lines.length>0)return this.lines[this.lines.length-1];throw new Error("No tokens to get current line from.")}isCurrentLineEmpty(){return this.lines.length>0?this.lines[this.lines.length-1].text.trim()==="":!0}},PrintLine=class{constructor(level,text){this.level=level,this.text=text}};var INDENT_CHAR_MAP={space:" ",tab:" "},NEWLINE_MAP={lf:`
20
+ `,crlf:`\r
21
+ `,cr:"\r"},IDENTIFIER_ESCAPE_MAP={quote:{start:'"',end:'"'},backtick:{start:"`",end:"`"},bracket:{start:"[",end:"]"},none:{start:"",end:""}};function resolveIndentCharOption(option){if(option===void 0)return;let normalized=typeof option=="string"?option.toLowerCase():option;return typeof normalized=="string"&&Object.prototype.hasOwnProperty.call(INDENT_CHAR_MAP,normalized)?INDENT_CHAR_MAP[normalized]:option}function resolveNewlineOption(option){if(option===void 0)return;let normalized=typeof option=="string"?option.toLowerCase():option;return typeof normalized=="string"&&Object.prototype.hasOwnProperty.call(NEWLINE_MAP,normalized)?NEWLINE_MAP[normalized]:option}function resolveIdentifierEscapeOption(option){if(option===void 0)return;if(typeof option=="string"){let normalized=option.toLowerCase();if(!Object.prototype.hasOwnProperty.call(IDENTIFIER_ESCAPE_MAP,normalized))throw new Error(`Unknown identifierEscape option: ${option}`);let mapped=IDENTIFIER_ESCAPE_MAP[normalized];return{start:mapped.start,end:mapped.end}}let start=option.start??"",end=option.end??"";return{start,end}}var SqlPrinter=class _SqlPrinter{constructor(options){this.insideWithClause=!1;let resolvedIndentChar=resolveIndentCharOption(options?.indentChar),resolvedNewline=resolveNewlineOption(options?.newline);this.indentChar=resolvedIndentChar??"",this.indentSize=options?.indentSize??0,this.newline=resolvedNewline??" ",this.commaBreak=options?.commaBreak??"none",this.cteCommaBreak=options?.cteCommaBreak??this.commaBreak,this.valuesCommaBreak=options?.valuesCommaBreak??this.commaBreak,this.andBreak=options?.andBreak??"none",this.keywordCase=options?.keywordCase??"none",this.exportComment=options?.exportComment??!1,this.strictCommentPlacement=options?.strictCommentPlacement??!1,this.withClauseStyle=options?.withClauseStyle??"standard",this.commentStyle=options?.commentStyle??"block",this.parenthesesOneLine=options?.parenthesesOneLine??!1,this.betweenOneLine=options?.betweenOneLine??!1,this.valuesOneLine=options?.valuesOneLine??!1,this.joinOneLine=options?.joinOneLine??!1,this.caseOneLine=options?.caseOneLine??!1,this.subqueryOneLine=options?.subqueryOneLine??!1,this.linePrinter=new LinePrinter(this.indentChar,this.indentSize,this.newline,this.commaBreak),this.indentIncrementContainers=new Set(options?.indentIncrementContainerTypes??["SelectClause","FromClause","WhereClause","GroupByClause","HavingClause","WindowFrameExpression","PartitionByClause","OrderByClause","WindowClause","LimitClause","OffsetClause","SubQuerySource","BinarySelectQueryOperator","Values","WithClause","SwitchCaseArgument","CaseKeyValuePair","CaseThenValue","ElseClause","CaseElseValue","SimpleSelectQuery"])}print(token,level=0){return this.linePrinter=new LinePrinter(this.indentChar,this.indentSize,this.newline,this.commaBreak),this.insideWithClause=!1,this.linePrinter.lines.length>0&&level!==this.linePrinter.lines[0].level&&(this.linePrinter.lines[0].level=level),this.appendToken(token,level,void 0,0),this.linePrinter.print()}appendToken(token,level,parentContainerType,caseContextDepth=0){let wasInsideWithClause=this.insideWithClause;if(token.containerType==="WithClause"&&this.withClauseStyle==="full-oneline"&&(this.insideWithClause=!0),this.shouldSkipToken(token))return;let current=this.linePrinter.getCurrentLine(),nextCaseContextDepth=this.isCaseContext(token.containerType)?caseContextDepth+1:caseContextDepth;if(token.type===1)this.handleKeywordToken(token,level,parentContainerType,caseContextDepth);else if(token.type===3)this.handleCommaToken(token,level,parentContainerType);else if(token.type===5&&token.text.toLowerCase()==="and")this.handleAndOperatorToken(token,level,parentContainerType,caseContextDepth);else if(token.containerType==="JoinClause")this.handleJoinClauseToken(token,level);else if(token.type===6)this.exportComment&&this.linePrinter.appendText(token.text);else if(token.type===10)this.handleSpaceToken(token,parentContainerType);else if(token.type===12)this.handleCommentNewlineToken(token,level);else if(token.containerType==="CommonTable"&&this.withClauseStyle==="cte-oneline"){this.handleCteOnelineToken(token,level);return}else if(token.containerType==="ParenExpression"&&this.parenthesesOneLine||token.containerType==="BetweenExpression"&&this.betweenOneLine||token.containerType==="Values"&&this.valuesOneLine||token.containerType==="JoinOnClause"&&this.joinOneLine||token.containerType==="CaseExpression"&&this.caseOneLine||token.containerType==="InlineQuery"&&this.subqueryOneLine){this.handleOnelineToken(token,level);return}else this.linePrinter.appendText(token.text);if(token.keywordTokens&&token.keywordTokens.length>0)for(let i=0;i<token.keywordTokens.length;i++){let keywordToken=token.keywordTokens[i];this.appendToken(keywordToken,level,token.containerType,nextCaseContextDepth)}let innerLevel=level;!this.isOnelineMode()&&current.text!==""&&this.indentIncrementContainers.has(token.containerType)&&(this.insideWithClause&&this.withClauseStyle==="full-oneline"||(innerLevel++,this.linePrinter.appendNewline(innerLevel)));for(let i=0;i<token.innerTokens.length;i++){let child=token.innerTokens[i];this.appendToken(child,innerLevel,token.containerType,nextCaseContextDepth)}if(token.containerType==="WithClause"&&this.withClauseStyle==="full-oneline"){this.insideWithClause=!1,this.linePrinter.appendNewline(level);return}innerLevel!==level&&(this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(level))}isCaseContext(containerType){switch(containerType){case"CaseExpression":case"CaseKeyValuePair":case"CaseThenValue":case"CaseElseValue":case"SwitchCaseArgument":return!0;default:return!1}}shouldSkipToken(token){return token.type===12?!1:(!token.innerTokens||token.innerTokens.length===0)&&token.text===""}applyKeywordCase(text){return this.keywordCase==="upper"?text.toUpperCase():this.keywordCase==="lower"?text.toLowerCase():text}handleKeywordToken(token,level,parentContainerType,caseContextDepth=0){if(token.text.toLowerCase()==="and"&&this.andBreak!=="none"){this.handleAndOperatorToken(token,level,parentContainerType,caseContextDepth);return}let text=this.applyKeywordCase(token.text);if(caseContextDepth>0){this.linePrinter.appendText(text);return}this.linePrinter.appendText(text)}handleCommaToken(token,level,parentContainerType){let text=token.text,isWithinWithClause=parentContainerType==="WithClause",isWithinValuesClause=parentContainerType==="Values",effectiveCommaBreak=this.commaBreak;if(isWithinWithClause?effectiveCommaBreak=this.cteCommaBreak:isWithinValuesClause&&(effectiveCommaBreak=this.valuesCommaBreak),this.insideWithClause&&this.withClauseStyle==="full-oneline")this.linePrinter.appendText(text);else if(this.withClauseStyle==="cte-oneline"&&isWithinWithClause)this.linePrinter.appendText(text),this.linePrinter.appendNewline(level);else if(effectiveCommaBreak==="before"){let previousCommaBreak=this.linePrinter.commaBreak;previousCommaBreak!=="before"&&(this.linePrinter.commaBreak="before"),this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(level),this.linePrinter.appendText(text),previousCommaBreak!=="before"&&(this.linePrinter.commaBreak=previousCommaBreak)}else if(effectiveCommaBreak==="after"){let previousCommaBreak=this.linePrinter.commaBreak;previousCommaBreak!=="after"&&(this.linePrinter.commaBreak="after"),this.linePrinter.appendText(text),this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(level),previousCommaBreak!=="after"&&(this.linePrinter.commaBreak=previousCommaBreak)}else if(effectiveCommaBreak==="none"){let previousCommaBreak=this.linePrinter.commaBreak;previousCommaBreak!=="none"&&(this.linePrinter.commaBreak="none"),this.linePrinter.appendText(text),previousCommaBreak!=="none"&&(this.linePrinter.commaBreak=previousCommaBreak)}else this.linePrinter.appendText(text)}handleAndOperatorToken(token,level,parentContainerType,caseContextDepth=0){let text=this.applyKeywordCase(token.text);if(caseContextDepth>0){this.linePrinter.appendText(text);return}this.andBreak==="before"?(this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(level),this.linePrinter.appendText(text)):this.andBreak==="after"?(this.linePrinter.appendText(text),this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(level)):this.linePrinter.appendText(text)}handleJoinClauseToken(token,level){let text=this.applyKeywordCase(token.text);this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.linePrinter.appendNewline(level),this.linePrinter.appendText(text)}handleSpaceToken(token,parentContainerType){if(this.shouldSkipCommentBlockSpace(parentContainerType)){let currentLine=this.linePrinter.getCurrentLine();currentLine.text!==""&&!currentLine.text.endsWith(" ")&&this.linePrinter.appendText(" ");return}this.linePrinter.appendText(token.text)}shouldSkipCommentBlockSpace(parentContainerType){return parentContainerType==="CommentBlock"&&this.insideWithClause&&this.withClauseStyle==="full-oneline"}handleCommentNewlineToken(token,level){this.shouldSkipCommentNewline()||this.isOnelineMode()||this.linePrinter.appendNewline(level)}shouldSkipCommentNewline(){return this.insideWithClause&&this.withClauseStyle==="full-oneline"||this.withClauseStyle==="cte-oneline"}isOnelineMode(){return this.newline===" "}handleCteOnelineToken(token,level){let onelineResult=this.createCteOnelinePrinter().print(token,level),cleanedResult=this.cleanDuplicateSpaces(onelineResult);cleanedResult=cleanedResult.replace(/\(\s+/g,"(").replace(/\s+\)/g," )"),this.linePrinter.appendText(cleanedResult.trim())}createCteOnelinePrinter(){return new _SqlPrinter({indentChar:"",indentSize:0,newline:" ",commaBreak:this.commaBreak,cteCommaBreak:this.cteCommaBreak,valuesCommaBreak:this.valuesCommaBreak,andBreak:this.andBreak,keywordCase:this.keywordCase,exportComment:!1,strictCommentPlacement:this.strictCommentPlacement,withClauseStyle:"standard"})}handleOnelineToken(token,level){let onelineResult=this.createOnelinePrinter().print(token,level),cleanedResult=this.cleanDuplicateSpaces(onelineResult);this.linePrinter.appendText(cleanedResult)}createOnelinePrinter(){return new _SqlPrinter({indentChar:"",indentSize:0,newline:" ",commaBreak:"none",cteCommaBreak:this.cteCommaBreak,valuesCommaBreak:"none",andBreak:"none",keywordCase:this.keywordCase,exportComment:this.exportComment,strictCommentPlacement:this.strictCommentPlacement,withClauseStyle:"standard",parenthesesOneLine:!1,betweenOneLine:!1,valuesOneLine:!1,joinOneLine:!1,caseOneLine:!1,subqueryOneLine:!1})}cleanDuplicateSpaces(text){return text.replace(/\s{2,}/g," ")}};var VALID_PRESETS=["mysql","postgres","sqlserver","sqlite"],SqlFormatter=class{constructor(options={}){let presetConfig=options.preset?PRESETS[options.preset]:void 0;if(options.preset&&!presetConfig)throw new Error(`Invalid preset: ${options.preset}`);let resolvedIdentifierEscape=resolveIdentifierEscapeOption(options.identifierEscape??presetConfig?.identifierEscape),parserOptions={...presetConfig,identifierEscape:resolvedIdentifierEscape??presetConfig?.identifierEscape,parameterSymbol:options.parameterSymbol??presetConfig?.parameterSymbol,parameterStyle:options.parameterStyle??presetConfig?.parameterStyle};this.parser=new SqlPrintTokenParser({...parserOptions,commentStyle:options.commentStyle}),this.printer=new SqlPrinter({...options,parenthesesOneLine:options.parenthesesOneLine,betweenOneLine:options.betweenOneLine,valuesOneLine:options.valuesOneLine,joinOneLine:options.joinOneLine,caseOneLine:options.caseOneLine,subqueryOneLine:options.subqueryOneLine})}format(sql){let{token,params}=this.parser.parse(sql);return{formattedSql:this.printer.print(token),params}}};var Formatter=class{constructor(){this.sqlFormatter=new SqlFormatter({identifierEscape:{start:'"',end:'"'},parameterSymbol:":",parameterStyle:"named"})}format(arg,config=null){return config&&(this.sqlFormatter=new SqlFormatter(config)),this.sqlFormatter.format(arg).formattedSql}formatWithParameters(arg,config=null){config&&(this.sqlFormatter=new SqlFormatter(config));let result=this.sqlFormatter.format(arg);return{sql:result.formattedSql,params:result.params}}visit(arg){return this.format(arg)}};var CTEBuilder=class{constructor(){this.sourceCollector=new TableSourceCollector(!0),this.cteCollector=new CTECollector,this.formatter=new Formatter}build(commonTables){if(commonTables.length===0)return new WithClause(!1,commonTables);let resolvedTables=this.resolveDuplicateNames(commonTables),{tableMap,recursiveCTEs,dependencies}=this.buildDependencyGraph(resolvedTables),sortedTables=this.sortCommonTables(resolvedTables,tableMap,recursiveCTEs,dependencies);return new WithClause(recursiveCTEs.size>0,sortedTables)}resolveDuplicateNames(commonTables){let ctesByName=new Map;for(let table of commonTables){let tableName=table.aliasExpression.table.name;ctesByName.has(tableName)||ctesByName.set(tableName,[]),ctesByName.get(tableName).push(table)}let resolvedTables=[];for(let[name,tables]of Array.from(ctesByName.entries())){if(tables.length===1){resolvedTables.push(tables[0]);continue}let definitions=tables.map(table=>this.formatter.format(table.query));if(new Set(definitions).size===1)resolvedTables.push(tables[0]);else throw new Error(`CTE name conflict detected: '${name}' has multiple different definitions`)}return resolvedTables}buildDependencyGraph(tables){let tableMap=new Map;for(let table of tables)tableMap.set(table.aliasExpression.table.name,table);let recursiveCTEs=new Set,dependencies=new Map,referencedBy=new Map;for(let table of tables){let tableName=table.aliasExpression.table.name,referencedTables=this.sourceCollector.collect(table.query);for(let referencedTable of referencedTables)if(referencedTable.table.name===tableName){recursiveCTEs.add(tableName);break}dependencies.has(tableName)||dependencies.set(tableName,new Set);let referencedCTEs=this.cteCollector.collect(table.query);for(let referencedCTE of referencedCTEs){let referencedName=referencedCTE.aliasExpression.table.name;tableMap.has(referencedName)&&(dependencies.get(tableName).add(referencedName),referencedBy.has(referencedName)||referencedBy.set(referencedName,new Set),referencedBy.get(referencedName).add(tableName))}}return{tableMap,recursiveCTEs,dependencies}}sortCommonTables(tables,tableMap,recursiveCTEs,dependencies){let recursiveResult=[],nonRecursiveResult=[],visited=new Set,visiting=new Set,visit=tableName=>{if(visited.has(tableName))return;if(visiting.has(tableName))throw new Error(`Circular reference detected in CTE: ${tableName}`);visiting.add(tableName);let deps=dependencies.get(tableName)||new Set;for(let dep of Array.from(deps))visit(dep);visiting.delete(tableName),visited.add(tableName),recursiveCTEs.has(tableName)?recursiveResult.push(tableMap.get(tableName)):nonRecursiveResult.push(tableMap.get(tableName))};for(let table of tables){let tableName=table.aliasExpression.table.name;visited.has(tableName)||visit(tableName)}return[...recursiveResult,...nonRecursiveResult]}};var CTEInjector=class{constructor(){this.nameConflictResolver=new CTEBuilder,this.cteCollector=new CTECollector}inject(query,commonTables){if(commonTables.length===0)return query;commonTables.push(...this.cteCollector.collect(query));let resolvedWithCaluse=this.nameConflictResolver.build(commonTables);if(query instanceof SimpleSelectQuery)return this.injectIntoSimpleQuery(query,resolvedWithCaluse);if(query instanceof BinarySelectQuery)return this.injectIntoBinaryQuery(query,resolvedWithCaluse);throw new Error("Unsupported query type")}injectIntoSimpleQuery(query,withClause){if(query.withClause)throw new Error("The query already has a WITH clause. Please remove it before injecting new CTEs.");return query.withClause=withClause,query}injectIntoBinaryQuery(query,withClause){if(query.left instanceof SimpleSelectQuery)return this.injectIntoSimpleQuery(query.left,withClause),query;if(query.left instanceof BinarySelectQuery)return this.injectIntoBinaryQuery(query.left,withClause),query;throw new Error("Unsupported query type for BinarySelectQuery left side")}};var CTENormalizer=class{constructor(){}static normalize(query){let allCommonTables=new CTECollector().collect(query);return allCommonTables.length===0?query:(new CTEDisabler().execute(query),new CTEInjector().inject(query,allCommonTables))}};var DuplicateDetectionMode=(DuplicateDetectionMode2=>(DuplicateDetectionMode2.ColumnNameOnly="columnNameOnly",DuplicateDetectionMode2.FullName="fullName",DuplicateDetectionMode2))(DuplicateDetectionMode||{}),SelectableColumnCollector=class _SelectableColumnCollector{constructor(tableColumnResolver,includeWildCard=!1,duplicateDetection="columnNameOnly",options){this.selectValues=[];this.visitedNodes=new Set;this.uniqueKeys=new Set;this.isRootVisit=!0;this.tableColumnResolver=null;this.commonTables=[];this.initializeProperties(tableColumnResolver,includeWildCard,duplicateDetection,options),this.initializeHandlers()}initializeProperties(tableColumnResolver,includeWildCard,duplicateDetection,options){this.tableColumnResolver=tableColumnResolver??null,this.includeWildCard=includeWildCard,this.commonTableCollector=new CTECollector,this.commonTables=[],this.duplicateDetection=duplicateDetection,this.options=options||{}}initializeHandlers(){this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr)),this.initializeClauseHandlers(),this.initializeValueComponentHandlers()}initializeClauseHandlers(){this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr)),this.handlers.set(WhereClause.kind,expr=>this.visitWhereClause(expr)),this.handlers.set(GroupByClause.kind,expr=>this.visitGroupByClause(expr)),this.handlers.set(HavingClause.kind,expr=>this.visitHavingClause(expr)),this.handlers.set(OrderByClause.kind,expr=>this.visitOrderByClause(expr)),this.handlers.set(WindowFrameClause.kind,expr=>this.visitWindowFrameClause(expr)),this.handlers.set(LimitClause.kind,expr=>this.visitLimitClause(expr)),this.handlers.set(OffsetClause.kind,expr=>this.offsetClause(expr)),this.handlers.set(FetchClause.kind,expr=>this.visitFetchClause(expr)),this.handlers.set(JoinOnClause.kind,expr=>this.visitJoinOnClause(expr)),this.handlers.set(JoinUsingClause.kind,expr=>this.visitJoinUsingClause(expr))}initializeValueComponentHandlers(){this.handlers.set(ColumnReference.kind,expr=>this.visitColumnReference(expr)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(FunctionCall.kind,expr=>this.visitFunctionCall(expr)),this.handlers.set(InlineQuery.kind,expr=>this.visitInlineQuery(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(ArraySliceExpression.kind,expr=>this.visitArraySliceExpression(expr)),this.handlers.set(ArrayIndexExpression.kind,expr=>this.visitArrayIndexExpression(expr)),this.handlers.set(ValueList.kind,expr=>this.visitValueList(expr)),this.handlers.set(WindowFrameExpression.kind,expr=>this.visitWindowFrameExpression(expr)),this.handlers.set(PartitionByClause.kind,expr=>this.visitPartitionByClause(expr))}getValues(){return this.selectValues}collect(arg){if(!arg)throw new Error("Input argument cannot be null or undefined");this.visit(arg);let items=this.getValues();return this.reset(),items}reset(){this.selectValues=[],this.visitedNodes.clear(),this.uniqueKeys.clear(),this.commonTables=[]}addSelectValueAsUnique(name,value){let key=this.generateUniqueKey(name,value);this.uniqueKeys.has(key)||(this.uniqueKeys.add(key),this.selectValues.push({name,value}))}generateUniqueKey(name,value){if(this.duplicateDetection==="columnNameOnly")return this.normalizeColumnName(name);{let tableName="";value&&typeof value.getNamespace=="function"&&(tableName=value.getNamespace()||"");let fullName=tableName?tableName+"."+name:name;return this.normalizeColumnName(fullName)}}normalizeColumnName(name){if(typeof name!="string")throw new Error("Column name must be a string");return this.options.ignoreCaseAndUnderscore?name.toLowerCase().replace(/_/g,""):name}visit(arg){if(!this.isRootVisit){this.visitNode(arg);return}if(!(arg instanceof SimpleSelectQuery||arg instanceof BinarySelectQuery))throw new Error("Root visit requires a SimpleSelectQuery or BinarySelectQuery.");this.reset(),this.isRootVisit=!1,this.commonTables=this.commonTableCollector.collect(arg);try{this.visitNode(arg)}finally{this.isRootVisit=!0}}visitNode(arg){if(!this.visitedNodes.has(arg)){this.visitedNodes.add(arg);try{let handler=this.handlers.get(arg.getKind());handler&&handler(arg)}catch(error){let errorMessage=error instanceof Error?error.message:String(error);throw new Error(`Error processing SQL component of type ${arg.getKind().toString()}: ${errorMessage}`)}}}visitSimpleSelectQuery(query){if(query.selectClause&&query.selectClause.accept(this),query.fromClause&&query.fromClause.accept(this),query.whereClause&&query.whereClause.accept(this),query.groupByClause&&query.groupByClause.accept(this),query.havingClause&&query.havingClause.accept(this),query.windowClause)for(let win of query.windowClause.windows)win.accept(this);query.orderByClause&&query.orderByClause.accept(this),query.limitClause&&query.limitClause.accept(this),query.offsetClause&&query.offsetClause.accept(this),query.fetchClause&&query.fetchClause.accept(this),query.forClause&&query.forClause.accept(this)}visitBinarySelectQuery(query){query.left instanceof SimpleSelectQuery?this.visitSimpleSelectQuery(query.left):query.left instanceof BinarySelectQuery&&this.visitBinarySelectQuery(query.left),query.right instanceof SimpleSelectQuery?this.visitSimpleSelectQuery(query.right):query.right instanceof BinarySelectQuery&&this.visitBinarySelectQuery(query.right)}visitSelectClause(clause){for(let item of clause.items)if(item.identifier)this.addSelectValueAsUnique(item.identifier.name,item.value);else if(item.value instanceof ColumnReference){let columnName=item.value.column.name;columnName!=="*"?this.addSelectValueAsUnique(columnName,item.value):this.includeWildCard&&this.addSelectValueAsUnique(columnName,item.value)}else item.value.accept(this)}visitFromClause(clause){let sourceValues=new SelectValueCollector(this.tableColumnResolver,this.commonTables).collect(clause);for(let item of sourceValues)this.addSelectValueAsUnique(item.name,item.value);if(this.options.upstream&&this.collectUpstreamColumns(clause),clause.joins)for(let join of clause.joins)join.condition&&join.condition.accept(this)}visitWhereClause(clause){clause.condition&&clause.condition.accept(this)}visitGroupByClause(clause){if(clause.grouping)for(let item of clause.grouping)item.accept(this)}visitHavingClause(clause){clause.condition&&clause.condition.accept(this)}visitOrderByClause(clause){if(clause.order)for(let item of clause.order)item.accept(this)}visitWindowFrameClause(clause){clause.expression.accept(this)}visitWindowFrameExpression(expr){expr.partition&&expr.partition.accept(this),expr.order&&expr.order.accept(this),expr.frameSpec&&expr.frameSpec.accept(this)}visitLimitClause(clause){clause.value&&clause.value.accept(this)}offsetClause(clause){clause.value&&clause.value.accept(this)}visitFetchClause(clause){clause.expression&&clause.expression.accept(this)}visitJoinOnClause(joinOnClause){joinOnClause.condition&&joinOnClause.condition.accept(this)}visitJoinUsingClause(joinUsingClause){joinUsingClause.condition&&joinUsingClause.condition.accept(this)}visitColumnReference(columnRef){if(columnRef.column.name!=="*")this.addSelectValueAsUnique(columnRef.column.name,columnRef);else if(this.includeWildCard)this.addSelectValueAsUnique(columnRef.column.name,columnRef);else return}visitBinaryExpression(expr){expr.left&&expr.left.accept(this),expr.right&&expr.right.accept(this)}visitUnaryExpression(expr){expr.expression&&expr.expression.accept(this)}visitFunctionCall(func){func.argument&&func.argument.accept(this),func.over&&func.over.accept(this),func.withinGroup&&func.withinGroup.accept(this),func.internalOrderBy&&func.internalOrderBy.accept(this)}visitInlineQuery(inlineQuery){inlineQuery.selectQuery&&this.visitNode(inlineQuery.selectQuery)}visitParenExpression(expr){expr.expression&&expr.expression.accept(this)}visitCaseExpression(expr){expr.condition&&expr.condition.accept(this),expr.switchCase&&expr.switchCase.accept(this)}visitCastExpression(expr){expr.input&&expr.input.accept(this)}visitBetweenExpression(expr){expr.expression&&expr.expression.accept(this),expr.lower&&expr.lower.accept(this),expr.upper&&expr.upper.accept(this)}visitArrayExpression(expr){expr.expression&&expr.expression.accept(this)}visitArrayQueryExpression(expr){expr.query.accept(this)}visitArraySliceExpression(expr){expr.array&&expr.array.accept(this),expr.startIndex&&expr.startIndex.accept(this),expr.endIndex&&expr.endIndex.accept(this)}visitArrayIndexExpression(expr){expr.array&&expr.array.accept(this),expr.index&&expr.index.accept(this)}visitValueList(expr){if(expr.values&&Array.isArray(expr.values))for(let value of expr.values)value&&value.accept(this)}visitPartitionByClause(clause){clause.value.accept(this)}collectUpstreamColumns(clause){if(this.collectAllAvailableCTEColumns(),this.collectUpstreamColumnsFromSource(clause.source),clause.joins)for(let join of clause.joins)this.collectUpstreamColumnsFromSource(join.source)}collectUpstreamColumnsFromSource(source){if(source.datasource instanceof TableSource){let cteTable=this.findCTEByName(source.datasource.table.name);cteTable?this.collectUpstreamColumnsFromCTE(cteTable):this.collectUpstreamColumnsFromTable(source.datasource)}else source.datasource instanceof SubQuerySource?this.collectUpstreamColumnsFromSubquery(source.datasource):source.datasource instanceof ParenSource&&this.collectUpstreamColumnsFromSource(new SourceExpression(source.datasource.source,null))}collectUpstreamColumnsFromTable(tableSource){if(this.tableColumnResolver){let tableName=tableSource.table.name,columns=this.tableColumnResolver(tableName);for(let columnName of columns){let columnRef=new ColumnReference(tableSource.table.name,columnName);this.addSelectValueAsUnique(columnName,columnRef)}}}collectUpstreamColumnsFromSubquery(subquerySource){if(subquerySource.query instanceof SimpleSelectQuery){let subqueryColumns=new _SelectableColumnCollector(this.tableColumnResolver,this.includeWildCard,this.duplicateDetection,{...this.options,upstream:!0}).collect(subquerySource.query);for(let item of subqueryColumns)this.addSelectValueAsUnique(item.name,item.value)}}collectUpstreamColumnsFromCTE(cteTable){if(cteTable.query instanceof SimpleSelectQuery){let cteColumns=new _SelectableColumnCollector(this.tableColumnResolver,this.includeWildCard,this.duplicateDetection,{...this.options,upstream:!1}).collect(cteTable.query);for(let item of cteColumns)item.name!=="*"&&this.addSelectValueAsUnique(item.name,item.value)}}collectAllAvailableCTEColumns(){for(let cte of this.commonTables)this.collectUpstreamColumnsFromCTE(cte)}findCTEByName(name){return this.commonTables.find(cte=>cte.getSourceAliasName()===name)||null}};var SourceParser=class _SourceParser{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The source component is complete but there are additional tokens.`);return result.value}static parseTableSourceFromLexemes(lexemes,index){let fullNameResult=FullNameParser.parseFromLexeme(lexemes,index);return this.parseTableSource(fullNameResult)}static parseFromLexeme(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].type&4)return this.parseParenSource(lexemes,idx);let fullNameResult=FullNameParser.parseFromLexeme(lexemes,idx);return fullNameResult.lastTokenType&2048?_SourceParser.parseFunctionSource(lexemes,fullNameResult):_SourceParser.parseTableSource(fullNameResult)}static parseTableSource(fullNameResult){let{namespaces,name,newIndex}=fullNameResult,value=new TableSource(namespaces,name.name);return name.positionedComments&&name.positionedComments.length>0?value.positionedComments=name.positionedComments:name.comments&&name.comments.length>0&&(value.comments=name.comments),{value,newIndex}}static parseFunctionSource(lexemes,fullNameResult){let idx=fullNameResult.newIndex,{namespaces,name}=fullNameResult,argument=ValueParser.parseArgument(4,8,lexemes,idx);idx=argument.newIndex;let functionName=name.name;return{value:new FunctionSource({namespaces,name:functionName},argument.value),newIndex:idx}}static parseParenSource(lexemes,index){let idx=index,openParenToken=lexemes[idx];if(idx++,idx>=lexemes.length)throw new Error(`Syntax error: Unexpected end of input at position ${idx}. Expected a subquery or nested expression after opening parenthesis.`);let keyword=lexemes[idx].value;if(keyword==="select"||keyword==="values"||keyword==="with"){let result=this.parseSubQuerySource(lexemes,idx,openParenToken);if(idx=result.newIndex,idx<lexemes.length&&lexemes[idx].type==8)idx++;else throw new Error(`Syntax error at position ${idx}: Missing closing parenthesis. Each opening parenthesis must have a matching closing parenthesis.`);return{value:result.value,newIndex:idx}}else if(lexemes[idx].type==4){let result=this.parseParenSource(lexemes,idx);if(idx=result.newIndex,idx<lexemes.length&&lexemes[idx].type==8)idx++;else throw new Error(`Syntax error at position ${idx}: Missing closing parenthesis. Each opening parenthesis must have a matching closing parenthesis.`);return{value:result.value,newIndex:idx}}throw new Error(`Syntax error at position ${idx}: Expected 'SELECT' keyword, 'VALUES' keyword, or opening parenthesis '(' but found "${lexemes[idx].value}".`)}static parseSubQuerySource(lexemes,index,openParenToken){let idx=index,{value:selectQuery,newIndex}=SelectQueryParser.parseFromLexeme(lexemes,idx);if(idx=newIndex,openParenToken&&openParenToken.positionedComments&&openParenToken.positionedComments.length>0){let afterComments=openParenToken.positionedComments.filter(pc=>pc.position==="after");if(afterComments.length>0){let beforeComments=afterComments.map(pc=>({position:"before",comments:pc.comments}));selectQuery.positionedComments?selectQuery.positionedComments=[...beforeComments,...selectQuery.positionedComments]:selectQuery.positionedComments=beforeComments,selectQuery.comments&&(selectQuery.comments=null)}}return{value:new SubQuerySource(selectQuery),newIndex:idx}}};var DuplicateCTEError=class extends Error{constructor(cteName){super(`CTE '${cteName}' already exists in the query`);this.cteName=cteName;this.name="DuplicateCTEError"}},InvalidCTENameError=class extends Error{constructor(cteName,reason){super(`Invalid CTE name '${cteName}': ${reason}`);this.cteName=cteName;this.name="InvalidCTENameError"}},CTENotFoundError=class extends Error{constructor(cteName){super(`CTE '${cteName}' not found in the query`);this.cteName=cteName;this.name="CTENotFoundError"}};var UpstreamSelectQueryFinder=class{constructor(tableColumnResolver,options){this.options=options||{},this.tableColumnResolver=tableColumnResolver,this.columnCollector=new SelectableColumnCollector(this.tableColumnResolver,!1,"fullName",{upstream:!0})}find(query,columnNames){let namesArray=typeof columnNames=="string"?[columnNames]:columnNames,ctes=new CTECollector().collect(query),cteMap=new Map;for(let cte of ctes)cteMap.set(cte.getSourceAliasName(),cte);return this.findUpstream(query,namesArray,cteMap)}handleTableSource(src,columnNames,cteMap){let cte=cteMap.get(src.table.name);if(cte){let nextCteMap=new Map(cteMap);nextCteMap.delete(src.table.name);let result=this.findUpstream(cte.query,columnNames,nextCteMap);return result.length===0?null:result}return null}handleSubQuerySource(src,columnNames,cteMap){let result=this.findUpstream(src.query,columnNames,cteMap);return result.length===0?null:result}processFromClauseBranches(fromClause,columnNames,cteMap){let sources=fromClause.getSources();if(sources.length===0)return null;let allBranchResults=[],allBranchesOk=!0,validBranchCount=0;for(let sourceExpr of sources){let src=sourceExpr.datasource,branchResult=null;if(src instanceof TableSource)branchResult=this.handleTableSource(src,columnNames,cteMap),validBranchCount++;else if(src instanceof SubQuerySource)branchResult=this.handleSubQuerySource(src,columnNames,cteMap),validBranchCount++;else{if(src instanceof ValuesQuery)continue;allBranchesOk=!1;break}if(branchResult===null){allBranchesOk=!1;break}allBranchResults.push(branchResult)}return allBranchesOk&&allBranchResults.length===validBranchCount?allBranchResults.flat():null}findUpstream(query,columnNames,cteMap){if(query instanceof SimpleSelectQuery){let fromClause=query.fromClause;if(fromClause){let branchResult=this.processFromClauseBranches(fromClause,columnNames,cteMap);if(branchResult&&branchResult.length>0)return branchResult}let columns=this.columnCollector.collect(query).map(col=>col.name),cteColumns=this.collectCTEColumns(query,cteMap),allColumns=[...columns,...cteColumns],normalize=s=>this.options.ignoreCaseAndUnderscore?s.toLowerCase().replace(/_/g,""):s;return columnNames.every(name=>allColumns.some(col=>normalize(col)===normalize(name)))?[query]:[]}else if(query instanceof BinarySelectQuery){let left=this.findUpstream(query.left,columnNames,cteMap),right=this.findUpstream(query.right,columnNames,cteMap);return[...left,...right]}return[]}collectCTEColumns(query,cteMap){let cteColumns=[];if(query.withClause)for(let cte of query.withClause.tables){let columns=this.collectColumnsFromSelectQuery(cte.query);cteColumns.push(...columns)}return cteColumns}collectColumnsFromSelectQuery(query){if(query instanceof SimpleSelectQuery)try{return this.columnCollector.collect(query).map(col=>col.name)}catch(error){return console.warn("Failed to collect columns from SimpleSelectQuery:",error),[]}else if(query instanceof BinarySelectQuery)return this.collectColumnsFromSelectQuery(query.left);return[]}};var SourceAliasExpressionParser=class{static parseFromLexeme(lexemes,index){let idx=index;if(idx<lexemes.length&&(lexemes[idx].type&64||lexemes[idx].type&2048)){let aliasToken=lexemes[idx],table=aliasToken.value;if(idx++,idx<lexemes.length&&lexemes[idx].type&4){let columns=[];for(idx++;idx<lexemes.length&&lexemes[idx].type&64&&(columns.push(lexemes[idx].value),idx++,idx<lexemes.length&&lexemes[idx].type&16);)idx++;if(lexemes[idx].type&8)idx++;else throw new Error(`Syntax error at position ${idx}: Missing closing parenthesis ')' for column alias list. Each opening parenthesis must have a matching closing parenthesis.`);if(columns.length===0)throw new Error(`Syntax error at position ${index}: No column aliases found. Column alias declarations must contain at least one column name.`);let sourceAlias2=new SourceAliasExpression(table,columns);return aliasToken.positionedComments&&aliasToken.positionedComments.length>0&&(sourceAlias2.positionedComments=aliasToken.positionedComments),{value:sourceAlias2,newIndex:idx}}let sourceAlias=new SourceAliasExpression(table,null);return aliasToken.positionedComments&&aliasToken.positionedComments.length>0&&(sourceAlias.positionedComments=aliasToken.positionedComments),{value:sourceAlias,newIndex:idx}}throw new Error(`Syntax error at position ${index}: Expected an identifier for table alias but found "${lexemes[index]?.value||"end of input"}".`)}};var SourceExpressionParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The source expression is complete but there are additional tokens.`);return result.value}static parseTableSourceFromLexemes(lexemes,index){let result=SourceParser.parseTableSourceFromLexemes(lexemes,index);return{value:new SourceExpression(result.value,null),newIndex:result.newIndex}}static parseFromLexeme(lexemes,index){let idx=index,sourceResult=SourceParser.parseFromLexeme(lexemes,idx);if(idx=sourceResult.newIndex,idx<lexemes.length){if(lexemes[idx].value==="as"){idx++;let aliasResult=SourceAliasExpressionParser.parseFromLexeme(lexemes,idx);return idx=aliasResult.newIndex,{value:new SourceExpression(sourceResult.value,aliasResult.value),newIndex:idx}}if(idx<lexemes.length&&this.isTokenTypeAliasCandidate(lexemes[idx].type)){let aliasResult=SourceAliasExpressionParser.parseFromLexeme(lexemes,idx);return idx=aliasResult.newIndex,{value:new SourceExpression(sourceResult.value,aliasResult.value),newIndex:idx}}}return{value:new SourceExpression(sourceResult.value,null),newIndex:idx}}static isTokenTypeAliasCandidate(type){return(type&64)!==0||(type&2048)!==0}};var QueryBuilder=class _QueryBuilder{static buildBinaryQuery(queries,operator){if(!queries||queries.length===0)throw new Error("No queries provided to combine.");if(queries.length===1)throw new Error("At least two queries are required to create a BinarySelectQuery.");let wrap=q=>q instanceof ValuesQuery?_QueryBuilder.buildSimpleQuery(q):q,result=new BinarySelectQuery(wrap(queries[0]),operator,wrap(queries[1]));CTENormalizer.normalize(result);for(let i=2;i<queries.length;i++)result.appendSelectQuery(operator,wrap(queries[i]));return result}constructor(){}static buildSimpleQuery(query){if(query instanceof SimpleSelectQuery)return query;if(query instanceof BinarySelectQuery)return _QueryBuilder.buildSimpleBinaryQuery(query);if(query instanceof ValuesQuery)return _QueryBuilder.buildSimpleValuesQuery(query);throw new Error("Unsupported query type for buildSimpleQuery")}static buildSimpleBinaryQuery(query){let extractedOrderBy=_QueryBuilder.extractAndRemoveOrderByFromBinaryQuery(query),subQuerySource=new SubQuerySource(query),sourceExpr=new SourceExpression(subQuerySource,new SourceAliasExpression("bq",null)),fromClause=new FromClause(sourceExpr,null),selectClause=_QueryBuilder.createSelectAllClause(),q=new SimpleSelectQuery({selectClause,fromClause,orderByClause:extractedOrderBy});return CTENormalizer.normalize(q)}static extractAndRemoveOrderByFromBinaryQuery(query){return _QueryBuilder.findAndRemoveRightmostOrderBy(query)}static findAndRemoveRightmostOrderBy(query){if(query instanceof BinarySelectQuery){let rightOrderBy=_QueryBuilder.findAndRemoveRightmostOrderBy(query.right);return rightOrderBy||_QueryBuilder.findAndRemoveRightmostOrderBy(query.left)}else if(query instanceof SimpleSelectQuery){let orderBy=query.orderByClause;if(orderBy)return query.orderByClause=null,orderBy}return null}static buildSimpleValuesQuery(query){let columnCount=query.tuples.length>0?query.tuples[0].values.length:0;if(query.tuples.length===0)throw new Error("Empty VALUES clause cannot be converted to a SimpleSelectQuery");if(!query.columnAliases)throw new Error("Column aliases are required to convert a VALUES clause to SimpleSelectQuery. Please specify column aliases.");if(query.columnAliases.length!==columnCount)throw new Error(`The number of column aliases (${query.columnAliases.length}) does not match the number of columns in the first tuple (${columnCount}).`);let subQuerySource=new SubQuerySource(query),sourceExpr=new SourceExpression(subQuerySource,new SourceAliasExpression("vq",query.columnAliases)),fromClause=new FromClause(sourceExpr,null),selectItems=query.columnAliases.map(name=>new SelectItem(new ColumnReference("vq",name),name)),selectClause=new SelectClause(selectItems,null);return new SimpleSelectQuery({selectClause,fromClause})}static createSelectAllClause(){let columnRef=new ColumnReference(null,"*"),selectItem=new SelectItem(columnRef,"*");return new SelectClause([selectItem],null)}static buildCreateTableQuery(query,tableName,isTemporary=!1){return new CreateTableQuery({tableName,isTemporary,asSelectQuery:query})}static buildInsertQuery(selectQuery,tableName){let cols,count=selectQuery.selectClause.items.length;if(cols=new SelectValueCollector().collect(selectQuery).map(item=>item.name),!cols.length||count!==cols.length)throw new Error(`Columns cannot be inferred from the selectQuery. Make sure you are not using wildcards or unnamed columns.
22
+ Select clause column count: ${count}, Columns with valid names: ${cols.length}
23
+ Detected column names: [${cols.join(", ")}]`);let sourceExpr=SourceExpressionParser.parse(tableName);return new InsertQuery({insertClause:new InsertClause(sourceExpr,cols),selectQuery})}static buildUpdateQuery(selectQuery,selectSourceName,updateTableExprRaw,primaryKeys){let updateClause=new UpdateClause(SourceExpressionParser.parse(updateTableExprRaw)),pkArray=Array.isArray(primaryKeys)?primaryKeys:[primaryKeys],selectItems=new SelectValueCollector().collect(selectQuery),collectedCTEs=new CTECollector().collect(selectQuery);new CTEDisabler().execute(selectQuery);for(let pk of pkArray)if(!selectItems.some(item=>item.name===pk))throw new Error(`Primary key column '${pk}' is not present in selectQuery select list.`);let updateSourceName=updateClause.getSourceAliasName();if(!updateSourceName)throw new Error("Source expression does not have an alias. Please provide an alias for the source expression.");let setItems=selectItems.filter(item=>!pkArray.includes(item.name)).map(col=>new SetClauseItem(col.name,new ColumnReference(updateSourceName,col.name))),setClause=new SetClause(setItems),from=new FromClause(selectQuery.toSource(selectSourceName),null),where=null;for(let pk of pkArray){let cond=new BinaryExpression(new ColumnReference(updateSourceName,pk),"=",new ColumnReference(selectSourceName,pk));where=where?new BinaryExpression(where,"and",cond):cond}let whereClause=new WhereClause(where);return new UpdateQuery({updateClause,setClause,fromClause:from,whereClause,withClause:collectedCTEs.length>0?new WithClause(!1,collectedCTEs):void 0})}};var ParameterHelper=class{static set(query,name,value){let params=ParameterCollector.collect(query),found=!1;for(let p of params)p.name.value===name&&(p.value=value,found=!0);if(!found)throw new Error(`Parameter '${name}' not found in query.`)}};var SimpleSelectQuery=class extends SqlComponent{constructor(params){super();this.__selectQueryType="SelectQuery";this.headerComments=null;this.cteNameCache=new Set;this.withClause=params.withClause??null,this.selectClause=params.selectClause,this.fromClause=params.fromClause??null,this.whereClause=params.whereClause??null,this.groupByClause=params.groupByClause??null,this.havingClause=params.havingClause??null,this.orderByClause=params.orderByClause??null,this.windowClause=params.windowClause??null,this.limitClause=params.limitClause??null,this.offsetClause=params.offsetClause??null,this.fetchClause=params.fetchClause??null,this.forClause=params.forClause??null,this.initializeCTECache()}static{this.kind=Symbol("SelectQuery")}initializeCTECache(){if(this.cteNameCache.clear(),this.withClause?.tables)for(let table of this.withClause.tables)this.cteNameCache.add(table.aliasExpression.table.name)}toUnion(rightQuery){return this.toBinaryQuery("union",rightQuery)}toUnionAll(rightQuery){return this.toBinaryQuery("union all",rightQuery)}toIntersect(rightQuery){return this.toBinaryQuery("intersect",rightQuery)}toIntersectAll(rightQuery){return this.toBinaryQuery("intersect all",rightQuery)}toExcept(rightQuery){return this.toBinaryQuery("except",rightQuery)}toExceptAll(rightQuery){return this.toBinaryQuery("except all",rightQuery)}toBinaryQuery(operator,rightQuery){return QueryBuilder.buildBinaryQuery([this,rightQuery],operator)}appendWhereRaw(rawCondition){let parsedCondition=ValueParser.parse(rawCondition);this.appendWhere(parsedCondition)}appendWhere(condition){this.whereClause?this.whereClause.condition=new BinaryExpression(this.whereClause.condition,"and",condition):this.whereClause=new WhereClause(condition)}appendHavingRaw(rawCondition){let parsedCondition=ValueParser.parse(rawCondition);this.appendHaving(parsedCondition)}appendHaving(condition){this.havingClause?this.havingClause.condition=new BinaryExpression(this.havingClause.condition,"and",condition):this.havingClause=new HavingClause(condition)}innerJoinRaw(joinSourceRawText,alias,columns,resolver=null){this.joinSourceRaw("inner join",joinSourceRawText,alias,columns,resolver)}leftJoinRaw(joinSourceRawText,alias,columns,resolver=null){this.joinSourceRaw("left join",joinSourceRawText,alias,columns,resolver)}rightJoinRaw(joinSourceRawText,alias,columns,resolver=null){this.joinSourceRaw("right join",joinSourceRawText,alias,columns,resolver)}innerJoin(sourceExpr,columns,resolver=null){this.joinSource("inner join",sourceExpr,columns,resolver)}leftJoin(sourceExpr,columns,resolver=null){this.joinSource("left join",sourceExpr,columns,resolver)}rightJoin(sourceExpr,columns,resolver=null){this.joinSource("right join",sourceExpr,columns,resolver)}joinSourceRaw(joinType,joinSourceRawText,alias,columns,resolver=null){let tableSource=SourceParser.parse(joinSourceRawText),sourceExpr=new SourceExpression(tableSource,new SourceAliasExpression(alias,null));this.joinSource(joinType,sourceExpr,columns,resolver)}joinSource(joinType,sourceExpr,columns,resolver=null){if(!this.fromClause)throw new Error("A FROM clause is required to add a JOIN condition.");let columnsArr=Array.isArray(columns)?columns:[columns],valueSets=new SelectableColumnCollector(resolver).collect(this),joinCondition=null,count=0,sourceAlias=sourceExpr.getAliasName();if(!sourceAlias)throw new Error("An alias is required for the source expression to add a JOIN condition.");for(let valueSet of valueSets)if(columnsArr.some(col=>col==valueSet.name)){let expr=new BinaryExpression(valueSet.value,"=",new ColumnReference([sourceAlias],valueSet.name));joinCondition?joinCondition=new BinaryExpression(joinCondition,"and",expr):joinCondition=expr,count++}if(!joinCondition||count!==columnsArr.length)throw new Error(`Invalid JOIN condition. The specified columns were not found: ${columnsArr.join(", ")}`);let joinOnClause=new JoinOnClause(joinCondition),joinClause=new JoinClause(joinType,sourceExpr,joinOnClause,!1);this.fromClause&&(this.fromClause.joins?this.fromClause.joins.push(joinClause):this.fromClause.joins=[joinClause]),CTENormalizer.normalize(this)}toSource(alias){if(!alias||alias.trim()==="")throw new Error("Alias is required for toSource(). Please specify a non-empty alias name.");return new SourceExpression(new SubQuerySource(this),new SourceAliasExpression(alias,null))}appendWith(commonTable){let tables=Array.isArray(commonTable)?commonTable:[commonTable];this.withClause?this.withClause.tables.push(...tables):this.withClause=new WithClause(!1,tables),CTENormalizer.normalize(this)}appendWithRaw(rawText,alias){let query=SelectQueryParser.parse(rawText),commonTable=new CommonTable(query,alias,null);this.appendWith(commonTable)}overrideSelectItemExpr(columnName,fn){let items=this.selectClause.items.filter(item2=>item2.identifier?.name===columnName);if(items.length===0)throw new Error(`Column ${columnName} not found in the query`);if(items.length>1)throw new Error(`Duplicate column name ${columnName} found in the query`);let item=items[0],exprSql=new Formatter().visit(item.value),newValue=fn(exprSql);item.value=ValueParser.parse(newValue)}appendWhereExpr(columnName,exprBuilder,options){if(options&&options.upstream){let queries=new UpstreamSelectQueryFinder().find(this,[columnName]),collector=new SelectableColumnCollector,formatter=new Formatter;for(let q of queries){let exprs=collector.collect(q).filter(item=>item.name===columnName).map(item=>item.value);if(exprs.length!==1)throw new Error(`Expected exactly one expression for column '${columnName}'`);let exprStr=formatter.format(exprs[0]);q.appendWhereRaw(exprBuilder(exprStr))}}else{let collector=new SelectableColumnCollector,formatter=new Formatter,exprs=collector.collect(this).filter(item=>item.name===columnName).map(item=>item.value);if(exprs.length!==1)throw new Error(`Expected exactly one expression for column '${columnName}'`);let exprStr=formatter.format(exprs[0]);this.appendWhereRaw(exprBuilder(exprStr))}}setParameter(name,value){return ParameterHelper.set(this,name,value),this}toSimpleQuery(){return this}addCTE(name,query,options){if(!name||name.trim()==="")throw new InvalidCTENameError(name,"name cannot be empty or whitespace-only");if(this.hasCTE(name))throw new DuplicateCTEError(name);let materialized=options?.materialized??null,commonTable=new CommonTable(query,name,materialized);return this.appendWith(commonTable),this.cteNameCache.add(name),this}removeCTE(name){if(!this.hasCTE(name))throw new CTENotFoundError(name);return this.withClause&&(this.withClause.tables=this.withClause.tables.filter(table=>table.aliasExpression.table.name!==name),this.withClause.tables.length===0&&(this.withClause=null)),this.cteNameCache.delete(name),this}hasCTE(name){return this.cteNameCache.has(name)}getCTENames(){return this.withClause?.tables.map(table=>table.aliasExpression.table.name)??[]}replaceCTE(name,query,options){if(!name||name.trim()==="")throw new InvalidCTENameError(name,"name cannot be empty or whitespace-only");this.hasCTE(name)&&this.removeCTE(name);let materialized=options?.materialized??null,commonTable=new CommonTable(query,name,materialized);return this.appendWith(commonTable),this.cteNameCache.add(name),this}};var BinarySelectQuery=class _BinarySelectQuery extends SqlComponent{constructor(left,operator,right){super();this.__selectQueryType="SelectQuery";this.headerComments=null;this.left=left,this.operator=new RawString(operator),this.right=right}static{this.kind=Symbol("BinarySelectQuery")}union(query){return this.appendSelectQuery("union",query)}unionAll(query){return this.appendSelectQuery("union all",query)}intersect(query){return this.appendSelectQuery("intersect",query)}intersectAll(query){return this.appendSelectQuery("intersect all",query)}except(query){return this.appendSelectQuery("except",query)}exceptAll(query){return this.appendSelectQuery("except all",query)}appendSelectQuery(operator,query){return this.left=new _BinarySelectQuery(this.left,this.operator.value,this.right),this.operator=new RawString(operator),this.right=query,CTENormalizer.normalize(this),this}unionRaw(sql){let parsedQuery=SelectQueryParser.parse(sql);return this.union(parsedQuery)}unionAllRaw(sql){let parsedQuery=SelectQueryParser.parse(sql);return this.unionAll(parsedQuery)}intersectRaw(sql){let parsedQuery=SelectQueryParser.parse(sql);return this.intersect(parsedQuery)}intersectAllRaw(sql){let parsedQuery=SelectQueryParser.parse(sql);return this.intersectAll(parsedQuery)}exceptRaw(sql){let parsedQuery=SelectQueryParser.parse(sql);return this.except(parsedQuery)}exceptAllRaw(sql){let parsedQuery=SelectQueryParser.parse(sql);return this.exceptAll(parsedQuery)}toSource(alias="subq"){return new SourceExpression(new SubQuerySource(this),new SourceAliasExpression(alias,null))}setParameter(name,value){return ParameterHelper.set(this,name,value),this}toSimpleQuery(){return QueryBuilder.buildSimpleQuery(this)}};var ValuesQuery=class extends SqlComponent{constructor(tuples,columnAliases=null){super();this.__selectQueryType="SelectQuery";this.headerComments=null;this.tuples=tuples,this.columnAliases=columnAliases}static{this.kind=Symbol("ValuesQuery")}toSimpleQuery(){return QueryBuilder.buildSimpleQuery(this)}setParameter(name,value){return ParameterHelper.set(this,name,value),this}};var SelectClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The SELECT clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index,distinct=null,selectTokenComments=idx<lexemes.length?lexemes[idx].comments:null;if(lexemes[idx].value!=="select")throw new Error(`Syntax error at position ${idx}: Expected 'SELECT' keyword but found "${lexemes[idx].value}". SELECT clauses must start with the SELECT keyword.`);idx++;let hints=[];for(;idx<lexemes.length&&HintClause.isHintClause(lexemes[idx].value);){let hintContent=HintClause.extractHintContent(lexemes[idx].value);hints.push(new HintClause(hintContent)),idx++}if(idx<lexemes.length&&lexemes[idx].value==="distinct")idx++,distinct=new Distinct;else if(idx<lexemes.length&&lexemes[idx].value==="distinct on"){idx++;let argument=ValueParser.parseArgument(4,8,lexemes,idx);distinct=new DistinctOn(argument.value),idx=argument.newIndex}let items=[],item=SelectItemParser.parseItem(lexemes,idx);for(items.push(item.value),idx=item.newIndex;idx<lexemes.length&&lexemes[idx].type&16;){idx++;let item2=SelectItemParser.parseItem(lexemes,idx);items.push(item2.value),idx=item2.newIndex}if(items.length===0)throw new Error(`Syntax error at position ${index}: No select items found. The SELECT clause requires at least one expression to select.`);return{value:new SelectClause(items,distinct,hints),newIndex:idx}}},SelectItemParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseItem(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The select item is complete but there are additional tokens.`);return result.value}static parseItem(lexemes,index){let idx=index,valueTokenComments=this.extractValueTokenComments(lexemes,idx),parsedValue=ValueParser.parseFromLexeme(lexemes,idx),value=parsedValue.value;idx=parsedValue.newIndex;let{asComments,newIndex:asIndex}=this.parseAsKeyword(lexemes,idx);if(idx=asIndex,idx<lexemes.length&&lexemes[idx].type&64){let alias=lexemes[idx].value,aliasComments=lexemes[idx].comments,aliasPositionedComments=lexemes[idx].positionedComments;idx++;let selectItem2=new SelectItem(value,alias);return this.applyValueTokenComments(selectItem2,valueTokenComments),this.applyAsKeywordComments(selectItem2,asComments),this.applyAliasComments(selectItem2,aliasComments,aliasPositionedComments),{value:selectItem2,newIndex:idx}}else if(value instanceof ColumnReference&&value.column.name!=="*"){let selectItem2=new SelectItem(value,value.column.name);return this.applyValueTokenComments(selectItem2,valueTokenComments),this.applyAsKeywordComments(selectItem2,asComments),{value:selectItem2,newIndex:idx}}let selectItem=new SelectItem(value);return this.applyValueTokenComments(selectItem,valueTokenComments),this.applyAsKeywordComments(selectItem,asComments),{value:selectItem,newIndex:idx}}static clearPositionedCommentsRecursively(component){!component||typeof component!="object"||("positionedComments"in component&&(component.positionedComments=null),component.left&&this.clearPositionedCommentsRecursively(component.left),component.right&&this.clearPositionedCommentsRecursively(component.right),component.qualifiedName&&this.clearPositionedCommentsRecursively(component.qualifiedName),component.table&&this.clearPositionedCommentsRecursively(component.table),component.name&&this.clearPositionedCommentsRecursively(component.name),component.args&&Array.isArray(component.args)&&component.args.forEach(arg=>{this.clearPositionedCommentsRecursively(arg)}),component.value&&this.clearPositionedCommentsRecursively(component.value))}static extractValueTokenComments(lexemes,index){if(index>=lexemes.length)return{positioned:null,legacy:null};let token=lexemes[index];return{positioned:token.positionedComments&&token.positionedComments.length>0?token.positionedComments:null,legacy:null}}static parseAsKeyword(lexemes,index){if(index>=lexemes.length||lexemes[index].value!=="as")return{asComments:{positioned:null,legacy:null},newIndex:index};let asToken=lexemes[index];return{asComments:{positioned:asToken.positionedComments&&asToken.positionedComments.length>0?asToken.positionedComments:null,legacy:asToken.comments&&asToken.comments.length>0?asToken.comments:null},newIndex:index+1}}static applyValueTokenComments(selectItem,valueTokenComments){if(valueTokenComments.positioned){for(let posComment of valueTokenComments.positioned)selectItem.addPositionedComments(posComment.position,posComment.comments);this.clearValueTokenComments(selectItem)}}static applyAsKeywordComments(selectItem,asComments){asComments.positioned?selectItem.asKeywordPositionedComments=asComments.positioned:asComments.legacy&&(selectItem.asKeywordComments=asComments.legacy)}static applyAliasComments(selectItem,aliasComments,aliasPositionedComments){aliasPositionedComments&&aliasPositionedComments.length>0?selectItem.aliasPositionedComments=aliasPositionedComments:aliasComments&&aliasComments.length>0&&(selectItem.aliasComments=aliasComments)}static clearValueTokenComments(selectItem){if("positionedComments"in selectItem.value&&(selectItem.value.positionedComments=null),selectItem.value.constructor.name==="ColumnReference"){let columnRef=selectItem.value;columnRef.qualifiedName&&columnRef.qualifiedName.name&&(columnRef.qualifiedName.name.positionedComments=null)}selectItem.value.constructor.name==="BinaryExpression"&&this.clearPositionedCommentsRecursively(selectItem.value)}};var JoinOnClauseParser=class{static tryParse(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].value==="on"){idx++;let condition=ValueParser.parseFromLexeme(lexemes,idx);return idx=condition.newIndex,{value:new JoinOnClause(condition.value),newIndex:idx}}return null}};var JoinUsingClauseParser=class{static tryParse(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].value==="using"){idx++;let result=ValueParser.parseArgument(4,8,lexemes,idx),usingColumns=result.value;return idx=result.newIndex,{value:new JoinUsingClause(usingColumns),newIndex:idx}}return null}};var JoinClauseParser=class{static tryParse(lexemes,index){let idx=index,joins=[];for(;this.isJoinCommand(lexemes,idx);){let joinClause=this.parseJoinClause(lexemes,idx);joins.push(joinClause.value),idx=joinClause.newIndex}return joins.length>0?{value:joins,newIndex:idx}:null}static isJoinKeyword(value){return!!joinkeywordParser.parse(value,0)}static parseLateral(lexemes,index){let idx=index;return idx<lexemes.length&&lexemes[idx].value==="lateral"?(idx++,{value:!0,newIndex:idx}):{value:!1,newIndex:idx}}static isJoinCommand(lexemes,index){return index>=lexemes.length?!1:!!(lexemes[index].type&16||this.isJoinKeyword(lexemes[index].value)===!0)}static parseJoinClause(lexemes,index){let idx=index,{joinType,joinComments,newIndex:joinIndex}=this.parseJoinKeyword(lexemes,idx);idx=joinIndex;let lateralResult=this.parseLateral(lexemes,idx),lateral=lateralResult.value;idx=lateralResult.newIndex;let sourceResult=SourceExpressionParser.parseFromLexeme(lexemes,idx);idx=sourceResult.newIndex;let joinClause=this.parseJoinCondition(lexemes,idx,joinType,sourceResult.value,lateral,joinComments);if(joinClause)return joinClause;let naturalJoinClause=new JoinClause(joinType,sourceResult.value,null,lateral);return this.applyJoinComments(naturalJoinClause,joinComments),{value:naturalJoinClause,newIndex:idx}}static parseJoinKeyword(lexemes,index){let joinType=lexemes[index].value===","?"cross join":lexemes[index].value,joinComments=this.extractJoinKeywordComments(lexemes[index]);return{joinType,joinComments,newIndex:index+1}}static extractJoinKeywordComments(token){return{positioned:token.positionedComments&&token.positionedComments.length>0?token.positionedComments:null,legacy:token.comments&&token.comments.length>0?token.comments:null}}static parseJoinCondition(lexemes,index,joinType,sourceValue,lateral,joinComments){if(index>=lexemes.length)return null;let onResult=JoinOnClauseParser.tryParse(lexemes,index);if(onResult){let joinClause=new JoinClause(joinType,sourceValue,onResult.value,lateral);return this.applyJoinComments(joinClause,joinComments),{value:joinClause,newIndex:onResult.newIndex}}let usingResult=JoinUsingClauseParser.tryParse(lexemes,index);if(usingResult){let joinClause=new JoinClause(joinType,sourceValue,usingResult.value,lateral);return this.applyJoinComments(joinClause,joinComments),{value:joinClause,newIndex:usingResult.newIndex}}return null}static applyJoinComments(joinClause,joinComments){joinComments.positioned?joinClause.joinKeywordPositionedComments=joinComments.positioned:joinComments.legacy&&(joinClause.joinKeywordComments=joinComments.legacy)}};var CommentUtils=class{static collectClauseComments(lexemes,currentIndex,keywordValue){if(currentIndex>=lexemes.length||lexemes[currentIndex].value.toLowerCase()!==keywordValue.toLowerCase())return null;let comments=[];lexemes[currentIndex].comments&&comments.push(...lexemes[currentIndex].comments);let checkIndex=currentIndex-1;for(;checkIndex>=0;){let prevToken=lexemes[checkIndex];if(prevToken.comments&&prevToken.comments.length>0){let clauseSpecificComments=prevToken.comments.filter(comment=>{let lowerComment=comment.toLowerCase();return lowerComment.includes(keywordValue.toLowerCase())||lowerComment.includes("\u306E")||lowerComment.includes("\u30B3\u30E1\u30F3\u30C8")});clauseSpecificComments.length>0&&(comments.unshift(...clauseSpecificComments),prevToken.comments=prevToken.comments.filter(c=>!clauseSpecificComments.includes(c)),prevToken.comments.length===0&&(prevToken.comments=null));break}if(this.isSignificantSqlKeyword(prevToken.value))break;checkIndex--}return comments.length>0?comments:null}static isSignificantSqlKeyword(value){return new Set(["select","from","where","group by","having","order by","limit","offset"]).has(value.toLowerCase())}};var FromClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The FROM clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index,fromTokenComments=CommentUtils.collectClauseComments(lexemes,idx,"from");if(lexemes[idx].value!=="from")throw new Error(`Syntax error at position ${idx}: Expected 'FROM' keyword but found "${lexemes[idx].value}". FROM clauses must start with the FROM keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'FROM' keyword. The FROM clause requires a table reference.");let sourceExpression=SourceExpressionParser.parseFromLexeme(lexemes,idx);idx=sourceExpression.newIndex;let join=JoinClauseParser.tryParse(lexemes,idx);if(idx=join?.newIndex||idx,join!==null){let clause=new FromClause(sourceExpression.value,join.value);return{value:clause,newIndex:idx}}else{let clause=new FromClause(sourceExpression.value,null);return{value:clause,newIndex:idx}}}};var WhereClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WHERE clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index,whereLexeme=lexemes[idx],whereTokenComments=CommentUtils.collectClauseComments(lexemes,idx,"where"),wherePositionedComments=whereLexeme.positionedComments;if(whereLexeme.value!=="where")throw new Error(`Syntax error at position ${idx}: Expected 'WHERE' keyword but found "${lexemes[idx].value}". WHERE clauses must start with the WHERE keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'WHERE' keyword. The WHERE clause requires a condition expression.");let item=ValueParser.parseFromLexeme(lexemes,idx),clause=new WhereClause(item.value);return clause.comments=whereTokenComments,wherePositionedComments&&wherePositionedComments.length>0&&(clause.positionedComments=wherePositionedComments.map(comment=>({position:comment.position,comments:[...comment.comments]}))),{value:clause,newIndex:item.newIndex}}};var GroupByClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The GROUP BY clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="group by")throw new Error(`Syntax error at position ${idx}: Expected 'GROUP BY' keyword but found "${lexemes[idx].value}". GROUP BY clauses must start with the GROUP BY keywords.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'GROUP BY' keyword. The GROUP BY clause requires at least one expression to group by.");let items=[],item=this.parseItem(lexemes,idx);for(items.push(item.value),idx=item.newIndex;idx<lexemes.length&&lexemes[idx].type&16;){idx++;let item2=this.parseItem(lexemes,idx);items.push(item2.value),idx=item2.newIndex}if(items.length===0)throw new Error(`Syntax error at position ${index}: No grouping expressions found. The GROUP BY clause requires at least one expression to group by.`);return{value:new GroupByClause(items),newIndex:idx}}static parseItem(lexemes,index){let idx=index,parsedValue=ValueParser.parseFromLexeme(lexemes,idx),value=parsedValue.value;return idx=parsedValue.newIndex,{value,newIndex:idx}}};var HavingClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The HAVING clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="having")throw new Error(`Syntax error at position ${idx}: Expected 'HAVING' keyword but found "${lexemes[idx].value}". HAVING clauses must start with the HAVING keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'HAVING' keyword. The HAVING clause requires a condition expression.");let item=ValueParser.parseFromLexeme(lexemes,idx);return{value:new HavingClause(item.value),newIndex:item.newIndex}}};var WindowClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WINDOW clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="window")throw new Error(`Syntax error at position ${idx}: Expected 'WINDOW' keyword but found "${lexemes[idx].value}". WINDOW clauses must start with the WINDOW keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'WINDOW' keyword. The WINDOW clause requires at least one window definition.");let windows=[];for(;idx<lexemes.length;){if(idx>=lexemes.length||lexemes[idx].type!==64)throw new Error("Syntax error: Expected window name after 'WINDOW' keyword.");let name=lexemes[idx].value;if(idx++,idx>=lexemes.length||lexemes[idx].value!=="as")throw new Error(`Syntax error at position ${idx}: Expected 'AS' keyword after window name.`);idx++;let expr=WindowExpressionParser.parseFromLexeme(lexemes,idx);if(idx=expr.newIndex,windows.push(new WindowFrameClause(name,expr.value)),idx<lexemes.length&&lexemes[idx].type&16)idx++;else break}if(windows.length===0)throw new Error("At least one WINDOW clause is required after WINDOW keyword.");return{value:new WindowsClause(windows),newIndex:idx}}};var LimitClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The LIMIT clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="limit")throw new Error(`Syntax error at position ${idx}: Expected 'LIMIT' keyword but found "${lexemes[idx].value}". LIMIT clauses must start with the LIMIT keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'LIMIT' keyword. The LIMIT clause requires a numeric expression.");let limitItem=ValueParser.parseFromLexeme(lexemes,idx);return idx=limitItem.newIndex,{value:new LimitClause(limitItem.value),newIndex:idx}}};var ForClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The FOR clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value.toLowerCase()!=="for")throw new Error(`Syntax error at position ${idx}: Expected 'FOR' keyword but found "${lexemes[idx].value}". FOR clauses must start with the FOR keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'FOR' keyword. The FOR clause requires a lock mode specification.");let lockModeValue=lexemes[idx].value,lockMode;switch(lockModeValue){case"update":lockMode="update",idx++;break;case"share":lockMode="share",idx++;break;case"key share":lockMode="key share",idx++;break;case"no key update":lockMode="no key update",idx++;break;default:throw new Error(`Syntax error at position ${idx}: Invalid lock mode "${lockModeValue}". Valid lock modes are: UPDATE, SHARE, KEY SHARE, NO KEY UPDATE.`)}return{value:new ForClause(lockMode),newIndex:idx}}};var CommonTableParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The CommonTable definition is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index,aliasResult=SourceAliasExpressionParser.parseFromLexeme(lexemes,idx);idx=aliasResult.newIndex,this.collectPrecedingComments(lexemes,index,aliasResult),idx=this.parseAsKeyword(lexemes,idx);let{materialized,newIndex:materializedIndex}=this.parseMaterializedFlag(lexemes,idx);idx=materializedIndex;let{selectQuery,trailingComments,newIndex:selectIndex}=this.parseInnerSelectQuery(lexemes,idx);return idx=selectIndex,{value:new CommonTable(selectQuery,aliasResult.value,materialized),newIndex:idx,trailingComments}}static collectPrecedingComments(lexemes,index,aliasResult){if(!aliasResult.value?.table)return;let cteTable=aliasResult.value.table;for(let i=index-1;i>=0;i--){let token=lexemes[i];if(token.value.toLowerCase()==="with"){this.collectWithTokenComments(token,cteTable);break}if(token.type&16||token.value.toLowerCase()==="recursive")break;this.collectTokenComments(token,cteTable)}}static collectWithTokenComments(token,cteTable){let hasPositionedComments=!1;if(token.positionedComments&&token.positionedComments.length>0)for(let posComment of token.positionedComments)posComment.position==="after"&&posComment.comments&&(this.addPositionedComment(cteTable,"before",posComment.comments),hasPositionedComments=!0);!hasPositionedComments&&token.comments&&token.comments.length>0&&this.addPositionedComment(cteTable,"before",token.comments)}static collectTokenComments(token,cteTable){token.comments&&token.comments.length>0&&this.addPositionedComment(cteTable,"before",token.comments),token.positionedComments&&token.positionedComments.length>0&&(cteTable.positionedComments||(cteTable.positionedComments=[]),cteTable.positionedComments.unshift(...token.positionedComments))}static addPositionedComment(cteTable,position,comments){cteTable.positionedComments||(cteTable.positionedComments=[]),cteTable.positionedComments.unshift({position,comments:[...comments]})}static parseAsKeyword(lexemes,index){if(index<lexemes.length&&lexemes[index].value!=="as")throw new Error(`Syntax error at position ${index}: Expected 'AS' keyword after CTE name but found "${lexemes[index].value}".`);return index+1}static parseMaterializedFlag(lexemes,index){if(index>=lexemes.length)return{materialized:null,newIndex:index};let currentValue=lexemes[index].value;return currentValue==="materialized"?{materialized:!0,newIndex:index+1}:currentValue==="not materialized"?{materialized:!1,newIndex:index+1}:{materialized:null,newIndex:index}}static parseInnerSelectQuery(lexemes,index){let idx=index;if(idx<lexemes.length&&lexemes[idx].type!==4)throw new Error(`Syntax error at position ${idx}: Expected '(' after CTE name but found "${lexemes[idx].value}".`);let cteQueryHeaderComments=this.extractComments(lexemes[idx]);idx++;let queryResult=SelectQueryParser.parseFromLexeme(lexemes,idx);if(idx=queryResult.newIndex,cteQueryHeaderComments.length>0&&(queryResult.value.headerComments?queryResult.value.headerComments=[...cteQueryHeaderComments,...queryResult.value.headerComments]:queryResult.value.headerComments=cteQueryHeaderComments),idx<lexemes.length&&lexemes[idx].type!==8)throw new Error(`Syntax error at position ${idx}: Expected ')' after CTE query but found "${lexemes[idx].value}".`);let closingParenComments=this.extractComments(lexemes[idx]);return idx++,{selectQuery:queryResult.value,trailingComments:closingParenComments.length>0?closingParenComments:null,newIndex:idx}}static extractComments(lexeme){let comments=[];if(lexeme.positionedComments)for(let posComment of lexeme.positionedComments)posComment.comments&&comments.push(...posComment.comments);return lexeme.comments&&lexeme.comments.length>0&&comments.push(...lexeme.comments),comments}};var WithClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WITH clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index,headerComments=this.extractWithTokenHeaderComments(lexemes,idx);idx=this.parseWithKeyword(lexemes,idx);let{recursive,newIndex:recursiveIndex}=this.parseRecursiveFlag(lexemes,idx);idx=recursiveIndex;let{tables,trailingComments,newIndex:ctesIndex}=this.parseAllCommonTables(lexemes,idx);idx=ctesIndex;let withClause=new WithClause(recursive,tables);return trailingComments.length>0&&(withClause.trailingComments=trailingComments),{value:withClause,newIndex:idx,headerComments}}static extractWithTokenHeaderComments(lexemes,index){if(index>=lexemes.length)return null;let withToken=lexemes[index],headerComments=null;if(withToken.positionedComments&&withToken.positionedComments.length>0)for(let posComment of withToken.positionedComments)posComment.position==="before"&&posComment.comments&&(headerComments||(headerComments=[]),headerComments.push(...posComment.comments));return!headerComments&&withToken.comments&&withToken.comments.length>0&&(headerComments=[...withToken.comments]),headerComments}static parseWithKeyword(lexemes,index){if(index<lexemes.length&&lexemes[index].value.toLowerCase()==="with")return index+1;throw new Error(`Syntax error at position ${index}: Expected WITH keyword.`)}static parseRecursiveFlag(lexemes,index){let recursive=index<lexemes.length&&lexemes[index].value.toLowerCase()==="recursive";return{recursive,newIndex:recursive?index+1:index}}static parseAllCommonTables(lexemes,index){let idx=index,tables=[],allTrailingComments=[],firstCte=CommonTableParser.parseFromLexeme(lexemes,idx);for(tables.push(firstCte.value),idx=firstCte.newIndex,firstCte.trailingComments&&allTrailingComments.push(...firstCte.trailingComments);idx<lexemes.length&&lexemes[idx].type&16;){idx++;let cteResult=CommonTableParser.parseFromLexeme(lexemes,idx);tables.push(cteResult.value),idx=cteResult.newIndex,cteResult.trailingComments&&allTrailingComments.push(...cteResult.trailingComments)}return{tables,trailingComments:allTrailingComments,newIndex:idx}}};var ValuesQueryParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The VALUES clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(idx>=lexemes.length)throw new Error(`Syntax error at position ${idx}: Expected 'VALUES' keyword but input ended early.`);let valuesLexeme=lexemes[idx];if(valuesLexeme.value.toLowerCase()!=="values")throw new Error(`Syntax error at position ${idx}: Expected 'VALUES' keyword but found "${valuesLexeme.value}". VALUES clauses must start with the VALUES keyword.`);let valuesComments=this.extractLexemeComments(valuesLexeme);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'VALUES' keyword. The VALUES clause requires at least one tuple expression.");let tuples=[],firstTuple=this.parseTuple(lexemes,idx);for(tuples.push(firstTuple.value),idx=firstTuple.newIndex,valuesComments.after.length>0&&firstTuple.value.addPositionedComments("before",valuesComments.after);idx<lexemes.length&&lexemes[idx].type&16;){idx++;let tuple=this.parseTuple(lexemes,idx);tuples.push(tuple.value),idx=tuple.newIndex}let query=new ValuesQuery(tuples);return valuesComments.before.length>0&&(query.headerComments=valuesComments.before),{value:query,newIndex:idx}}static parseTuple(lexemes,index){let idx=index;if(idx>=lexemes.length||lexemes[idx].type!==4)throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis but found "${idx<lexemes.length?lexemes[idx].value:"end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);let openingComments=this.extractLexemeComments(lexemes[idx]);idx++;let values=[];if(idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after opening parenthesis in tuple expression.");if(lexemes[idx].type&8){let tuple2=new TupleExpression([]),closingComments2=this.extractLexemeComments(lexemes[idx]);return idx++,openingComments.before.length>0&&tuple2.addPositionedComments("before",openingComments.before),closingComments2.after.length>0&&tuple2.addPositionedComments("after",closingComments2.after),{value:tuple2,newIndex:idx}}let firstValue=ValueParser.parseFromLexeme(lexemes,idx);for(values.push(firstValue.value),idx=firstValue.newIndex;idx<lexemes.length&&lexemes[idx].type&16;){if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after comma in tuple expression.");let value=ValueParser.parseFromLexeme(lexemes,idx);values.push(value.value),idx=value.newIndex}if(idx>=lexemes.length||lexemes[idx].type!==8)throw new Error(`Syntax error at position ${idx}: Expected closing parenthesis but found "${idx<lexemes.length?lexemes[idx].value:"end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);let closingComments=this.extractLexemeComments(lexemes[idx]);idx++;let tuple=new TupleExpression(values);return openingComments.before.length>0&&tuple.addPositionedComments("before",openingComments.before),openingComments.after.length>0&&values.length>0&&values[0].addPositionedComments("before",openingComments.after),closingComments.before.length>0&&values.length>0&&values[values.length-1].addPositionedComments("after",closingComments.before),closingComments.after.length>0&&tuple.addPositionedComments("after",closingComments.after),{value:tuple,newIndex:idx}}static extractLexemeComments(lexeme){let before=[],after=[];if(!lexeme)return{before,after};if(lexeme.positionedComments&&lexeme.positionedComments.length>0)for(let positioned of lexeme.positionedComments)!positioned.comments||positioned.comments.length===0||(positioned.position==="before"?before.push(...positioned.comments):positioned.position==="after"&&after.push(...positioned.comments));else lexeme.comments&&lexeme.comments.length>0&&before.push(...lexeme.comments);return{before:this.dedupeComments(before),after:this.dedupeComments(after)}}static dedupeComments(comments){if(comments.length<=1)return comments;let seen=new Set,result=[];for(let comment of comments)seen.has(comment)||(seen.add(comment),result.push(comment));return result}};var FetchClauseParser=class{static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="fetch")throw new Error(`Syntax error at position ${idx}: Expected 'FETCH' keyword but found "${lexemes[idx].value}".`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'FETCH' keyword.");let fetchExprResult=FetchExpressionParser.parseFromLexeme(lexemes,idx),fetchExpr=fetchExprResult.value;return idx=fetchExprResult.newIndex,{value:new FetchClause(fetchExpr),newIndex:idx}}},FetchExpressionParser=class{static parseFromLexeme(lexemes,index){let idx=index,type,typeToken=lexemes[idx].value;if(typeToken==="first")type="first";else if(typeToken==="next")type="next";else throw new Error(`Syntax error at position ${idx}: Expected 'FIRST' or 'NEXT' after 'FETCH' but found "${lexemes[idx].value}".`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'FETCH FIRST|NEXT'.");let count=null,unit=null;if(lexemes[idx].value==="row only"||lexemes[idx].value==="rows only")return count=new LiteralValue(1),unit="rows only",idx++,{value:new FetchExpression(type,count,unit),newIndex:idx};let countResult=ValueParser.parseFromLexeme(lexemes,idx);if(count=countResult.value,idx=countResult.newIndex,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'FETCH FIRST|NEXT <count>'.");if(lexemes[idx].value==="rows only"?(unit="rows only",idx++):lexemes[idx].value==="percent"?(unit="percent",idx++):lexemes[idx].value==="percent with ties"&&(unit="percent with ties",idx++),!unit)throw new Error("Syntax error: Expected 'ROWS ONLY', 'PERCENT', or 'PERCENT WITH TIES' after 'FETCH FIRST|NEXT <count>'.");return{value:new FetchExpression(type,count,unit),newIndex:idx}}};var OffsetClauseParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The OFFSET clause is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index;if(lexemes[idx].value!=="offset")throw new Error(`Syntax error at position ${idx}: Expected 'OFFSET' keyword but found "${lexemes[idx].value}". OFFSET clauses must start with the OFFSET keyword.`);if(idx++,idx>=lexemes.length)throw new Error("Syntax error: Unexpected end of input after 'OFFSET' keyword. The OFFSET clause requires a numeric expression.");let offsetItem=ValueParser.parseFromLexeme(lexemes,idx);return idx=offsetItem.newIndex,idx<lexemes.length&&(lexemes[idx].value==="row"||lexemes[idx].value==="rows")&&idx++,{value:new OffsetClause(offsetItem.value),newIndex:idx}}};var LexemeCursor=class{static{this.SQL_COMMANDS=new Set(["select","from","where","and","or","order","by","group","having","limit","offset","as","on","inner","left","right","join","union","insert","update","delete","into","values","set"])}static findLexemeAtLineColumn(sql,position){let charOffset=this.lineColumnToCharOffset(sql,position);return charOffset===-1?null:this.findLexemeAtPosition(sql,charOffset)}static findLexemeAtPosition(sql,cursorPosition){if(cursorPosition<0||cursorPosition>=sql.length)return null;let lexemes=this.getAllLexemesWithPosition(sql);for(let lexeme of lexemes)if(lexeme.position&&cursorPosition>=lexeme.position.startPosition&&cursorPosition<lexeme.position.endPosition)return lexeme;return null}static getAllLexemesWithPosition(sql){if(!sql?.trim())return[];try{let lexemes=[],position=0;for(;position<sql.length&&(position=this.skipWhitespaceAndComments(sql,position),!(position>=sql.length));){let lexeme=this.parseNextToken(sql,position);lexeme?(lexemes.push(lexeme),position=lexeme.position.endPosition):position++}return lexemes}catch{return[]}}static skipWhitespaceAndComments(sql,position){return StringUtils.readWhiteSpaceAndComment(sql,position).position}static parseNextToken(sql,startPos){let char=sql[startPos];return char==="'"||char==='"'?this.parseStringLiteral(sql,startPos):/[=<>!+\-*/%().*]/.test(char)?this.parseOperator(sql,startPos):char===","?this.createLexeme(16,",",startPos,startPos+1):/[a-zA-Z0-9_]/.test(char)?this.parseWordToken(sql,startPos):null}static parseStringLiteral(sql,startPos){let quote=sql[startPos],position=startPos+1,token=quote;for(;position<sql.length&&sql[position]!==quote;)token+=sql[position++];return position<sql.length&&(token+=sql[position++]),this.createLexeme(1,token,startPos,position)}static parseOperator(sql,startPos){let token=sql[startPos],position=startPos+1;position<sql.length&&/[=<>!]/.test(sql[position])&&/[=<>!]/.test(token)&&(token+=sql[position++]);let tokenType=this.getOperatorTokenType(token);return this.createLexeme(tokenType,token,startPos,position)}static parseWordToken(sql,startPos){let position=startPos,token="";for(;position<sql.length&&/[a-zA-Z0-9_]/.test(sql[position]);)token+=sql[position++];let tokenType=this.getWordTokenType(token,sql,position),value=this.shouldLowercase(tokenType)?token.toLowerCase():token;return this.createLexeme(tokenType,value,startPos,position)}static getOperatorTokenType(token){switch(token){case"(":return 4;case")":return 8;case"*":return 64;default:return 2}}static getWordTokenType(token,sql,position){let lowerToken=token.toLowerCase();if(this.SQL_COMMANDS.has(lowerToken))return 128;let nextNonWhitespacePos=this.skipWhitespaceAndComments(sql,position);return nextNonWhitespacePos<sql.length&&sql[nextNonWhitespacePos]==="("?2048:64}static shouldLowercase(tokenType){return!!(tokenType&128)||!!(tokenType&2)||!!(tokenType&2048)}static createLexeme(type,value,startPos,endPos){return{type,value,comments:null,position:{startPosition:startPos,endPosition:endPos}}}static lineColumnToCharOffset(sql,position){if(position.line<1||position.column<1)return-1;let lines=sql.split(`
24
+ `);if(position.line>lines.length)return-1;let targetLine=lines[position.line-1];if(position.column>targetLine.length+1)return-1;let offset=0;for(let i=0;i<position.line-1;i++)offset+=lines[i].length+1;return offset+=position.column-1,offset}static charOffsetToLineColumn(sql,charOffset){if(charOffset<0||charOffset>sql.length)return null;let lines=sql.split(`
25
+ `),currentOffset=0;for(let lineIndex=0;lineIndex<lines.length;lineIndex++){let lineLength=lines[lineIndex].length;if(charOffset<currentOffset+lineLength)return{line:lineIndex+1,column:charOffset-currentOffset+1};if(charOffset===currentOffset+lineLength&&lineIndex<lines.length-1)return{line:lineIndex+2,column:1};currentOffset+=lineLength+1}if(charOffset===sql.length){let lastLine=lines[lines.length-1];return{line:lines.length,column:lastLine.length+1}}return null}};var CTERegionDetector=class{static analyzeCursorPosition(sql,cursorPosition){let cteRegions=this.extractCTERegions(sql),currentCTE=this.calculateExtendedCTEBoundaries(sql,cteRegions).find(region=>cursorPosition>=region.startPosition&&cursorPosition<region.extendedEndPosition);return currentCTE?{isInCTE:!0,cteRegion:{name:currentCTE.name,startPosition:currentCTE.startPosition,endPosition:currentCTE.endPosition,sqlContent:currentCTE.sqlContent},executableSQL:currentCTE.sqlContent}:{isInCTE:!1,cteRegion:null,executableSQL:this.extractMainQuery(sql,cteRegions)}}static getCursorCte(sql,cursorPosition){try{let analysis=this.analyzeCursorPosition(sql,cursorPosition);return analysis.isInCTE&&analysis.cteRegion?.name||null}catch{return null}}static getCursorCteAt(sql,line,column){try{let position=this.lineColumnToPosition(sql,line,column);return position===-1?null:this.getCursorCte(sql,position)}catch{return null}}static lineColumnToPosition(text,line,column){if(line<1||column<1)return-1;let lines=text.split(`
26
+ `);if(line>lines.length)return-1;let targetLine=lines[line-1];if(column>targetLine.length+1)return-1;let position=0;for(let i=0;i<line-1;i++)position+=lines[i].length+1;return position+=column-1,position}static positionToLineColumn(text,position){if(position<0||position>text.length)return null;let lines=text.substring(0,position).split(`
27
+ `);return{line:lines.length,column:lines[lines.length-1].length+1}}static extractCTERegions(sql){let lexemes=LexemeCursor.getAllLexemesWithPosition(sql),cteRegions=[],i=0,inWithClause=!1;for(;i<lexemes.length;){let lexeme=lexemes[i];if(lexeme.value.toLowerCase()==="with"&&!inWithClause){inWithClause=!0,i++;continue}if(inWithClause&&lexeme.value.toLowerCase()==="recursive"){i++;continue}if(inWithClause&&lexeme.type===64&&i+1<lexemes.length&&lexemes[i+1].value.toLowerCase()==="as"){let cteName=lexeme.value,cteStartPos=lexeme.position.startPosition,parenIndex=i+2;for(;parenIndex<lexemes.length&&lexemes[parenIndex].value!=="(";)parenIndex++;if(parenIndex<lexemes.length){let cteEndInfo=this.findMatchingParen(lexemes,parenIndex);if(cteEndInfo){let cteEndPos=cteEndInfo.endPosition,sqlContent=this.extractCTESQL(sql,lexemes,parenIndex,cteEndInfo.index);cteRegions.push({name:cteName,startPosition:cteStartPos,endPosition:cteEndPos,sqlContent}),i=cteEndInfo.index+1;continue}}}if(inWithClause&&lexeme.value.toLowerCase()==="select"&&this.isMainQuerySelect(lexemes,i))break;i++}return cteRegions}static findMatchingParen(lexemes,openParenIndex){let depth=1,i=openParenIndex+1;for(;i<lexemes.length&&depth>0;){if(lexemes[i].value==="("?depth++:lexemes[i].value===")"&&depth--,depth===0)return{index:i,endPosition:lexemes[i].position.endPosition};i++}return null}static extractCTESQL(sql,lexemes,openParenIndex,closeParenIndex){let startPos=lexemes[openParenIndex+1].position.startPosition,endPos=lexemes[closeParenIndex-1].position.endPosition;return sql.substring(startPos,endPos).trim()}static isMainQuerySelect(lexemes,selectIndex){let depth=0;for(let i=selectIndex-1;i>=0;i--)lexemes[i].value===")"?depth++:lexemes[i].value==="("&&depth--;return depth===0}static calculateExtendedCTEBoundaries(sql,cteRegions){return cteRegions.length===0?[]:cteRegions.map((region,index)=>{let extendedEndPosition;return index<cteRegions.length-1?extendedEndPosition=cteRegions[index+1].startPosition:extendedEndPosition=this.findMainQueryStart(sql,region.endPosition),{...region,extendedEndPosition}})}static findMainQueryStart(sql,afterPosition){let pos=afterPosition;for(;pos<sql.length;){if(sql.substring(pos).toLowerCase().trim().startsWith("select")){let selectIndex=sql.toLowerCase().indexOf("select",pos);return selectIndex!==-1?selectIndex:pos}pos++}return sql.length}static extractMainQuery(sql,cteRegions){if(cteRegions.length===0)return sql.trim();let selectPos=cteRegions[cteRegions.length-1].endPosition;for(;selectPos<sql.length&&!sql.substring(selectPos).toLowerCase().trim().startsWith("select");)selectPos++;return sql.substring(selectPos).trim()}static getCTEPositions(sql){let cteRegions=this.extractCTERegions(sql),results=[];if(cteRegions.forEach(region=>{results.push({name:region.name,startPosition:region.startPosition,type:"CTE"})}),cteRegions.length>0){let mainQueryPos=cteRegions[cteRegions.length-1].endPosition;for(;mainQueryPos<sql.length;){if(sql.substring(mainQueryPos).toLowerCase().trim().startsWith("select")){results.push({name:"MAIN_QUERY",startPosition:mainQueryPos,type:"MAIN_QUERY"});break}mainQueryPos++}}else results.push({name:"MAIN_QUERY",startPosition:0,type:"MAIN_QUERY"});return results}};var SelectQueryParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`[SelectQueryParser] Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The SELECT query is complete but there are additional tokens.`);return result.value}static calculateCharacterPosition(query,lexemes,tokenIndex){if(tokenIndex>=lexemes.length)return query.length;let lexeme=lexemes[tokenIndex];if(lexeme.position?.startPosition!==void 0)return lexeme.position.startPosition;let searchStart=0;for(let i=0;i<tokenIndex;i++){let tokenValue=lexemes[i].value,tokenPos2=query.indexOf(tokenValue,searchStart);tokenPos2!==-1&&(searchStart=tokenPos2+tokenValue.length)}let targetToken=lexemes[tokenIndex].value,tokenPos=query.indexOf(targetToken,searchStart);return tokenPos!==-1?tokenPos:searchStart}static analyze(query){let lexemes=[];try{lexemes=new SqlTokenizer(query).readLexmes();let result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length){let remainingTokens=lexemes.slice(result.newIndex).map(lex=>lex.value),errorLexeme=lexemes[result.newIndex],errorPosition=this.calculateCharacterPosition(query,lexemes,result.newIndex);return{success:!1,query:result.value,error:`Syntax error: Unexpected token "${errorLexeme.value}" at character position ${errorPosition}. The SELECT query is complete but there are additional tokens.`,errorPosition,remainingTokens}}return{success:!0,query:result.value}}catch(error){let errorPosition,errorMessage=error instanceof Error?error.message:String(error),positionMatch=errorMessage.match(/position (\d+)/);if(positionMatch){let tokenIndex=parseInt(positionMatch[1],10);errorPosition=this.calculateCharacterPosition(query,lexemes,tokenIndex)}return{success:!1,error:errorMessage,errorPosition}}}static async parseAsync(query){return Promise.resolve(this.parse(query))}static{this.unionCommandSet=new Set(["union","union all","intersect","intersect all","except","except all"])}static{this.selectCommandSet=new Set(["with","select"])}static transferHeaderComments(source,target){source.headerComments&&(target.headerComments=source.headerComments,source.headerComments=null)}static extractUnionTokenComments(unionLexeme){let comments=[];if(unionLexeme.positionedComments&&unionLexeme.positionedComments.length>0){for(let posComment of unionLexeme.positionedComments)posComment.comments&&posComment.comments.length>0&&comments.push(...posComment.comments);unionLexeme.positionedComments=void 0}return unionLexeme.comments&&unionLexeme.comments.length>0&&(comments.push(...unionLexeme.comments),unionLexeme.comments=null),comments.length>0?comments:null}static parseFromLexeme(lexemes,index){let idx=index;if(idx>=lexemes.length)throw new Error(`Syntax error: Unexpected end of input at position ${index}.`);let firstToken=lexemes[idx].value;if(!this.selectCommandSet.has(firstToken)&&firstToken!=="values")throw new Error(`Syntax error at position ${idx}: Expected 'SELECT' or 'VALUES' keyword but found "${lexemes[idx].value}".`);let firstResult=this.selectCommandSet.has(firstToken)?this.parseSimpleSelectQuery(lexemes,idx):this.parseValuesQuery(lexemes,idx),query=firstResult.value;for(idx=firstResult.newIndex;idx<lexemes.length&&this.unionCommandSet.has(lexemes[idx].value.toLowerCase());){let operatorLexeme=lexemes[idx],operator=operatorLexeme.value.toLowerCase(),unionComments=this.extractUnionTokenComments(operatorLexeme);if(idx++,idx>=lexemes.length)throw new Error(`Syntax error at position ${idx}: Expected a query after '${operator.toUpperCase()}' but found end of input.`);let nextToken=lexemes[idx].value.toLowerCase();if(this.selectCommandSet.has(nextToken)){let result=this.parseSimpleSelectQuery(lexemes,idx),binaryQuery=new BinarySelectQuery(query,operator,result.value);this.transferHeaderComments(query,binaryQuery),unionComments&&unionComments.length>0&&(result.value.headerComments?result.value.headerComments=[...unionComments,...result.value.headerComments]:result.value.headerComments=unionComments),query=binaryQuery,idx=result.newIndex}else if(nextToken==="values"){let result=this.parseValuesQuery(lexemes,idx),binaryQuery=new BinarySelectQuery(query,operator,result.value);this.transferHeaderComments(query,binaryQuery),unionComments&&unionComments.length>0&&(result.value.headerComments?result.value.headerComments=[...unionComments,...result.value.headerComments]:result.value.headerComments=unionComments),query=binaryQuery,idx=result.newIndex}else throw new Error(`Syntax error at position ${idx}: Expected 'SELECT' or 'VALUES' after '${operator.toUpperCase()}' but found "${lexemes[idx].value}".`)}return{value:query,newIndex:idx}}static parseSimpleSelectQuery(lexemes,index){let idx=index,{withClauseResult,newIndex:withEndIndex,selectQuery:queryTemplate}=this.parseWithClauseAndComments(lexemes,idx);idx=withEndIndex;let{clauses,newIndex:clausesEndIndex,selectTokenComments}=this.parseAllClauses(lexemes,idx,withClauseResult);if(idx=clausesEndIndex,selectTokenComments&&selectTokenComments.length>0)if(withClauseResult){let merged=[...queryTemplate.betweenClauseComments??[]];for(let comment of selectTokenComments)merged.includes(comment)||merged.push(comment);queryTemplate.betweenClauseComments=merged,queryTemplate.mainSelectPrefixComments=void 0}else{let existingHeader=queryTemplate.headerComments??[];queryTemplate.headerComments=[...existingHeader,...selectTokenComments]}let selectQuery=new SimpleSelectQuery({withClause:withClauseResult?withClauseResult.value:null,...clauses});return this.applyCommentsToQuery(selectQuery,queryTemplate,withClauseResult),{value:selectQuery,newIndex:idx}}static parseWithClauseAndComments(lexemes,index){let idx=index,withClauseResult=null,queryTemplate={};for(queryTemplate.headerComments=this.collectHeaderComments(lexemes,idx);idx<lexemes.length&&lexemes[idx].value.toLowerCase()!=="with"&&lexemes[idx].value.toLowerCase()!=="select";)idx++;return idx<lexemes.length&&lexemes[idx].value.toLowerCase()==="with"&&this.collectWithTokenHeaderComments(lexemes[idx],queryTemplate),idx<lexemes.length&&lexemes[idx].value==="with"&&(withClauseResult=WithClauseParser.parseFromLexeme(lexemes,idx),idx=withClauseResult.newIndex,queryTemplate.mainSelectPrefixComments=this.collectMainSelectPrefixComments(lexemes,withClauseResult,idx),queryTemplate.betweenClauseComments=this.collectBetweenClauseComments(lexemes,withClauseResult,idx)),{withClauseResult,newIndex:idx,selectQuery:queryTemplate}}static parseAllClauses(lexemes,index,withClauseResult){let idx=index;idx=this.findMainSelectToken(lexemes,idx,withClauseResult);let selectTokenComments=this.collectSelectTokenComments(lexemes,idx),selectClauseResult=SelectClauseParser.parseFromLexeme(lexemes,idx);idx=selectClauseResult.newIndex;let fromClauseResult=this.parseOptionalClause(lexemes,idx,"from",FromClauseParser);idx=fromClauseResult.newIndex;let whereClauseResult=this.parseOptionalClause(lexemes,fromClauseResult.newIndex,"where",WhereClauseParser);idx=whereClauseResult.newIndex;let groupByClauseResult=this.parseOptionalClause(lexemes,whereClauseResult.newIndex,"group by",GroupByClauseParser);idx=groupByClauseResult.newIndex;let havingClauseResult=this.parseOptionalClause(lexemes,groupByClauseResult.newIndex,"having",HavingClauseParser);idx=havingClauseResult.newIndex;let windowClauseResult=this.parseOptionalClause(lexemes,havingClauseResult.newIndex,"window",WindowClauseParser);idx=windowClauseResult.newIndex;let orderByClauseResult=this.parseOptionalClause(lexemes,windowClauseResult.newIndex,"order by",OrderByClauseParser);idx=orderByClauseResult.newIndex;let limitClauseResult=this.parseOptionalClause(lexemes,orderByClauseResult.newIndex,"limit",LimitClauseParser);idx=limitClauseResult.newIndex;let offsetClauseResult=this.parseOptionalClause(lexemes,limitClauseResult.newIndex,"offset",OffsetClauseParser);idx=offsetClauseResult.newIndex;let fetchClauseResult=this.parseOptionalClause(lexemes,offsetClauseResult.newIndex,"fetch",FetchClauseParser);idx=fetchClauseResult.newIndex;let forClauseResult=this.parseOptionalClause(lexemes,fetchClauseResult.newIndex,"for",ForClauseParser);return idx=forClauseResult.newIndex,{clauses:{selectClause:selectClauseResult.value,fromClause:fromClauseResult.value,whereClause:whereClauseResult.value,groupByClause:groupByClauseResult.value,havingClause:havingClauseResult.value,orderByClause:orderByClauseResult.value,windowClause:windowClauseResult.value,limitClause:limitClauseResult.value,offsetClause:offsetClauseResult.value,fetchClause:fetchClauseResult.value,forClause:forClauseResult.value},newIndex:idx,selectTokenComments}}static parseOptionalClause(lexemes,index,keyword,parser){return index<lexemes.length&&lexemes[index].value.toLowerCase()===keyword?parser.parseFromLexeme(lexemes,index):{value:null,newIndex:index}}static collectHeaderComments(lexemes,startIndex){let headerComments=[],idx=startIndex;for(;idx<lexemes.length&&lexemes[idx].value.toLowerCase()!=="with"&&lexemes[idx].value.toLowerCase()!=="select";){let token=lexemes[idx];if(token.positionedComments)for(let posComment of token.positionedComments)posComment.comments&&headerComments.push(...posComment.comments);token.comments&&token.comments.length>0&&headerComments.push(...token.comments),idx++}return headerComments}static collectWithTokenHeaderComments(withToken,queryTemplate){if(!withToken.positionedComments)return;queryTemplate.headerComments||(queryTemplate.headerComments=[]);let remainingPositioned=[];for(let posComment of withToken.positionedComments)posComment.position==="before"&&posComment.comments?queryTemplate.headerComments.push(...posComment.comments):remainingPositioned.push(posComment);withToken.positionedComments=remainingPositioned.length>0?remainingPositioned:void 0}static collectMainSelectPrefixComments(lexemes,withClauseResult,currentIndex){let mainSelectPrefixComments=[];withClauseResult?.value.trailingComments&&mainSelectPrefixComments.push(...withClauseResult.value.trailingComments);let mainSelectIdx=this.findMainSelectIndex(lexemes,withClauseResult,currentIndex);if(withClauseResult&&mainSelectIdx>withClauseResult.newIndex)for(let tempIdx=withClauseResult.newIndex;tempIdx<mainSelectIdx;tempIdx++){let token=lexemes[tempIdx];if(token.positionedComments)for(let posComment of token.positionedComments)posComment.comments&&mainSelectPrefixComments.push(...posComment.comments);token.comments&&token.comments.length>0&&mainSelectPrefixComments.push(...token.comments)}return mainSelectPrefixComments}static collectBetweenClauseComments(lexemes,withClauseResult,currentIndex){if(!withClauseResult)return[];let betweenClauseComments=[],withEndIndex=withClauseResult.newIndex,scanStartIndex=Math.max(0,withEndIndex-1);for(let i=scanStartIndex;i<currentIndex;i++){let token=lexemes[i];if(token.positionedComments&&token.positionedComments.length>0){for(let posComment of token.positionedComments)posComment.comments&&betweenClauseComments.push(...posComment.comments);token.positionedComments=void 0}token.comments&&token.comments.length>0&&(betweenClauseComments.push(...token.comments),token.comments=null)}return betweenClauseComments}static findMainSelectIndex(lexemes,withClauseResult,fallbackIndex){if(withClauseResult){for(let i=withClauseResult.newIndex;i<lexemes.length;i++)if(lexemes[i].value.toLowerCase()==="select")return i}return fallbackIndex}static findMainSelectToken(lexemes,index,withClauseResult){let mainSelectIdx=this.findMainSelectIndex(lexemes,withClauseResult,index);if(mainSelectIdx>=lexemes.length||lexemes[mainSelectIdx].value!=="select")throw new Error(`Syntax error at position ${mainSelectIdx}: Expected 'SELECT' keyword but found "${mainSelectIdx<lexemes.length?lexemes[mainSelectIdx].value:"end of input"}". SELECT queries must start with the SELECT keyword.`);return mainSelectIdx}static collectSelectTokenComments(lexemes,selectIndex){let selectToken=lexemes[selectIndex],selectComments=[];if(selectToken.comments&&selectToken.comments.length>0&&(selectComments.push(...selectToken.comments),selectToken.comments=null),selectToken.positionedComments&&selectToken.positionedComments.length>0){for(let posComment of selectToken.positionedComments)posComment.position==="before"&&posComment.comments&&selectComments.push(...posComment.comments);selectToken.positionedComments=void 0}return selectComments}static applyCommentsToQuery(selectQuery,queryTemplate,withClauseResult){queryTemplate.headerComments?.length>0&&(selectQuery.headerComments=queryTemplate.headerComments);let mergeBetweenComments=source=>{if(!source||source.length===0)return;let existing=selectQuery.comments??[],merged=[];for(let comment of source)merged.includes(comment)||merged.push(comment);for(let comment of existing)merged.includes(comment)||merged.push(comment);selectQuery.comments=merged};mergeBetweenComments(queryTemplate.mainSelectPrefixComments),mergeBetweenComments(queryTemplate.betweenClauseComments)}static parseValuesQuery(lexemes,index){let result=ValuesQueryParser.parseFromLexeme(lexemes,index);return{value:result.value,newIndex:result.newIndex}}static getCursorCte(sql,cursorPosition){return CTERegionDetector.getCursorCte(sql,cursorPosition)}static getCursorCteAt(sql,line,column){return CTERegionDetector.getCursorCteAt(sql,line,column)}static positionToLineColumn(text,position){return CTERegionDetector.positionToLineColumn(text,position)}};var InsertQueryParser=class{static parse(query){let lexemes=new SqlTokenizer(query).readLexmes(),result=this.parseFromLexeme(lexemes,0);if(result.newIndex<lexemes.length)throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The INSERT query is complete but there are additional tokens.`);return result.value}static parseFromLexeme(lexemes,index){let idx=index,withclause=null;if(lexemes[idx].value==="with"){let result=WithClauseParser.parseFromLexeme(lexemes,idx);withclause=result.value,idx=result.newIndex}if(lexemes[idx].value!=="insert into")throw new Error(`Syntax error at position ${idx}: Expected 'INSERT INTO' but found '${lexemes[idx].value}'.`);idx++;let sourceResult=SourceExpressionParser.parseTableSourceFromLexemes(lexemes,idx);idx=sourceResult.newIndex;let columns=[];if(lexemes[idx]?.type===4){for(idx++;idx<lexemes.length&&lexemes[idx].type===64&&(columns.push(lexemes[idx].value),idx++,lexemes[idx]?.type===16);)idx++;if(lexemes[idx]?.type!==8)throw new Error(`Syntax error at position ${idx}: Expected ')' after column list.`);idx++}let selectResult=SelectQueryParser.parseFromLexeme(lexemes,idx);if(withclause)if(selectResult.value instanceof SimpleSelectQuery)selectResult.value.withClause=withclause;else throw new Error("WITH clause is not supported in this context.");return idx=selectResult.newIndex,{value:new InsertQuery({insertClause:new InsertClause(sourceResult.value,columns),selectQuery:selectResult.value}),newIndex:idx}}};var CTETableReferenceCollector=class{constructor(){this.tableSources=[];this.visitedNodes=new Set;this.tableNameMap=new Map;this.isRootVisit=!0;this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr)),this.handlers.set(ValuesQuery.kind,expr=>this.visitValuesQuery(expr)),this.handlers.set(FromClause.kind,expr=>this.visitFromClause(expr)),this.handlers.set(JoinClause.kind,expr=>this.visitJoinClause(expr)),this.handlers.set(JoinOnClause.kind,expr=>this.visitJoinOnClause(expr)),this.handlers.set(JoinUsingClause.kind,expr=>this.visitJoinUsingClause(expr)),this.handlers.set(SourceExpression.kind,expr=>this.visitSourceExpression(expr)),this.handlers.set(TableSource.kind,expr=>this.visitTableSource(expr)),this.handlers.set(FunctionSource.kind,expr=>this.visitFunctionSource(expr)),this.handlers.set(ParenSource.kind,expr=>this.visitParenSource(expr)),this.handlers.set(SubQuerySource.kind,expr=>this.visitSubQuerySource(expr)),this.handlers.set(InlineQuery.kind,expr=>this.visitInlineQuery(expr)),this.handlers.set(WhereClause.kind,expr=>this.visitWhereClause(expr)),this.handlers.set(GroupByClause.kind,expr=>this.visitGroupByClause(expr)),this.handlers.set(HavingClause.kind,expr=>this.visitHavingClause(expr)),this.handlers.set(OrderByClause.kind,expr=>this.visitOrderByClause(expr)),this.handlers.set(WindowFrameClause.kind,expr=>this.visitWindowFrameClause(expr)),this.handlers.set(LimitClause.kind,expr=>this.visitLimitClause(expr)),this.handlers.set(OffsetClause.kind,expr=>this.visitOffsetClause(expr)),this.handlers.set(FetchClause.kind,expr=>this.visitFetchClause(expr)),this.handlers.set(ForClause.kind,expr=>this.visitForClause(expr)),this.handlers.set(OrderByItem.kind,expr=>this.visitOrderByItem(expr)),this.handlers.set(SelectClause.kind,expr=>this.visitSelectClause(expr)),this.handlers.set(SelectItem.kind,expr=>this.visitSelectItem(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(CaseKeyValuePair.kind,expr=>this.visitCaseKeyValuePair(expr)),this.handlers.set(SwitchCaseArgument.kind,expr=>this.visitSwitchCaseArgument(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(FunctionCall.kind,expr=>this.visitFunctionCall(expr)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(TupleExpression.kind,expr=>this.visitTupleExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(ValueList.kind,expr=>this.visitValueList(expr)),this.handlers.set(StringSpecifierExpression.kind,expr=>this.visitStringSpecifierExpression(expr))}collect(query){return this.visit(query),this.getTableSources()}getTableSources(){return this.tableSources}reset(){this.tableSources=[],this.tableNameMap.clear(),this.visitedNodes.clear()}getTableIdentifier(source){return source.qualifiedName.namespaces&&source.qualifiedName.namespaces.length>0?source.qualifiedName.namespaces.map(ns=>ns.name).join(".")+"."+(source.qualifiedName.name instanceof RawString?source.qualifiedName.name.value:source.qualifiedName.name.name):source.qualifiedName.name instanceof RawString?source.qualifiedName.name.value:source.qualifiedName.name.name}visit(arg){if(!this.isRootVisit){this.visitNode(arg);return}this.reset(),this.isRootVisit=!1;try{this.visitNode(arg)}finally{this.isRootVisit=!0}}visitNode(arg){if(this.visitedNodes.has(arg))return;this.visitedNodes.add(arg);let handler=this.handlers.get(arg.getKind());if(handler){handler(arg);return}}visitSimpleSelectQuery(query){if(query.fromClause&&query.fromClause.accept(this),query.whereClause&&query.whereClause.accept(this),query.groupByClause&&query.groupByClause.accept(this),query.havingClause&&query.havingClause.accept(this),query.orderByClause&&query.orderByClause.accept(this),query.windowClause)for(let win of query.windowClause.windows)win.accept(this);query.limitClause&&query.limitClause.accept(this),query.offsetClause&&query.offsetClause.accept(this),query.fetchClause&&query.fetchClause.accept(this),query.forClause&&query.forClause.accept(this),query.selectClause.accept(this)}visitBinarySelectQuery(query){query.left.accept(this),query.right.accept(this)}visitValuesQuery(query){for(let tuple of query.tuples)tuple.accept(this)}visitFromClause(fromClause){if(fromClause.source.accept(this),fromClause.joins)for(let join of fromClause.joins)join.accept(this)}visitSourceExpression(source){source.datasource.accept(this)}visitTableSource(source){let identifier=this.getTableIdentifier(source);this.tableNameMap.has(identifier)||(this.tableNameMap.set(identifier,!0),this.tableSources.push(source))}visitFunctionSource(source){source.argument&&this.visitValueComponent(source.argument)}visitValueComponent(value){value.accept(this)}visitParenSource(source){source.source.accept(this)}visitSubQuerySource(subQuery){subQuery.query.accept(this)}visitInlineQuery(inlineQuery){inlineQuery.selectQuery.accept(this)}visitJoinClause(joinClause){joinClause.source.accept(this),joinClause.condition&&joinClause.condition.accept(this)}visitJoinOnClause(joinOn){joinOn.condition.accept(this)}visitJoinUsingClause(joinUsing){joinUsing.condition.accept(this)}visitWhereClause(whereClause){whereClause.condition.accept(this)}visitGroupByClause(clause){for(let item of clause.grouping)item.accept(this)}visitHavingClause(clause){clause.condition.accept(this)}visitOrderByClause(clause){for(let item of clause.order)item.accept(this)}visitWindowFrameClause(clause){clause.expression.accept(this)}visitLimitClause(clause){clause.value.accept(this)}visitOffsetClause(clause){clause.value.accept(this)}visitFetchClause(clause){clause.expression.accept(this)}visitForClause(_clause){}visitOrderByItem(item){item.value.accept(this)}visitSelectClause(clause){for(let item of clause.items)item.accept(this)}visitSelectItem(item){item.value.accept(this)}visitParenExpression(expr){expr.expression.accept(this)}visitBinaryExpression(expr){expr.left.accept(this),expr.right.accept(this)}visitUnaryExpression(expr){expr.expression.accept(this)}visitCaseExpression(expr){expr.condition&&expr.condition.accept(this),expr.switchCase.accept(this)}visitSwitchCaseArgument(switchCase){for(let caseItem of switchCase.cases)caseItem.accept(this);switchCase.elseValue&&switchCase.elseValue.accept(this)}visitCaseKeyValuePair(pair){pair.key.accept(this),pair.value.accept(this)}visitBetweenExpression(expr){expr.expression.accept(this),expr.lower.accept(this),expr.upper.accept(this)}visitFunctionCall(func){func.argument&&func.argument.accept(this),func.over&&func.over.accept(this)}visitArrayExpression(expr){expr.expression.accept(this)}visitArrayQueryExpression(expr){expr.query.accept(this)}visitTupleExpression(expr){for(let value of expr.values)value.accept(this)}visitCastExpression(expr){expr.input.accept(this),expr.castType.accept(this)}visitValueList(valueList){for(let value of valueList.values)value.accept(this)}visitStringSpecifierExpression(_expr){}};var CTEDependencyAnalyzer=class _CTEDependencyAnalyzer{constructor(){this.dependencyGraph=null;this.cteMap=new Map;this.sourceCollector=new TableSourceCollector(!1),this.cteReferenceCollector=new CTETableReferenceCollector,this.cteCollector=new CTECollector}static{this.ERROR_MESSAGES={NOT_ANALYZED:"Must call analyzeDependencies first",CIRCULAR_REFERENCE:"Circular reference detected in CTE"}}static{this.MAIN_QUERY_NAME="MAIN_QUERY"}analyzeDependencies(query){let ctes=this.cteCollector.collect(query);return this.buildCTEMap(ctes),this.dependencyGraph=this.buildDependencyGraph(ctes,query),this.dependencyGraph}getDependencies(cteName){this.ensureAnalyzed();let node=this.findNodeByName(cteName);return node?[...node.dependencies]:[]}getDependents(cteName){this.ensureAnalyzed();let node=this.findNodeByName(cteName);return node?[...node.dependents]:[]}getMainQueryDependencies(){this.ensureAnalyzed();let mainQueryNode=this.findNodeByName(_CTEDependencyAnalyzer.MAIN_QUERY_NAME);return mainQueryNode?[...mainQueryNode.dependencies]:[]}getNodesByType(nodeType){return this.ensureAnalyzed(),this.dependencyGraph.nodes.filter(n=>n.type===nodeType)}getMainQueryNode(){return this.ensureAnalyzed(),this.findNodeByName(_CTEDependencyAnalyzer.MAIN_QUERY_NAME)}hasCircularDependency(){this.ensureAnalyzed();try{return this.getExecutionOrder(),!1}catch(error){if(error instanceof Error&&error.message.includes(_CTEDependencyAnalyzer.ERROR_MESSAGES.CIRCULAR_REFERENCE))return!0;throw error}}getExecutionOrder(){this.ensureAnalyzed();let visited=new Set,visiting=new Set,result=[],dependencyMap=new Map;for(let node of this.dependencyGraph.nodes)dependencyMap.set(node.name,new Set(node.dependencies));let visit=nodeName=>{if(visited.has(nodeName))return;if(visiting.has(nodeName))throw new Error(`${_CTEDependencyAnalyzer.ERROR_MESSAGES.CIRCULAR_REFERENCE}: ${nodeName}`);visiting.add(nodeName);let deps=dependencyMap.get(nodeName)||new Set;for(let dep of deps)visit(dep);visiting.delete(nodeName),visited.add(nodeName),result.push(nodeName)};for(let node of this.dependencyGraph.nodes)visited.has(node.name)||visit(node.name);return result}buildDependencyGraph(ctes,mainQuery){let nodes=[],edges=[],dependencyMap=new Map,dependentMap=new Map;for(let cte of ctes){let name=_CTEDependencyAnalyzer.getCTEName(cte);dependencyMap.set(name,new Set),dependentMap.set(name,new Set)}dependencyMap.set(_CTEDependencyAnalyzer.MAIN_QUERY_NAME,new Set),dependentMap.set(_CTEDependencyAnalyzer.MAIN_QUERY_NAME,new Set);for(let cte of ctes){let cteName=_CTEDependencyAnalyzer.getCTEName(cte),referencedTables=this.sourceCollector.collect(cte.query);for(let referencedTable of referencedTables){let referencedName=referencedTable.table.name;this.cteMap.has(referencedName)&&referencedName!==cteName&&(dependencyMap.get(cteName).add(referencedName),dependentMap.get(referencedName).add(cteName),edges.push({from:cteName,to:referencedName}))}}let mainQueryWithoutCTE=this.getMainQueryWithoutCTE(mainQuery);if(mainQueryWithoutCTE){let mainQueryReferences=this.cteReferenceCollector.collect(mainQueryWithoutCTE);for(let referencedTable of mainQueryReferences){let referencedName=referencedTable.table.name;this.cteMap.has(referencedName)&&(dependencyMap.get(_CTEDependencyAnalyzer.MAIN_QUERY_NAME).add(referencedName),dependentMap.get(referencedName).add(_CTEDependencyAnalyzer.MAIN_QUERY_NAME),edges.push({from:_CTEDependencyAnalyzer.MAIN_QUERY_NAME,to:referencedName}))}}for(let cte of ctes){let name=_CTEDependencyAnalyzer.getCTEName(cte);nodes.push({name,type:"CTE",cte,dependencies:Array.from(dependencyMap.get(name)||new Set),dependents:Array.from(dependentMap.get(name)||new Set)})}return nodes.push({name:_CTEDependencyAnalyzer.MAIN_QUERY_NAME,type:"ROOT",cte:null,dependencies:Array.from(dependencyMap.get(_CTEDependencyAnalyzer.MAIN_QUERY_NAME)||new Set),dependents:Array.from(dependentMap.get(_CTEDependencyAnalyzer.MAIN_QUERY_NAME)||new Set)}),{nodes,edges}}ensureAnalyzed(){if(!this.dependencyGraph)throw new Error(_CTEDependencyAnalyzer.ERROR_MESSAGES.NOT_ANALYZED)}buildCTEMap(ctes){this.cteMap.clear();for(let cte of ctes){let name=_CTEDependencyAnalyzer.getCTEName(cte);this.cteMap.set(name,cte)}}findNodeByName(cteName){return this.dependencyGraph?.nodes.find(n=>n.name===cteName)}getMainQueryWithoutCTE(query){return query.withClause?new SimpleSelectQuery({selectClause:query.selectClause,fromClause:query.fromClause,whereClause:query.whereClause,groupByClause:query.groupByClause,havingClause:query.havingClause,orderByClause:query.orderByClause,limitClause:query.limitClause,offsetClause:query.offsetClause,fetchClause:query.fetchClause,forClause:query.forClause,windowClause:query.windowClause}):query}static getCTEName(cte){return cte.aliasExpression.table.name}};var CommentEditor=class{static addComment(component,comment,position="before"){if(this.isSelectQuery(component)){let selectQuery=component;selectQuery.headerComments||(selectQuery.headerComments=[]),selectQuery.headerComments.push(comment)}else component.addPositionedComments(position,[comment])}static isSelectQuery(component){return"__selectQueryType"in component&&component.__selectQueryType==="SelectQuery"}static editComment(component,index,newComment,position="before"){if(this.isSelectQuery(component)){let selectQuery=component;if(!selectQuery.headerComments||index<0||index>=selectQuery.headerComments.length)throw new Error(`Invalid comment index: ${index}. Component has ${selectQuery.headerComments?.length||0} comments.`);selectQuery.headerComments[index]=newComment}else{let positionedComments=component.getPositionedComments(position);if(!positionedComments||index<0||index>=positionedComments.length)throw new Error(`Invalid comment index: ${index}. Component has ${positionedComments?.length||0} ${position} positioned comments.`);let positioned=component.positionedComments?.find(pc=>pc.position===position);positioned&&(positioned.comments[index]=newComment)}}static deleteComment(component,index,position="before"){if(this.isSelectQuery(component)){let selectQuery=component;if(!selectQuery.headerComments||index<0||index>=selectQuery.headerComments.length)throw new Error(`Invalid comment index: ${index}. Component has ${selectQuery.headerComments?.length||0} comments.`);selectQuery.headerComments.splice(index,1),selectQuery.headerComments.length===0&&(selectQuery.headerComments=null)}else{let positionedComments=component.getPositionedComments(position);if(!positionedComments||index<0||index>=positionedComments.length)throw new Error(`Invalid comment index: ${index}. Component has ${positionedComments?.length||0} ${position} positioned comments.`);let positioned=component.positionedComments?.find(pc=>pc.position===position);positioned&&(positioned.comments.splice(index,1),positioned.comments.length===0&&(component.positionedComments=component.positionedComments?.filter(pc=>pc.position!==position)||null,component.positionedComments?.length===0&&(component.positionedComments=null)))}}static deleteAllComments(component){if(this.isSelectQuery(component)){let selectQuery=component;selectQuery.headerComments=null}else component.positionedComments=null}static getComments(component){return this.isSelectQuery(component)?component.headerComments||[]:component.getAllPositionedComments()}static findComponentsWithComment(root,searchText,caseSensitive=!1){let results=[],searchTerm=caseSensitive?searchText:searchText.toLowerCase(),traverse=component=>{if(component&&component instanceof SqlComponent){let hasMatchingComment=!1,allPositionedComments=component.getAllPositionedComments();if(allPositionedComments&&allPositionedComments.some(c=>(caseSensitive?c:c.toLowerCase()).includes(searchTerm))&&(hasMatchingComment=!0),this.isSelectQuery(component)){let selectQuery=component;selectQuery.headerComments&&selectQuery.headerComments.some(c=>(caseSensitive?c:c.toLowerCase()).includes(searchTerm))&&(hasMatchingComment=!0)}hasMatchingComment&&results.push(component)}for(let key in component)component[key]&&typeof component[key]=="object"&&(Array.isArray(component[key])?component[key].forEach(traverse):traverse(component[key]))};return traverse(root),results}static replaceInComments(root,searchText,replaceText,caseSensitive=!1){let replacementCount=0,traverse=component=>{if(component&&component instanceof SqlComponent){if(component.comments)for(let i=0;i<component.comments.length;i++){let originalComment=component.comments[i],flags=caseSensitive?"g":"gi",regex=new RegExp(searchText.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),flags),newComment=originalComment.replace(regex,replaceText);newComment!==originalComment&&(component.comments[i]=newComment,replacementCount++)}if(component.positionedComments){for(let posComment of component.positionedComments)if(posComment.comments)for(let i=0;i<posComment.comments.length;i++){let originalComment=posComment.comments[i],flags=caseSensitive?"g":"gi",regex=new RegExp(searchText.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),flags),newComment=originalComment.replace(regex,replaceText);newComment!==originalComment&&(posComment.comments[i]=newComment,replacementCount++)}}if(this.isSelectQuery(component)){let selectQuery=component;if(selectQuery.headerComments)for(let i=0;i<selectQuery.headerComments.length;i++){let originalComment=selectQuery.headerComments[i],flags=caseSensitive?"g":"gi",regex=new RegExp(searchText.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),flags),newComment=originalComment.replace(regex,replaceText);newComment!==originalComment&&(selectQuery.headerComments[i]=newComment,replacementCount++)}}}for(let key in component)component[key]&&typeof component[key]=="object"&&(Array.isArray(component[key])?component[key].forEach(traverse):traverse(component[key]))};return traverse(root),replacementCount}static countComments(root){let count=0,traverse=component=>{if(component&&component instanceof SqlComponent){let positionedComments=component.getAllPositionedComments();if(positionedComments&&(count+=positionedComments.length),this.isSelectQuery(component)){let selectQuery=component;selectQuery.headerComments&&(count+=selectQuery.headerComments.length)}}for(let key in component)component[key]&&typeof component[key]=="object"&&(Array.isArray(component[key])?component[key].forEach(traverse):traverse(component[key]))};return traverse(root),count}static getAllComments(root){let results=[],traverse=component=>{if(component&&component instanceof SqlComponent){let positionedComments=component.getAllPositionedComments();if(positionedComments&&positionedComments.forEach((comment,index)=>{results.push({comment,component,index})}),this.isSelectQuery(component)){let selectQuery=component;selectQuery.headerComments&&selectQuery.headerComments.forEach((comment,index)=>{results.push({comment,component,index})})}}for(let key in component)component[key]&&typeof component[key]=="object"&&(Array.isArray(component[key])?component[key].forEach(traverse):traverse(component[key]))};return traverse(root),results}};var TableSchema=class{constructor(name,columns){this.name=name,this.columns=columns}},SchemaCollector=class{constructor(tableColumnResolver=null,allowWildcardWithoutResolver=!1){this.tableColumnResolver=tableColumnResolver;this.allowWildcardWithoutResolver=allowWildcardWithoutResolver;this.tableSchemas=[];this.visitedNodes=new Set;this.commonTables=[];this.running=!1;this.unresolvedColumns=[];this.analysisError=void 0;this.isAnalyzeMode=!1;this.handlers=new Map,this.handlers.set(SimpleSelectQuery.kind,expr=>this.visitSimpleSelectQuery(expr)),this.handlers.set(BinarySelectQuery.kind,expr=>this.visitBinarySelectQuery(expr))}collect(arg){return this.visit(arg),this.tableSchemas}analyze(arg){this.isAnalyzeMode=!0;try{return this.visit(arg),{success:this.unresolvedColumns.length===0&&!this.analysisError,schemas:this.tableSchemas,unresolvedColumns:this.unresolvedColumns,error:this.analysisError}}finally{this.isAnalyzeMode=!1}}visit(arg){if(this.running){this.visitNode(arg);return}this.reset(),this.running=!0;try{if(!(arg instanceof SimpleSelectQuery||arg instanceof BinarySelectQuery))throw new Error(`Unsupported SQL component type for schema collection. Received: ${arg.constructor.name}. Expected: SimpleSelectQuery or BinarySelectQuery.`);let cteCollector=new CTECollector;this.commonTables=cteCollector.collect(arg),this.visitNode(arg),this.consolidateTableSchemas()}finally{this.running=!1}}visitNode(arg){if(this.visitedNodes.has(arg))return;this.visitedNodes.add(arg);let handler=this.handlers.get(arg.getKind());if(handler){handler(arg);return}}reset(){this.tableSchemas=[],this.visitedNodes=new Set,this.commonTables=[],this.unresolvedColumns=[],this.analysisError=void 0}consolidateTableSchemas(){let consolidatedSchemas=new Map;for(let schema of this.tableSchemas)if(!consolidatedSchemas.has(schema.name))consolidatedSchemas.set(schema.name,new Set(schema.columns));else{let existingColumns=consolidatedSchemas.get(schema.name);schema.columns.forEach(column=>existingColumns?.add(column))}this.tableSchemas=Array.from(consolidatedSchemas.entries()).sort(([nameA],[nameB])=>nameA.localeCompare(nameB)).map(([name,columns])=>new TableSchema(name,Array.from(columns).sort()))}handleSourceExpression(source,queryColumns,includeUnnamed){if(source.datasource instanceof TableSource){let tableName=source.datasource.getSourceName(),cte=this.commonTables.filter(table=>table.getSourceAliasName()===tableName);if(cte.length>0){cte[0].query.accept(this);let cteAlias=source.getAliasName()??tableName;this.processCTETableSchema(cte[0],cteAlias,queryColumns,includeUnnamed)}else{let tableAlias=source.getAliasName()??tableName;this.processCollectTableSchema(tableName,tableAlias,queryColumns,includeUnnamed)}}else source.datasource instanceof SubQuerySource&&this.visitNode(source.datasource.query)}visitSimpleSelectQuery(query){if(query.fromClause===null)return;let columns=new SelectableColumnCollector(this.tableColumnResolver,!0,"fullName").collect(query),queryColumns;if(this.allowWildcardWithoutResolver){let selectColumns=this.getSelectClauseColumns(query);queryColumns=columns.filter(column=>column.value instanceof ColumnReference).map(column=>column.value).filter(columnRef=>{let tableName=columnRef.getNamespace(),columnName=columnRef.column.name;return selectColumns.some(selectCol=>{if(selectCol.value instanceof ColumnReference){let selectTableName=selectCol.value.getNamespace(),selectColumnName=selectCol.value.column.name;if(selectTableName===tableName&&selectColumnName===columnName)return!0;if(selectColumnName==="*"){if(this.allowWildcardWithoutResolver&&this.tableColumnResolver===null)return!1;if(selectTableName===""||selectTableName===tableName)return!0}}return!1})}).map(columnRef=>({table:columnRef.getNamespace(),column:columnRef.column.name}))}else queryColumns=columns.filter(column=>column.value instanceof ColumnReference).map(column=>column.value).map(columnRef=>({table:columnRef.getNamespace(),column:columnRef.column.name}));if(query.fromClause.joins!==null&&query.fromClause.joins.length>0){let columnsWithoutTable=queryColumns.filter(columnRef=>columnRef.table==="").map(columnRef=>columnRef.column);if(columnsWithoutTable.length>0)if(this.isAnalyzeMode)this.unresolvedColumns.push(...columnsWithoutTable),this.analysisError=`Column reference(s) without table name found in query: ${columnsWithoutTable.join(", ")}`;else throw new Error(`Column reference(s) without table name found in query: ${columnsWithoutTable.join(", ")}`)}if(query.fromClause.source.datasource instanceof TableSource?this.handleSourceExpression(query.fromClause.source,queryColumns,!0):query.fromClause.source.datasource instanceof SubQuerySource&&query.fromClause.source.datasource.query.accept(this),query.fromClause?.joins)for(let join of query.fromClause.joins)join.source.datasource instanceof TableSource?this.handleSourceExpression(join.source,queryColumns,!1):join.source.datasource instanceof SubQuerySource&&join.source.datasource.query.accept(this)}visitBinarySelectQuery(query){this.visitNode(query.left),this.visitNode(query.right)}getSelectClauseColumns(query){if(!query.selectClause)return[];let selectColumns=[];for(let item of query.selectClause.items)if(item.value instanceof ColumnReference){let columnName=item.value.column.name;selectColumns.push({name:columnName,value:item.value})}return selectColumns}processCollectTableSchema(tableName,tableAlias,queryColumns,includeUnnamed=!1){if(this.tableColumnResolver===null&&queryColumns.filter(columnRef=>columnRef.table===tableAlias||includeUnnamed&&columnRef.table==="").filter(columnRef=>columnRef.column==="*").length>0&&!this.allowWildcardWithoutResolver){let errorMessage=tableName?`Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards. Target table: ${tableName}`:"Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards.";if(this.isAnalyzeMode){this.analysisError=errorMessage;let wildcardColumns=queryColumns.filter(columnRef=>columnRef.table===tableAlias||includeUnnamed&&columnRef.table==="").filter(columnRef=>columnRef.column==="*").map(columnRef=>columnRef.table?`${columnRef.table}.*`:"*");this.unresolvedColumns.push(...wildcardColumns)}else throw new Error(errorMessage)}let tableColumns=queryColumns.filter(columnRef=>columnRef.column!=="*").filter(columnRef=>columnRef.table===tableAlias||includeUnnamed&&columnRef.table==="").map(columnRef=>columnRef.column),tableSchema=new TableSchema(tableName,tableColumns);this.tableSchemas.push(tableSchema)}processCTETableSchema(cte,cteAlias,queryColumns,includeUnnamed=!1){let cteName=cte.getSourceAliasName(),cteColumns=this.getCTEColumns(cte),cteReferencedColumns=queryColumns.filter(columnRef=>columnRef.table===cteAlias||includeUnnamed&&columnRef.table==="").map(columnRef=>columnRef.column);if(cteReferencedColumns.includes("*")){if(this.tableColumnResolver!==null){let resolvedColumns=this.tableColumnResolver(cteName);if(resolvedColumns.length>0){let tableSchema2=new TableSchema(cteName,resolvedColumns);this.tableSchemas.push(tableSchema2);return}}if(cteColumns.length>0){let tableSchema2=new TableSchema(cteName,cteColumns);this.tableSchemas.push(tableSchema2);return}else if(this.allowWildcardWithoutResolver){let tableSchema2=new TableSchema(cteName,[]);this.tableSchemas.push(tableSchema2);return}else{let errorMessage=`Wildcard (*) is used. A TableColumnResolver is required to resolve wildcards. Target table: ${cteName}`;if(this.isAnalyzeMode)this.analysisError=errorMessage,this.unresolvedColumns.push(cteAlias?`${cteAlias}.*`:"*");else throw new Error(errorMessage);return}}let tableColumns=cteReferencedColumns.filter(column=>column!=="*");if(this.isAnalyzeMode){let availableColumns=cteColumns;if(this.tableColumnResolver){let resolvedColumns=this.tableColumnResolver(cteName);resolvedColumns.length>0&&(availableColumns=resolvedColumns)}if(availableColumns.length>0){let invalidColumns=tableColumns.filter(column=>!availableColumns.includes(column));invalidColumns.length>0&&(this.unresolvedColumns.push(...invalidColumns),this.analysisError||(this.analysisError=`Undefined column(s) found in CTE "${cteName}": ${invalidColumns.join(", ")}`))}else if(!this.allowWildcardWithoutResolver){let invalidColumns=tableColumns;invalidColumns.length>0&&(this.unresolvedColumns.push(...invalidColumns),this.analysisError||(this.analysisError=`Undefined column(s) found in CTE "${cteName}": ${invalidColumns.join(", ")}`))}}let tableSchema=new TableSchema(cteName,tableColumns);this.tableSchemas.push(tableSchema)}getCTEColumns(cte){try{return cte.query instanceof SimpleSelectQuery&&cte.query.selectClause?this.extractColumnsFromSelectItems(cte.query.selectClause.items,cte):this.extractColumnsUsingCollector(cte.query)}catch{return[]}}extractColumnsFromSelectItems(selectItems,cte){let columns=[];for(let item of selectItems)if(item.value instanceof ColumnReference){let columnName=item.identifier?.name||item.value.column.name;if(item.value.column.name==="*"){let wildcardColumns=this.resolveWildcardInCTE(item.value,cte);if(wildcardColumns===null)return[];columns.push(...wildcardColumns)}else columns.push(columnName)}else item.identifier&&columns.push(item.identifier.name);return this.removeDuplicates(columns)}resolveWildcardInCTE(columnRef,cte){let tableNamespace=columnRef.getNamespace();return tableNamespace?this.resolveQualifiedWildcard(tableNamespace):this.resolveUnqualifiedWildcard(cte)}resolveQualifiedWildcard(tableNamespace){let referencedCTE=this.commonTables.find(cte=>cte.getSourceAliasName()===tableNamespace);if(referencedCTE){let referencedColumns=this.getCTEColumns(referencedCTE);if(referencedColumns.length>0)return referencedColumns}return null}resolveUnqualifiedWildcard(cte){if(!(cte.query instanceof SimpleSelectQuery)||!cte.query.fromClause)return null;let fromSource=cte.query.fromClause.source;return fromSource.datasource instanceof TableSource?this.resolveTableWildcard(fromSource.datasource.table.name):(fromSource.datasource instanceof SubQuerySource,null)}resolveTableWildcard(tableName){if(this.tableColumnResolver){let resolvedColumns=this.tableColumnResolver(tableName);if(resolvedColumns.length>0)return resolvedColumns}return this.allowWildcardWithoutResolver,null}extractColumnsUsingCollector(query){return new SelectableColumnCollector(null,!0,"fullName").collect(query).filter(column=>column.value instanceof ColumnReference).map(column=>column.value).map(columnRef=>columnRef.column.name).filter((name,index,array)=>array.indexOf(name)===index)}removeDuplicates(columns){return columns.filter((name,index,array)=>array.indexOf(name)===index)}};var SqlSchemaValidator=class{static validate(sql,tableResolver){let sqlComponent=typeof sql=="string"?SelectQueryParser.parse(sql):sql,resolver=Array.isArray(tableResolver)?tableName=>{let schema=tableResolver.find(t=>t.name===tableName);return schema?schema.columns:[]}:tableResolver,tableSchemas=new SchemaCollector(resolver).collect(sqlComponent),errors=[];for(let tableSchema of tableSchemas){let resolvedColumns=resolver(tableSchema.name);if(resolvedColumns.length===0){errors.push(`Table '${tableSchema.name}' is not defined.`);continue}let undefinedColumns=tableSchema.columns.filter(column=>!resolvedColumns.includes(column));undefinedColumns.length>0&&errors.push(`Table '${tableSchema.name}' contains undefined columns: ${undefinedColumns.join(", ")}.`)}if(errors.length>0)throw new Error(errors.join(`
28
+ `))}};var CTEComposer=class{constructor(options={}){this.knownCTENames=[];this.options=options,this.formatter=new SqlFormatter(options),this.dependencyAnalyzer=new CTEDependencyAnalyzer}compose(editedCTEs,rootQuery){if(editedCTEs.length===0)return rootQuery;this.knownCTENames=editedCTEs.map(cte=>cte.name);let pureQueries=editedCTEs.map(cte=>({name:cte.name,query:this.extractPureQuery(cte.query,cte.name)})),tempQuery=this.buildTempQueryForAnalysis(pureQueries,rootQuery),dependencyGraph=this.dependencyAnalyzer.analyzeDependencies(tempQuery),sortedCTEs=this.sortCTEsByDependencies(pureQueries,dependencyGraph),isRecursive=this.detectRecursiveFromOriginalQueries(editedCTEs),cteDefinitions=sortedCTEs.map(cte=>`${cte.name} as (${cte.query})`),composedQuery=`${isRecursive?"with recursive":"with"} ${cteDefinitions.join(", ")} ${rootQuery}`;return this.options.validateSchema&&this.options.schema&&this.validateComposedQuery(composedQuery),this.formatFinalQuery(composedQuery)}extractPureQuery(query,cteName){if(!/^\s*with\s+/i.test(query)||/^\s*with\s+recursive\s+/i.test(query))return query;try{let parsed=SelectQueryParser.parse(query);if(parsed.withClause&&parsed.withClause.tables){let knownCTENames=this.getKnownCTENames();if(parsed.withClause.tables.map(cte=>this.getCTEName(cte)).every(name=>knownCTENames.includes(name))){let queryWithoutWith=new SimpleSelectQuery({selectClause:parsed.selectClause,fromClause:parsed.fromClause,whereClause:parsed.whereClause,groupByClause:parsed.groupByClause,havingClause:parsed.havingClause,orderByClause:parsed.orderByClause,windowClause:parsed.windowClause,limitClause:parsed.limitClause,offsetClause:parsed.offsetClause,fetchClause:parsed.fetchClause,forClause:parsed.forClause,withClause:void 0});return new SqlFormatter({identifierEscape:{start:"",end:""}}).format(queryWithoutWith).formattedSql}}}catch{}return query}getKnownCTENames(){return this.knownCTENames||[]}getCTEName(cte){return cte.aliasExpression.table.name}extractCTEWithRegex(query,cteName){let ctePattern=new RegExp(`${cteName}\\s+as\\s*\\(`,"i"),match=query.match(ctePattern);if(!match)return query;let startIndex=match.index+match[0].length,parenCount=1,endIndex=startIndex;for(;endIndex<query.length&&parenCount>0;){let char=query[endIndex];char==="("?parenCount++:char===")"&&parenCount--,endIndex++}return parenCount===0?query.substring(startIndex,endIndex-1).trim():query}buildTempQueryForAnalysis(pureQueries,rootQuery){let tempSql=`with ${pureQueries.map(cte=>`${cte.name} as (${cte.query})`).join(", ")} ${rootQuery}`;try{return SelectQueryParser.parse(tempSql)}catch(error){throw new Error(`Failed to parse temporary query for dependency analysis: ${error}`)}}sortCTEsByDependencies(pureQueries,dependencyGraph){let queryMap=new Map;return pureQueries.forEach(cte=>queryMap.set(cte.name,cte.query)),dependencyGraph.nodes.map(node=>({name:node.name,query:queryMap.get(node.name)||""})).filter(cte=>cte.query!=="")}detectRecursiveFromOriginalQueries(editedCTEs){return editedCTEs.some(cte=>cte.query.toLowerCase().includes("with recursive"))}detectRecursiveCTEs(query){return query.withClause?this.formatter.format(query).formattedSql.toLowerCase().includes("with recursive"):!1}validateComposedQuery(composedQuery){try{let parsed=SelectQueryParser.parse(composedQuery),tableSchemas=Object.entries(this.options.schema).map(([name,columns])=>({name,columns}));SqlSchemaValidator.validate(parsed,tableSchemas)}catch(error){throw error instanceof Error?new Error(`Schema validation failed: ${error.message}`):error}}formatFinalQuery(composedQuery){if(this.options.preset||this.options.keywordCase)try{let parsed=SelectQueryParser.parse(composedQuery);return this.formatter.format(parsed).formattedSql}catch{return composedQuery}return composedQuery}};var CTEQueryDecomposer=class _CTEQueryDecomposer{static{this.ERROR_MESSAGES={CIRCULAR_REFERENCE:"Circular reference detected in non-recursive CTEs",PARSING_FAILED:"Failed to parse query for comment injection"}}static{this.COMMENT_TEXTS={AUTO_GENERATED:"Auto-generated by CTE decomposer",ORIGINAL_CTE:"Original CTE:",DEPENDENCIES:"Dependencies:",DEPENDENTS:"Dependents:",RECURSIVE_TYPE:"Type: Recursive CTE",NONE:"none"}}constructor(options={}){this.options=options,this.dependencyAnalyzer=new CTEDependencyAnalyzer,this.cteCollector=new CTECollector,this.formatter=new SqlFormatter(options)}decompose(query){let ctes=this.cteCollector.collect(query);if(ctes.length===0)return[];let recursiveCTEs=this.findRecursiveCTEs(query,ctes),dependencyGraph=this.dependencyAnalyzer.analyzeDependencies(query);return this.validateCircularDependencies(recursiveCTEs.length>0),this.processCTENodes(query,dependencyGraph.nodes,recursiveCTEs)}synchronize(editedCTEs,rootQuery){if(editedCTEs.length===0)return[];let flattenedCTEs=this.flattenNestedWithClauses(editedCTEs),composerOptions={...this.options,addComments:void 0},unifiedQuery=new CTEComposer(composerOptions).compose(flattenedCTEs,rootQuery),parsedQuery=SelectQueryParser.parse(unifiedQuery);return this.decompose(parsedQuery)}extractCTE(query,cteName){let warnings=[],allCTEs=this.cteCollector.collect(query);if(allCTEs.length===0)throw new Error("Query does not contain any CTEs");if(!allCTEs.find(cte=>this.getCTEName(cte)===cteName))throw new Error(`CTE not found in query: ${cteName}`);if(this.findRecursiveCTEs(query,allCTEs).includes(cteName))return warnings.push("Recursive CTE restoration requires the full query context"),{name:cteName,executableSql:this.formatter.format(query).formattedSql,dependencies:this.getAllCTENames(allCTEs).filter(name=>name!==cteName),warnings};let dependencyGraph=this.dependencyAnalyzer.analyzeDependencies(query);if(this.dependencyAnalyzer.hasCircularDependency())throw new Error("Circular dependency detected in CTEs");let targetNode=dependencyGraph.nodes.find(node=>node.name===cteName);if(!targetNode||!targetNode.cte)throw new Error(`CTE not found in dependency graph: ${cteName}`);let executableSql=this.buildExecutableQuery(targetNode,dependencyGraph.nodes),allDependencies=this.collectRequiredCTEs(targetNode,dependencyGraph.nodes).map(node=>node.name),finalSql=this.options.addComments?this.addRestorationComments(executableSql,targetNode,warnings):executableSql;return{name:cteName,executableSql:finalSql,dependencies:allDependencies,warnings}}flattenNestedWithClauses(editedCTEs){let flattened=[],extractedCTEs=new Map;for(let editedCTE of editedCTEs)try{if(/^\s*with\s+/i.test(editedCTE.query)){let parsed=SelectQueryParser.parse(editedCTE.query);if(parsed.withClause&&parsed.withClause.tables){for(let nestedCTE of parsed.withClause.tables){let cteName=this.getCTEName(nestedCTE);if(!extractedCTEs.has(cteName)){let nestedQuery=new SqlFormatter({identifierEscape:{start:"",end:""}}).format(nestedCTE.query).formattedSql;extractedCTEs.set(cteName,nestedQuery)}}let mainQueryWithoutWith=new SimpleSelectQuery({selectClause:parsed.selectClause,fromClause:parsed.fromClause,whereClause:parsed.whereClause,groupByClause:parsed.groupByClause,havingClause:parsed.havingClause,orderByClause:parsed.orderByClause,windowClause:parsed.windowClause,limitClause:parsed.limitClause,offsetClause:parsed.offsetClause,fetchClause:parsed.fetchClause,forClause:parsed.forClause,withClause:void 0}),mainQuery=new SqlFormatter({identifierEscape:{start:"",end:""}}).format(mainQueryWithoutWith).formattedSql;flattened.push({name:editedCTE.name,query:mainQuery})}else flattened.push(editedCTE)}else flattened.push(editedCTE)}catch{flattened.push(editedCTE)}let result=[];for(let[name,query]of extractedCTEs)result.push({name,query});return result.push(...flattened),result}validateCircularDependencies(hasRecursiveCTEs){if(this.dependencyAnalyzer.hasCircularDependency()&&!hasRecursiveCTEs)throw new Error(_CTEQueryDecomposer.ERROR_MESSAGES.CIRCULAR_REFERENCE)}processCTENodes(query,nodes,recursiveCTEs){let result=[];for(let node of nodes){if(node.type==="ROOT")continue;recursiveCTEs.includes(node.name)?result.push(this.createRecursiveCTE(node,query)):result.push(this.createStandardCTE(node,nodes))}return result}createRecursiveCTE(node,query){let formattedQuery=this.formatter.format(query).formattedSql,cteDependents=node.dependents.filter(dep=>dep!=="MAIN_QUERY"),finalQuery=this.addCommentsToQuery(formattedQuery,node.name,node.dependencies,node.dependents,!0);return{name:node.name,query:finalQuery,dependencies:[...node.dependencies],dependents:cteDependents,isRecursive:!0}}createStandardCTE(node,allNodes){let query=this.buildExecutableQuery(node,allNodes),finalQuery=this.addCommentsToQuery(query,node.name,node.dependencies,node.dependents,!1),cteDependents=node.dependents.filter(dep=>dep!=="MAIN_QUERY");return{name:node.name,query:finalQuery,dependencies:[...node.dependencies],dependents:cteDependents,isRecursive:!1}}buildExecutableQuery(targetNode,allNodes){if(targetNode.type==="ROOT"||!targetNode.cte)throw new Error(`Cannot build executable query for ROOT node: ${targetNode.name}`);let requiredCTEs=this.collectRequiredCTEs(targetNode,allNodes);if(requiredCTEs.length===0)return this.formatter.format(targetNode.cte.query).formattedSql;let withClause=this.buildWithClause(requiredCTEs),mainQuery=this.formatter.format(targetNode.cte.query).formattedSql;return`${withClause} ${mainQuery}`}collectRequiredCTEs(targetNode,allNodes){let visited=new Set,result=[],nodeMap=new Map;for(let node of allNodes)nodeMap.set(node.name,node);let collectDependencies=nodeName=>{if(visited.has(nodeName))return;visited.add(nodeName);let node=nodeMap.get(nodeName);if(node){for(let depName of node.dependencies)collectDependencies(depName);nodeName!==targetNode.name&&node.type!=="ROOT"&&result.push(node)}};for(let depName of targetNode.dependencies)collectDependencies(depName);return result}buildWithClause(requiredCTEs){return requiredCTEs.length===0?"":`with ${requiredCTEs.map(node=>{if(node.type==="ROOT"||!node.cte)throw new Error(`Cannot include ROOT node in WITH clause: ${node.name}`);let cteName=node.name,cteQuery=this.formatter.format(node.cte.query).formattedSql;return`${cteName} as (${cteQuery})`}).join(", ")}`}findRecursiveCTEs(query,ctes){return!query.withClause||!this.isRecursiveWithClause(query)?[]:ctes.map(cte=>this.getCTEName(cte))}isRecursiveWithClause(query){return this.formatter.format(query).formattedSql.toLowerCase().includes("with recursive")}addCommentsToQuery(query,cteName,dependencies,dependents,isRecursive){if(this.options.addComments!==!0)return query;try{let parsedQuery=SelectQueryParser.parse(query);return this.generateComments(cteName,dependencies,dependents,isRecursive).forEach(comment=>{CommentEditor.addComment(parsedQuery,comment)}),new SqlFormatter({...this.options,exportComment:!0}).format(parsedQuery).formattedSql}catch(error){return console.warn(`${_CTEQueryDecomposer.ERROR_MESSAGES.PARSING_FAILED}: ${error}`),this.addTextCommentsToQuery(query,cteName,dependencies,dependents,isRecursive)}}generateComments(cteName,dependencies,dependents,isRecursive){let{AUTO_GENERATED,ORIGINAL_CTE,DEPENDENCIES,DEPENDENTS,RECURSIVE_TYPE,NONE}=_CTEQueryDecomposer.COMMENT_TEXTS,comments=[];comments.push(AUTO_GENERATED),comments.push(`${ORIGINAL_CTE} ${cteName}`),isRecursive&&comments.push(RECURSIVE_TYPE);let depsText=dependencies.length>0?dependencies.join(", "):NONE;comments.push(`${DEPENDENCIES} ${depsText}`);let cteDependents=dependents.filter(dep=>dep!=="MAIN_QUERY"),dependentsText=cteDependents.length>0?cteDependents.join(", "):NONE;return comments.push(`${DEPENDENTS} ${dependentsText}`),comments}addTextCommentsToQuery(query,cteName,dependencies,dependents,isRecursive){return`${this.generateComments(cteName,dependencies,dependents,isRecursive).map(comment=>`-- ${comment}`).join(`
27
29
  `)}
28
- ${e}`}addRestorationComments(e,t,n){let i=[];return i.push("-- CTE Restoration: "+t.name),t.dependencies.length>0?i.push("-- Dependencies: "+t.dependencies.join(", ")):i.push("-- Dependencies: none"),n.length>0&&i.push("-- Warnings: "+n.join(", ")),i.push("-- Generated by CTEQueryDecomposer.extractCTE()"),i.push(""),i.join(`
29
- `)+e}getAllCTENames(e){return e.map(t=>this.getCTEName(t))}getCTEName(e){return e.aliasExpression.table.name}};var Vt=class{constructor(){this.columnReferences=[];this.visitedNodes=new Set;this.handlers=new Map,this.handlers.set(ae.kind,e=>this.visitWithClause(e)),this.handlers.set(ie.kind,e=>this.visitCommonTable(e)),this.handlers.set(q.kind,e=>this.visitSelectClause(e)),this.handlers.set(K.kind,e=>this.visitFromClause(e)),this.handlers.set(re.kind,e=>this.visitWhereClause(e)),this.handlers.set(me.kind,e=>this.visitGroupByClause(e)),this.handlers.set(de.kind,e=>this.visitHavingClause(e)),this.handlers.set(pe.kind,e=>this.visitOrderByClause(e)),this.handlers.set(nt.kind,e=>this.visitWindowsClause(e)),this.handlers.set(oe.kind,e=>this.visitLimitClause(e)),this.handlers.set(Fe.kind,e=>this.visitOffsetClause(e)),this.handlers.set(Ke.kind,e=>this.visitFetchClause(e)),this.handlers.set(Ae.kind,e=>this.visitForClause(e)),this.handlers.set(fe.kind,e=>this.visitJoinClause(e)),this.handlers.set(he.kind,e=>this.visitJoinOnClause(e)),this.handlers.set(Se.kind,e=>this.visitJoinUsingClause(e)),this.handlers.set(B.kind,e=>this.visitSourceExpression(e)),this.handlers.set(M.kind,e=>this.visitSubQuerySource(e)),this.handlers.set(b.kind,e=>this.visitColumnReference(e)),this.handlers.set(S.kind,e=>this.visitBinaryExpression(e)),this.handlers.set(ne.kind,e=>this.visitUnaryExpression(e)),this.handlers.set(U.kind,e=>this.visitFunctionCall(e)),this.handlers.set(se.kind,e=>this.visitCaseExpression(e)),this.handlers.set(ce.kind,e=>this.visitCastExpression(e)),this.handlers.set(we.kind,e=>this.visitBetweenExpression(e)),this.handlers.set(Z.kind,e=>this.visitParenExpression(e)),this.handlers.set(ge.kind,e=>this.visitInlineQuery(e)),this.handlers.set(ye.kind,e=>this.visitArrayExpression(e)),this.handlers.set(ve.kind,e=>this.visitArrayQueryExpression(e)),this.handlers.set(D.kind,e=>this.visitValueList(e)),this.handlers.set(Ve.kind,e=>this.visitWindowFrameExpression(e))}collect(e){return this.columnReferences=[],this.visitedNodes.clear(),e instanceof g?this.collectFromSimpleQuery(e):e instanceof Q?this.collectFromSimpleQuery(e.toSimpleQuery()):e.accept(this),[...this.columnReferences]}collectFromSimpleQuery(e){if(e.withClause&&e.withClause.tables)for(let t of e.withClause.tables)this.collectFromSimpleQuery(t.query);if(this.collectFromSelectClause(e.selectClause),e.fromClause&&this.collectFromFromClause(e.fromClause),e.whereClause&&this.collectFromValueComponent(e.whereClause.condition),e.groupByClause&&e.groupByClause.grouping)for(let t of e.groupByClause.grouping)this.collectFromValueComponent(t);if(e.havingClause&&this.collectFromValueComponent(e.havingClause.condition),e.orderByClause&&e.orderByClause.order)for(let t of e.orderByClause.order)typeof t=="object"&&"value"in t&&t.value?this.collectFromValueComponent(t.value):this.collectFromValueComponent(t)}collectFromSelectClause(e){for(let t of e.items)this.collectFromValueComponent(t.value)}collectFromFromClause(e){if(this.collectFromSourceExpression(e.source),e.joins)for(let t of e.joins)this.collectFromSourceExpression(t.source),t.condition&&this.collectFromValueComponent(t.condition.condition)}collectFromSourceExpression(e){e.datasource instanceof M&&(e.datasource.query instanceof g?this.collectFromSimpleQuery(e.datasource.query):e.datasource.query instanceof Q&&this.collectFromSimpleQuery(e.datasource.query.toSimpleQuery()))}collectFromValueComponent(e){if(e instanceof b)this.columnReferences.push(e);else if(e instanceof S)this.collectFromValueComponent(e.left),this.collectFromValueComponent(e.right);else if(e instanceof ne)this.collectFromValueComponent(e.expression);else if(e instanceof U&&e.argument)this.collectFromValueComponent(e.argument);else if(e instanceof se){if(e.condition&&this.collectFromValueComponent(e.condition),e.switchCase&&e.switchCase.cases)for(let t of e.switchCase.cases)this.collectFromValueComponent(t.key),this.collectFromValueComponent(t.value);e.switchCase&&e.switchCase.elseValue&&this.collectFromValueComponent(e.switchCase.elseValue)}else e instanceof Z?this.collectFromValueComponent(e.expression):e instanceof ge&&(e.selectQuery instanceof g?this.collectFromSimpleQuery(e.selectQuery):e.selectQuery instanceof Q&&this.collectFromSimpleQuery(e.selectQuery.toSimpleQuery()))}visit(e){if(this.visitedNodes.has(e))return;this.visitedNodes.add(e);let t=this.handlers.get(e.getKind());t&&t(e)}visitSimpleSelectQuery(e){e.withClause&&e.withClause.accept(this),e.selectClause.accept(this),e.fromClause&&e.fromClause.accept(this),e.whereClause&&e.whereClause.accept(this),e.groupByClause&&e.groupByClause.accept(this),e.havingClause&&e.havingClause.accept(this),e.orderByClause&&e.orderByClause.accept(this),e.windowClause&&e.windowClause.accept(this),e.limitClause&&e.limitClause.accept(this),e.offsetClause&&e.offsetClause.accept(this),e.fetchClause&&e.fetchClause.accept(this),e.forClause&&e.forClause.accept(this)}visitWithClause(e){for(let t of e.tables)t.accept(this)}visitCommonTable(e){e.query.accept(this)}visitSelectClause(e){for(let t of e.items)t.value.accept(this)}visitFromClause(e){if(e.source.accept(this),e.joins)for(let t of e.joins)t.accept(this)}visitWhereClause(e){e.condition.accept(this)}visitGroupByClause(e){if(e.grouping)for(let t of e.grouping)t.accept(this)}visitHavingClause(e){e.condition.accept(this)}visitOrderByClause(e){if(e.order)for(let t of e.order)typeof t=="object"&&"value"in t&&t.value?typeof t.value=="object"&&"accept"in t.value&&t.value.accept(this):typeof t=="object"&&"accept"in t&&t.accept(this)}visitWindowsClause(e){for(let t of e.windows)t.expression.accept(this)}visitLimitClause(e){e.value.accept(this)}visitOffsetClause(e){e.value.accept(this)}visitFetchClause(e){e.expression.accept(this)}visitForClause(e){}visitJoinClause(e){e.source.accept(this),e.condition&&e.condition.accept(this)}visitJoinOnClause(e){e.condition.accept(this)}visitJoinUsingClause(e){e.condition.accept(this)}visitSourceExpression(e){e.datasource.accept(this)}visitSubQuerySource(e){e.query.accept(this)}visitColumnReference(e){this.columnReferences.push(e)}visitBinaryExpression(e){e.left.accept(this),e.right.accept(this)}visitUnaryExpression(e){e.expression.accept(this)}visitFunctionCall(e){e.argument&&e.argument.accept(this)}visitCaseExpression(e){if(e.condition&&e.condition.accept(this),e.switchCase&&e.switchCase.cases)for(let t of e.switchCase.cases)t.key.accept(this),t.value.accept(this);e.switchCase&&e.switchCase.elseValue&&e.switchCase.elseValue.accept(this)}visitCastExpression(e){e.input.accept(this)}visitBetweenExpression(e){e.expression.accept(this),e.lower.accept(this),e.upper.accept(this)}visitParenExpression(e){e.expression.accept(this)}visitInlineQuery(e){e.selectQuery.accept(this)}visitArrayExpression(e){e.expression&&e.expression.accept(this)}visitArrayQueryExpression(e){e.query.accept(this)}visitValueList(e){if(e.values)for(let t of e.values)t.accept(this)}visitWindowFrameExpression(e){e.partition&&e.partition.accept(this),e.order&&e.order.accept(this)}};var Ze={nullQuery:"Query cannot be null or undefined",invalidOldName:"Old CTE name must be a non-empty string",invalidNewName:"New CTE name must be a non-empty string",sameNames:"Old and new CTE names cannot be the same",unsupportedQuery:"Unsupported query type for CTE renaming",cteNotExists:a=>`CTE '${a}' does not exist`,cteAlreadyExists:a=>`CTE '${a}' already exists`,cteNotFound:a=>`CTE '${a}' not found`},Zn=class{constructor(){this.dependencyAnalyzer=new ft,this.columnReferenceCollector=new Vt,this.tableSourceCollector=new Ge,this.keywordParser=new Te(Kt)}renameCTE(e,t,n){this.validateInputs(e,t,n);let i=t.trim(),s=n.trim();if(e instanceof g)this.renameInSimpleQuery(e,i,s);else if(e instanceof Q)this.renameInBinaryQuery(e,i,s);else throw new Error(Ze.unsupportedQuery)}validateInputs(e,t,n){if(!e)throw new Error(Ze.nullQuery);if(!t||typeof t!="string"||t.trim()==="")throw new Error(Ze.invalidOldName);if(!n||typeof n!="string"||n.trim()==="")throw new Error(Ze.invalidNewName);if(t.trim()===n.trim())throw new Error(Ze.sameNames)}renameInSimpleQuery(e,t,n){let i=e.getCTENames();if(!i.includes(t))throw new Error(Ze.cteNotExists(t));if(i.includes(n))throw new Error(Ze.cteAlreadyExists(n));this.renameCTEDefinition(e,t,n),this.updateAllReferences(e,t,n)}renameInBinaryQuery(e,t,n){let i=e.toSimpleQuery(),s=[];if(i.withClause&&i.withClause.tables&&(s=i.withClause.tables.map(r=>r.aliasExpression.table.name)),!s.includes(t))throw new Error(Ze.cteNotExists(t));if(s.includes(n))throw new Error(Ze.cteAlreadyExists(n));this.renameCTEDefinition(i,t,n),i.withClause&&(e.withClause=i.withClause,e.left instanceof g&&(e.left.withClause=i.withClause)),this.renameInSelectQuery(e.left,t,n),this.renameInSelectQuery(e.right,t,n)}renameInSelectQuery(e,t,n){e instanceof g?this.updateAllReferences(e,t,n):e instanceof Q&&(this.renameInSelectQuery(e.left,t,n),this.renameInSelectQuery(e.right,t,n))}renameCTEDefinition(e,t,n){if(!e.withClause||!e.withClause.tables)throw new Error(Ze.cteNotFound(t));let i=e.withClause.tables.find(s=>s.aliasExpression.table.name===t);if(!i)throw new Error(Ze.cteNotFound(t));i.aliasExpression.table.name=n}updateAllReferences(e,t,n){let i=this.columnReferenceCollector.collect(e);for(let r of i)if(r.namespaces&&r.namespaces.length>0){for(let o of r.namespaces)if(o.name===t){o.name=n;break}}let s=this.tableSourceCollector.collect(e);for(let r of s)r.getSourceName()===t&&(r.qualifiedName.name instanceof b||("name"in r.qualifiedName.name?r.qualifiedName.name.name=n:r.qualifiedName.name.value=n));this.updateTableSourcesInCTEs(e,t,n)}updateTableSourcesInCTEs(e,t,n){if(!(!e.withClause||!e.withClause.tables))for(let i of e.withClause.tables)this.updateTableSourcesInQuery(i.query,t,n)}updateTableSourcesInQuery(e,t,n){if(e.fromClause&&e.fromClause.source.datasource&&this.updateTableSource(e.fromClause.source.datasource,t,n),e.fromClause&&e.fromClause.joins)for(let i of e.fromClause.joins)i.source.datasource&&this.updateTableSource(i.source.datasource,t,n)}updateTableSource(e,t,n){if(!e||typeof e!="object")return;let i=e;if(typeof i.getSourceName=="function")try{if(i.getSourceName()===t&&i.qualifiedName&&typeof i.qualifiedName=="object"){let r=i.qualifiedName;if(r.name&&typeof r.name=="object"){let o=r.name;"name"in o&&typeof o.name=="string"?o.name=n:"value"in o&&typeof o.value=="string"&&(o.value=n)}}}catch(s){console.warn("Warning: Failed to update table source:",s)}}renameCTEAtPosition(e,t,n){if(!e?.trim())throw new Error("SQL cannot be empty");if(!t||t.line<1||t.column<1)throw new Error("Position must be a valid line/column (1-based)");if(!n?.trim())throw new Error("New CTE name cannot be empty");let i=Ne.findLexemeAtLineColumn(e,t);if(!i)throw new Error(`No CTE name found at line ${t.line}, column ${t.column}`);let s=i.value,r=A.parse(e);if(!this.isCTENameInQuery(r,s))throw new Error(`'${s}' is not a CTE name in this query`);if(!(i.type&2112))throw new Error(`Token at position is not a CTE name: '${i.value}'`);let o=this.checkNameConflicts(r,n,s);if(o.length>0)throw new Error(o.join(", "));return this.renameCTE(r,s,n),new Be().format(r).formattedSql}checkNameConflicts(e,t,n){let i=[];return n===t||(i.push(...this.checkKeywordConflicts(t)),this.isCTENameInQuery(e,t)&&i.push(`CTE name '${t}' already exists`)),i}checkKeywordConflicts(e){let t=[];try{let n=this.keywordParser.parse(e,0);n!==null&&n.keyword.toLowerCase()===e.toLowerCase()&&t.push(`'${e}' is a reserved SQL keyword and should not be used as a CTE name`)}catch(n){console.warn(`Failed to check keyword conflicts for '${e}':`,n),this.isBasicReservedKeyword(e)&&t.push(`'${e}' is a reserved SQL keyword and should not be used as a CTE name`)}return t}isBasicReservedKeyword(e){return["select","from","where","with","as","union","join","table","null"].includes(e.toLowerCase())}isCTENameInQuery(e,t){return e instanceof g&&e.withClause?e.withClause.tables.some(n=>n.aliasExpression&&n.aliasExpression.table&&n.aliasExpression.table.name===t):e instanceof Q?this.isCTENameInQuery(e.left,t)||this.isCTENameInQuery(e.right,t):!1}};var bt={invalidSql:"Invalid SQL: unable to parse query",invalidPosition:"Invalid position: line or column out of bounds",noLexemeAtPosition:"No lexeme found at the specified position",notAnAlias:"Selected lexeme is not a valid alias",invalidNewName:"New alias name must be a non-empty string",sameNames:"Old and new alias names cannot be the same",nameConflict:a=>`Alias '${a}' already exists in this scope`,aliasNotFound:a=>`Alias '${a}' not found in current scope`},Xn=class{constructor(){this.keywordParser=new Te(Kt)}renameAlias(e,t,n,i={}){try{this.validateInputs(e,t,n);let s=Ne.findLexemeAtLineColumn(e,t);if(!s)throw new Error(bt.noLexemeAtPosition);this.validateLexemeIsAlias(s);let r=A.parse(e),o=this.detectAliasScope(e,r,s,i.scopeType),l=this.collectAliasReferences(o,s.value),u=this.checkNameConflicts(o,n,s.value);if(u.length>0)return{success:!1,originalSql:e,changes:[],conflicts:u,scope:o};let c=this.prepareChanges(l,n);if(i.dryRun)return{success:!0,originalSql:e,changes:c,conflicts:u,scope:o};let p=this.performLexemeBasedRename(e,s.value,n,o);return{success:!0,originalSql:e,newSql:p,changes:c,scope:o}}catch(s){return{success:!1,originalSql:e,changes:[],conflicts:[s instanceof Error?s.message:String(s)]}}}validateInputs(e,t,n){if(!e||typeof e!="string"||e.trim()==="")throw new Error(bt.invalidSql);if(!t||typeof t.line!="number"||typeof t.column!="number"||t.line<1||t.column<1)throw new Error(bt.invalidPosition);if(!n||typeof n!="string"||n.trim()==="")throw new Error(bt.invalidNewName)}validateLexemeIsAlias(e){if(!(e.type&64))throw new Error(bt.notAnAlias)}detectAliasScope(e,t,n,i){if(!n.position)return{type:"main",query:t,startPosition:0,endPosition:e.length};let s=n.position.startPosition;return i&&i!=="auto"?this.createScopeForType(i,e,t,s):this.autoDetectScope(e,t,s)}createScopeForType(e,t,n,i){switch(e){case"cte":return this.detectCTEScope(t,n,i);case"subquery":return this.detectSubqueryScope(t,n,i);case"main":default:return{type:"main",query:n,startPosition:0,endPosition:t.length}}}autoDetectScope(e,t,n){let i=this.detectCTEScope(e,t,n);if(i.type==="cte")return i;let s=this.detectSubqueryScope(e,t,n);return s.type==="subquery"?s:{type:"main",query:t,startPosition:0,endPosition:e.length}}detectCTEScope(e,t,n){try{let i=ht.analyzeCursorPosition(e,n);if(i.isInCTE&&i.cteRegion){let s=this.findCTEQueryByName(t,i.cteRegion.name);return{type:"cte",name:i.cteRegion.name,query:s||t,startPosition:i.cteRegion.startPosition,endPosition:i.cteRegion.endPosition}}}catch(i){console.warn("CTE scope detection failed:",i)}return{type:"main",query:t,startPosition:0,endPosition:e.length}}detectSubqueryScope(e,t,n){return{type:"main",query:t,startPosition:0,endPosition:e.length}}findCTEQueryByName(e,t){if(e instanceof g&&e.withClause?.tables){for(let n of e.withClause.tables)if(n.aliasExpression.table.name===t)return n.query}else if(e instanceof Q){let n=this.findCTEQueryByName(e.left,t);if(n)return n;let i=this.findCTEQueryByName(e.right,t);if(i)return i}return null}collectAliasReferences(e,t){let n=[];try{let i=this.collectTableAliasReferences(e,t);n.push(...i);let s=this.collectColumnAliasReferences(e,t);n.push(...s)}catch(i){console.warn(`Failed to collect alias references for '${t}':`,i)}return n}collectTableAliasReferences(e,t){let n=[];try{let s=new Ge(!0).collect(e.query);for(let r of s)if(r.getSourceName()===t){let l=this.createLexemeFromTableSource(r,t);l&&n.push({lexeme:l,scope:e,referenceType:"definition",context:"table"})}}catch(i){console.warn(`Failed to collect table alias references for '${t}':`,i)}return n}collectColumnAliasReferences(e,t){let n=[];try{let s=new Vt().collect(e.query);for(let r of s)if(r.namespaces&&r.namespaces.length>0){for(let o of r.namespaces)if(o.name===t){let l=this.createLexemeFromNamespace(o,t);l&&n.push({lexeme:l,scope:e,referenceType:"usage",context:"column"})}}}catch(i){console.warn(`Failed to collect column alias references for '${t}':`,i)}return n}createLexemeFromTableSource(e,t){try{return{type:64,value:t,comments:null,position:{startPosition:0,endPosition:t.length}}}catch(n){return console.warn("Failed to create lexeme from table source:",n),null}}createLexemeFromNamespace(e,t){try{return{type:64,value:t,comments:null,position:{startPosition:0,endPosition:t.length}}}catch(n){return console.warn("Failed to create lexeme from namespace:",n),null}}checkNameConflicts(e,t,n){let i=[];if(t.toLowerCase()===n.toLowerCase())return i.push(bt.sameNames),i;try{let s=this.checkTableAliasConflicts(e,t);i.push(...s);let r=this.checkKeywordConflicts(t);i.push(...r)}catch(s){console.warn(`Error during conflict detection for '${t}':`,s),i.push(`Unable to verify conflicts for name '${t}'`)}return i}checkTableAliasConflicts(e,t){let n=[];try{let s=new Ge(!0).collect(e.query);for(let r of s){let o=r.getSourceName();if(o&&o.toLowerCase()===t.toLowerCase()){n.push(bt.nameConflict(t));continue}let l=this.extractTableName(r);l&&l.toLowerCase()===t.toLowerCase()&&n.push(`'${t}' conflicts with table name in this scope`)}}catch(i){console.warn(`Failed to check table alias conflicts for '${t}':`,i)}return n}extractTableName(e){try{if(e.qualifiedName&&e.qualifiedName.name){let t=e.qualifiedName.name;if(typeof t=="string")return t;if(t.name&&typeof t.name=="string")return t.name;if(t.value&&typeof t.value=="string")return t.value}return e.table&&typeof e.table=="string"?e.table:null}catch(t){return console.warn("Failed to extract table name from table source:",t),null}}checkKeywordConflicts(e){let t=[];if(this.isBasicReservedKeyword(e))return t.push(`'${e}' is a reserved SQL keyword and should not be used as an alias`),t;try{let n=this.keywordParser.parse(e,0);n!==null&&n.keyword.toLowerCase()===e.toLowerCase()&&t.push(`'${e}' is a reserved SQL keyword and should not be used as an alias`)}catch(n){console.warn(`Failed to check keyword conflicts for '${e}':`,n)}return t}isBasicReservedKeyword(e){return["select","from","where","join","table","null","and","or"].includes(e.toLowerCase())}prepareChanges(e,t){return e.map(n=>({oldName:n.lexeme.value,newName:t,position:Ne.charOffsetToLineColumn("",n.lexeme.position?.startPosition||0)||{line:1,column:1},context:n.context,referenceType:n.referenceType}))}performLexemeBasedRename(e,t,n,i){try{let r=Ne.getAllLexemesWithPosition(e).filter(l=>l.value===t&&l.position&&l.position.startPosition>=i.startPosition&&l.position.endPosition<=i.endPosition&&l.type&64);if(r.length===0)return e;r.sort((l,u)=>u.position.startPosition-l.position.startPosition);let o=e;for(let l of r){let u=l.position;o=o.substring(0,u.startPosition)+n+o.substring(u.endPosition)}return o}catch(s){throw console.error("Failed to perform lexeme-based rename:",s),new Error(`Unable to rename alias using lexeme approach: ${s instanceof Error?s.message:String(s)}`)}}};var ei=class{renameIdentifiers(e,t){if(t.size===0)return e;let n=e;for(let[i,s]of t)n=this.replaceIdentifierSafely(n,i,s);return n}renameIdentifier(e,t,n){return this.replaceIdentifierSafely(e,t,n)}renameIdentifierInScope(e,t,n,i){if(!i)return this.replaceIdentifierSafely(e,t,n);let s=e.slice(0,i.start),r=e.slice(i.start,i.end),o=e.slice(i.end),l=this.replaceIdentifierSafely(r,t,n);return s+l+o}checkRenameability(e,t){let n=this.positionToCharIndex(e,t);if(this.isInsideStringLiteral(e,n))return{canRename:!1,reason:"Cannot rename identifiers inside string literal"};let i=this.getIdentifierAtPosition(e,n);if(!i)return{canRename:!1,reason:"No identifier found at position"};let s=this.determineIdentifierType(e,n,i),r=this.calculateScopeRange(e,n,s);return{canRename:!0,currentName:i,type:s,scopeRange:r}}renameAtPosition(e,t,n){let i=this.checkRenameability(e,t);if(!i.canRename||!i.currentName)throw new Error(i.reason||"Cannot rename at this position");return this.renameIdentifierInScope(e,i.currentName,n,i.scopeRange)}positionToCharIndex(e,t){let n=e.split(`
30
- `),i=0;for(let s=0;s<t.line-1&&s<n.length;s++)i+=n[s].length+1;return i+=t.column-1,Math.min(i,e.length-1)}isInsideStringLiteral(e,t){let n=!1;for(let i=0;i<t&&i<e.length;i++)e[i]==="'"&&(n=!n);return n}getIdentifierAtPosition(e,t){if(t>=e.length)return null;let n=t;for(;n>0&&this.isIdentifierChar(e.charCodeAt(n-1));)n--;let i=t;for(;i<e.length&&this.isIdentifierChar(e.charCodeAt(i));)i++;return n===i?null:e.slice(n,i)}determineIdentifierType(e,t,n){let i=e.slice(0,t),s=e.slice(t),r=i.toUpperCase(),o=s.toUpperCase();if(r.lastIndexOf("WITH")!==-1){let C=t;for(;C>0&&this.isIdentifierChar(e.charCodeAt(C-1));)C--;let f=t;for(;f<e.length&&this.isIdentifierChar(e.charCodeAt(f));)f++;if(e.slice(f).toUpperCase().trim().startsWith("AS ("))return"cte"}let u=i.split(`
31
- `),c=u[u.length-1].toUpperCase();if(c.includes("FROM ")||c.includes("JOIN "))return"table_alias";let p=i.slice(Math.max(0,t-50)),d=s.slice(0,50),h=(p+n+d).toUpperCase();return h.includes(" AS "+n.toUpperCase())||h.includes(" "+n.toUpperCase()+" ON")||h.includes(" "+n.toUpperCase()+`
32
- `),"table_alias"}calculateScopeRange(e,t,n){if(n==="cte")return{start:0,end:e.length};let i=e.slice(0,t),s=e.slice(t),r=i.toUpperCase().lastIndexOf("SELECT"),o=r!==-1?r:0,l=s.search(/\b(SELECT|WITH|UNION)\b/i),u=l!==-1?t+l:e.length;return{start:o,end:u}}replaceIdentifierSafely(e,t,n){if(t===n||t.length===0)return e;let i=[],s=0,r=e.length,o=t.length;for(;s<r;){let l=e[s],u=l.charCodeAt(0);if(u===34||u===96||u===91){let{content:c,nextPosition:p}=this.extractAndReplaceQuotedIdentifier(e,s,l,t,n);i.push(c),s=p;continue}if(u===39){let{content:c,nextPosition:p}=this.extractQuotedString(e,s,l);i.push(c),s=p;continue}if(u===45&&s+1<r&&e.charCodeAt(s+1)===45){let{content:c,nextPosition:p}=this.extractLineComment(e,s);i.push(c),s=p;continue}if(u===47&&s+1<r&&e.charCodeAt(s+1)===42){let{content:c,nextPosition:p}=this.extractBlockComment(e,s);i.push(c),s=p;continue}if(this.isIdentifierStartChar(u)&&this.matchesIdentifierAt(e,s,t)){let c=s-1,p=s+o,d=c>=0?e[c]:null,h=p<r?e[p]:null;if(this.hasValidWordBoundaries(d,h)){i.push(n),s+=o;continue}}i.push(l),s++}return i.join("")}validateRename(e,t,n,i){if(e===t||!t.includes(i))return!1;let s=this.countWordOccurrences(e,n);return this.countWordOccurrences(t,n)<s}extractAndReplaceQuotedIdentifier(e,t,n,i,s){if(n==="[")return this.extractAndReplaceBracketedIdentifier(e,t,i,s);let r=[n],o=t+1,l=o;for(;o<e.length;){let u=e[o];if(u===n){if(o+1<e.length&&e[o+1]===n){r.push(u),r.push(e[o+1]),o+=2;continue}let c=e.slice(l,o);c.toLowerCase()===i.toLowerCase()?r.push(s):r.push(c),r.push(u);break}o++}return{content:r.join(""),nextPosition:o+1}}extractAndReplaceBracketedIdentifier(e,t,n,i){let s=["["],r=t+1,o=r;for(;r<e.length;){let l=e[r];if(l==="]"){let u=e.slice(o,r);u.toLowerCase()===n.toLowerCase()?s.push(i):s.push(u),s.push(l);break}r++}return{content:s.join(""),nextPosition:r+1}}extractQuotedString(e,t,n){let i=[n],s=t+1;for(;s<e.length;){let r=e[s];if(i.push(r),r===n){if(s+1<e.length&&e[s+1]===n){i.push(e[s+1]),s+=2;continue}break}s++}return{content:i.join(""),nextPosition:s+1}}extractLineComment(e,t){let n=[],i=t;for(;i<e.length&&e.charCodeAt(i)!==10&&e.charCodeAt(i)!==13;)n.push(e[i]),i++;return i<e.length&&(e.charCodeAt(i)===10||e.charCodeAt(i)===13)&&(n.push(e[i]),i++),{content:n.join(""),nextPosition:i}}extractBlockComment(e,t){let n=["/","*"],i=t+2;for(;i<e.length-1;){let s=e[i];if(n.push(s),s==="*"&&e[i+1]==="/"){n.push("/"),i+=2;break}i++}return{content:n.join(""),nextPosition:i}}isIdentifierStartChar(e){return e>=65&&e<=90||e>=97&&e<=122||e===95}isIdentifierChar(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===95}matchesIdentifierAt(e,t,n){if(t+n.length>e.length)return!1;for(let i=0;i<n.length;i++){let s=e.charCodeAt(t+i),r=n.charCodeAt(i),o=s>=65&&s<=90?s+32:s,l=r>=65&&r<=90?r+32:r;if(o!==l)return!1}return!0}hasValidWordBoundaries(e,t){let n=e===null||!this.isIdentifierChar(e.charCodeAt(0)),i=t===null||!this.isIdentifierChar(t.charCodeAt(0));return n&&i}countWordOccurrences(e,t){let n=0,i=0,s=e.length,r=t.length;for(;i<=s-r;){if(this.matchesIdentifierAt(e,i,t)){let o=i-1,l=i+r,u=o>=0?e[o]:null,c=l<s?e[l]:null;this.hasValidWordBoundaries(u,c)&&n++}i++}return n}};var Ri=class{constructor(){this.cteRenamer=new Zn,this.aliasRenamer=new Xn,this.identifierRenamer=new ei}isRenameable(e,t){try{if(!e?.trim())return{renameable:!1,renamerType:"none",reason:"Empty SQL"};if(!t||t.line<1||t.column<1)return{renameable:!1,renamerType:"none",reason:"Invalid position"};let n=Ne.findLexemeAtLineColumn(e,t);if(!n)return{renameable:!1,renamerType:"none",reason:"No token found"};if(!(n.type&2112))return{renameable:!1,renamerType:"none",tokenName:n.value,reason:`Token '${n.value}' is not an identifier`};let i=n.value,s=this.detectRenamerType(e,i);return s==="unknown"?{renameable:!1,renamerType:"none",tokenName:i,reason:`Cannot determine if '${i}' is renameable`}:{renameable:!0,renamerType:s,tokenName:i}}catch(n){return{renameable:!1,renamerType:"none",reason:`Error: ${n instanceof Error?n.message:String(n)}`}}}rename(e,t,n,i){try{if(!e?.trim())return this.createErrorResult(e,n,"unknown","","SQL cannot be empty");if(!t||t.line<1||t.column<1)return this.createErrorResult(e,n,"unknown","","Position must be valid line/column (1-based)");if(!n?.trim())return this.createErrorResult(e,n,"unknown","","New name cannot be empty");let s=Ne.findLexemeAtLineColumn(e,t);if(!s)return this.createErrorResult(e,n,"unknown","",`No identifier found at line ${t.line}, column ${t.column}`);if(!(s.type&64))return this.createErrorResult(e,n,"unknown",s.value,`Token '${s.value}' is not renameable`);let r=s.value,o=i?.preserveFormatting??!1,l=this.detectRenamerType(e,r);if(o)try{let u=this.attemptFormattingPreservationRename(e,t,n,r,l);if(u.success)return u}catch(u){console.warn("Formatting preservation failed, falling back to standard rename:",u)}try{let u;if(l==="cte")u=this.cteRenamer.renameCTEAtPosition(e,t,n);else if(l==="alias"){let c=this.aliasRenamer.renameAlias(e,t,n);if(!c.success)return{success:!1,originalSql:e,renamerType:"alias",originalName:r,newName:n,error:c.conflicts?.join(", ")||"Alias rename failed",formattingPreserved:!1,formattingMethod:"smart-renamer-only"};u=c.newSql}else return this.createErrorResult(e,n,"unknown",r,`Cannot determine if '${r}' is a CTE name or table alias`);return{success:!0,originalSql:e,newSql:u,renamerType:l,originalName:r,newName:n,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}catch(u){return this.createErrorResult(e,n,l,r,`${l.toUpperCase()} rename failed: ${u instanceof Error?u.message:String(u)}`)}}catch(s){return this.createErrorResult(e,n,"unknown","",`Unexpected error: ${s instanceof Error?s.message:String(s)}`)}}detectRenamerType(e,t){try{let n=A.parse(e);return this.isCTEName(n,t)?"cte":"alias"}catch{return"unknown"}}isCTEName(e,t){return e instanceof g&&e.withClause?e.withClause.tables.some(n=>n.aliasExpression&&n.aliasExpression.table&&n.aliasExpression.table.name===t):e instanceof Q?this.isCTEName(e.left,t)||this.isCTEName(e.right,t):!1}attemptFormattingPreservationRename(e,t,n,i,s){let r=this.performStandardRename(e,t,n,i,s);if(!r.success)return{...r,formattingPreserved:!1,formattingMethod:"smart-renamer-only"};let o=new Map([[i,n]]);try{let l=this.identifierRenamer.renameIdentifiers(e,o);if(this.validateRenameResult(e,l,i,n))return{success:!0,originalSql:e,newSql:l,renamerType:s,originalName:i,newName:n,formattingPreserved:!0,formattingMethod:"sql-identifier-renamer"};throw new Error("Validation failed: rename may not have been applied correctly")}catch{return{...r,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}}performStandardRename(e,t,n,i,s){try{let r;if(s==="cte")r=this.cteRenamer.renameCTEAtPosition(e,t,n);else if(s==="alias"){let o=this.aliasRenamer.renameAlias(e,t,n);if(!o.success)return{success:!1,originalSql:e,renamerType:"alias",originalName:i,newName:n,error:o.conflicts?.join(", ")||"Alias rename failed"};r=o.newSql}else return{success:!1,originalSql:e,renamerType:"unknown",originalName:i,newName:n,error:`Cannot determine if '${i}' is a CTE name or table alias`};return{success:!0,originalSql:e,newSql:r,renamerType:s,originalName:i,newName:n}}catch(r){return{success:!1,originalSql:e,renamerType:s,originalName:i,newName:n,error:`${s.toUpperCase()} rename failed: ${r instanceof Error?r.message:String(r)}`}}}validateRenameResult(e,t,n,i){if(e===t||!t.includes(i))return!1;let s=this.countWordOccurrences(e,n);return this.countWordOccurrences(t,n)<s}countWordOccurrences(e,t){let n=new RegExp(`\\b${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\b`,"gi"),i=e.match(n);return i?i.length:0}createErrorResult(e,t,n,i,s){return{success:!1,originalSql:e,renamerType:n,originalName:i,newName:t,error:s,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}batchRename(e,t,n){if(n?.preserveFormatting??!1)try{let s=new Map(Object.entries(t)),r=this.identifierRenamer.renameIdentifiers(e,s),o=Object.keys(t),l=Object.values(t);return{success:!0,originalSql:e,newSql:r,renamerType:"alias",originalName:o.join(", "),newName:l.join(", "),formattingPreserved:!0,formattingMethod:"sql-identifier-renamer"}}catch(s){return{success:!1,originalSql:e,renamerType:"unknown",originalName:Object.keys(t).join(", "),newName:Object.values(t).join(", "),error:`Batch rename failed: ${s instanceof Error?s.message:String(s)}`,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}else return{success:!1,originalSql:e,renamerType:"unknown",originalName:Object.keys(t).join(", "),newName:Object.values(t).join(", "),error:"Batch rename without formatting preservation not implemented. Use individual renames or enable formatting preservation.",formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}};var Fi=class{restore(e){if(e.length===0)return"";let t="";for(let n of e)t+=n.value,n.followingWhitespace&&(t+=n.followingWhitespace);return t}restoreWithComments(e,t=!0){if(e.length===0)return"";let n="";for(let i of e){if(n+=i.value,t&&i.inlineComments&&i.inlineComments.length>0)for(let s of i.inlineComments)s.trim().length>0&&(n+=` -- ${s}`);i.followingWhitespace&&(n+=i.followingWhitespace)}return n}analyzeFormatting(e){let t=0,n=0,i=0,s=0,r=0,o=0;for(let u of e){if(u.followingWhitespace){t+=u.followingWhitespace.length;let c=u.followingWhitespace.split(`
33
- `);for(let p=1;p<c.length;p++){let d=c[p],h=d.match(/^ */)?.[0].length||0,C=d.match(/^\t*/)?.[0].length||0;(h>0||C>0)&&(r++,o+=h+C*4,i+=h,s+=C)}}u.inlineComments&&(n+=u.inlineComments.length)}let l="none";return i>0&&s>0?l="mixed":i>0?l="spaces":s>0&&(l="tabs"),{totalWhitespace:t,totalComments:n,indentationStyle:l,averageIndentSize:r>0?o/r:0}}validateFormattingLexemes(e){let t=[];for(let n=0;n<e.length;n++){let i=e[n];i.position||t.push(`Lexeme ${n} missing position information`),i.followingWhitespace===void 0&&t.push(`Lexeme ${n} missing followingWhitespace property`),i.inlineComments===void 0&&t.push(`Lexeme ${n} missing inlineComments property`),i.position&&i.position.startPosition>=i.position.endPosition&&t.push(`Lexeme ${n} has invalid position range`)}return{isValid:t.length===0,issues:t}}};var ti=class a{constructor(){this.jsonColumnCounter=0;this.entityToJsonColumnMap=new Map;this.columnMappings=[]}static{this.CTE_OBJECT_PREFIX="cte_object_depth_"}static{this.WILDCARD_COLUMN="*"}buildObjectEntityCtes(e,t,n){this.jsonColumnCounter=0,this.entityToJsonColumnMap.clear(),this.columnMappings=[];let i=[e],s=e.aliasExpression.table.name,r=this.collectAndSortObjectEntities(n,t),o=this.groupEntitiesByDepth(r),l=Array.from(o.keys()).sort((u,c)=>c-u);for(let u of l){let c=o.get(u),p=`${a.CTE_OBJECT_PREFIX}${u}`,d=this.buildDepthCte(c,s,p,n,t);i.push(d),s=p}return{ctes:i,lastCteAlias:s,columnMappings:this.columnMappings}}generateUniqueJsonColumnName(e,t,n){this.jsonColumnCounter++;let i=`${e.toLowerCase()}_json_${this.jsonColumnCounter}`;return this.columnMappings.push({entityId:t,entityName:e,generatedColumnName:i,depth:n}),i}collectAndSortObjectEntities(e,t){let n=[],i=s=>{let r=t.get(s);if(!r)throw new Error(`Entity ${s} not found for depth calculation.`);if(r.isRoot)return 0;if(!r.parentId)return 1;let o=r.parentId,l=0,u=new Set;for(u.add(s);o;){if(u.has(o))throw new Error(`Circular dependency detected: ${o} already visited in path for ${s}`);u.add(o);let c=t.get(o);if(!c)throw new Error(`Parent entity ${o} not found during depth calculation for ${s}`);let p=!1;if(c.isRoot)p=!0;else{let d=e.nestedEntities.find(h=>h.id===o);if(d)d.relationshipType==="object"&&(p=!0);else throw new Error(`Parent entity ${o} (ancestor of ${s}) has no definition in mapping.nestedEntities and is not root.`)}if(p&&l++,c.isRoot)break;o=c.parentId}return l};return e.nestedEntities.forEach(s=>{if(s.relationshipType==="object"){let r=t.get(s.id);r&&!r.isRoot&&n.push({entity:r,depth:i(s.id)})}}),n}groupEntitiesByDepth(e){let t=new Map;return e.forEach(n=>{let i=n.depth;t.has(i)||t.set(i,[]),t.get(i).push(n)}),t}buildDepthCte(e,t,n,i,s){let r=[new _(new b(null,new I(a.WILDCARD_COLUMN)))];for(let{entity:l}of e){let u=this.buildEntityJsonColumn(l,i,s);r.push(u)}let o=new g({selectClause:new q(r),fromClause:new K(new B(new O(null,new I(t)),null),null)});return new ie(o,new ee(n,null),null)}buildEntityJsonColumn(e,t,n){let{jsonObjectArgs:i,nullChecks:s}=this.prepareEntityColumns(e);this.addChildObjectRelationships(e,i,t,n);let r=this.createJsonObject(i),o=this.buildNullCondition(s),l=this.createCaseExpression(o,r),u=this.calculateApproximateDepth(e,t),c=this.generateUniqueJsonColumnName(e.name,e.id,u);return this.entityToJsonColumnMap.set(e.id,c),new _(l,c)}calculateApproximateDepth(e,t){if(e.isRoot)return 0;if(!e.parentId)return 1;let n=1,i=e.parentId;for(;i&&i!==t.rootEntity.id;){let s=t.nestedEntities.find(r=>r.id===i);if(!s)break;n++,i=s.parentId}return n}prepareEntityColumns(e){let t=[],n=[];return Object.entries(e.columns).forEach(([i,s])=>{t.push(new Y(i,void 0,!0)),t.push(new b(null,new I(s))),n.push(new S(new b(null,new I(s)),"is",new Y(null)))}),{jsonObjectArgs:t,nullChecks:n}}addChildObjectRelationships(e,t,n,i){n.nestedEntities.filter(r=>r.parentId===e.id&&r.relationshipType==="object").forEach(r=>{let o=i.get(r.id);if(o){t.push(new Y(r.propertyName,void 0,!0));let l=this.entityToJsonColumnMap.get(o.id);if(!l)throw new Error(`JSON column name not found for child entity: ${o.id}`);t.push(new b(null,new I(l)))}})}createJsonObject(e){let t="jsonb_build_object";return new U(null,new V(t),new D(e),null)}buildNullCondition(e){return e.reduce((t,n)=>t?new S(t,"and",n):n)}createCaseExpression(e,t){return new se(null,new Ee([new xe(e,new Y(null))],t))}};var ni=class a{static{this.CTE_ARRAY_PREFIX="cte_array_depth_"}static{this.JSON_FUNCTIONS={BUILD_OBJECT:"jsonb_build_object",AGGREGATE:"jsonb_agg"}}buildArrayEntityCtes(e,t,n,i,s){let r=[...e],o=t,l=this.collectAndSortArrayEntities(i,n);if(l.length===0)return{updatedCtes:r,lastCteAlias:o};let u=this.groupEntitiesByDepth(l),c=Array.from(u.keys()).sort((p,d)=>d-p);for(let p of c){let d=u.get(p),{cte:h,newCteAlias:C}=this.buildDepthCte(d,o,r,p,i,s);r.push(h),o=C}return{updatedCtes:r,lastCteAlias:o}}collectAndSortArrayEntities(e,t){let n=[],i=s=>{let r=t.get(s);return!r||r.isRoot?0:r.parentId?1+i(r.parentId):1};return e.nestedEntities.forEach(s=>{if(s.relationshipType==="array"){let r=t.get(s.id),o=t.get(s.parentId);if(!r||!o)throw new Error(`Configuration error: Array entity '${s.id}' or its parent '${s.parentId}' not found.`);let l=Object.values(o.columns);if(l.length===0)throw new Error(`Configuration error: Parent entity '${o.name}' (ID: ${o.id}) must have at least one column defined to serve as a linking key for child array '${s.name}'.`);let u=l[0];n.push({entity:r,parentEntity:o,parentIdColumnSqlName:u,depth:i(s.id)})}}),n.sort((s,r)=>r.depth-s.depth),n}groupEntitiesByDepth(e){let t=new Map;return e.forEach(n=>{let i=n.depth;t.has(i)||t.set(i,[]),t.get(i).push(n)}),t}buildDepthCte(e,t,n,i,s,r){let o=new Set;e.forEach(E=>{Object.values(E.entity.columns).forEach(P=>o.add(P));let y=P=>{s.nestedEntities.filter(T=>T.parentId===P).forEach(T=>{Object.values(T.columns).forEach(j=>{let x=typeof j=="string"?j:j.column;o.add(x)}),y(T.id)})};y(E.entity.id)});let l=n.find(E=>E.aliasExpression.table.name===t)?.query;if(!l)throw new Error(`CTE not found: ${t}`);let u=new _e(null,n).collect(l),c=[],p=[],d=new Set;e.forEach(E=>{Object.values(E.entity.columns).forEach(y=>d.add(y))});let h=this.collectArrayEntityColumnsByDepth(s,i),C=new Set;r&&e.forEach(E=>{s.nestedEntities.filter(y=>y.parentId===E.entity.id&&y.relationshipType==="object").forEach(y=>{let P=r.find(T=>T.entityId===y.id);P&&C.add(P.generatedColumnName)})}),this.processSelectVariablesForGroupBy(u,o,h,i,p,c,C);for(let E of e){let y=this.buildAggregationDetailsForArrayEntity(E.entity,s.nestedEntities,new Map,r);p.push(new _(y.jsonAgg,E.entity.propertyName))}let f=`${a.CTE_ARRAY_PREFIX}${i}`,J=new g({selectClause:new q(p),fromClause:new K(new B(new O(null,new I(t)),null),null),groupByClause:c.length>0?new me(c):null});return{cte:new ie(J,new ee(f,null),null),newCteAlias:f}}buildAggregationDetailsForArrayEntity(e,t,n,i){let s=a.JSON_FUNCTIONS.BUILD_OBJECT,r=[];Object.entries(e.columns).forEach(([d,h])=>{r.push(new Y(d,void 0,!0)),r.push(new b(null,new I(h)))}),t.filter(d=>d.parentId===e.id).forEach(d=>{let h=d.originalPropertyName||d.propertyName;if(r.push(new Y(h,void 0,!0)),d.relationshipType==="object"){if(!i)throw new Error(`\u274C PostgresArrayEntityCteBuilder Error: Column mappings not provided
30
+ ${query}`}addRestorationComments(sql,targetNode,warnings){let comments=[];return comments.push("-- CTE Restoration: "+targetNode.name),targetNode.dependencies.length>0?comments.push("-- Dependencies: "+targetNode.dependencies.join(", ")):comments.push("-- Dependencies: none"),warnings.length>0&&comments.push("-- Warnings: "+warnings.join(", ")),comments.push("-- Generated by CTEQueryDecomposer.extractCTE()"),comments.push(""),comments.join(`
31
+ `)+sql}getAllCTENames(ctes){return ctes.map(cte=>this.getCTEName(cte))}getCTEName(cte){return cte.aliasExpression.table.name}};var ColumnReferenceCollector=class{constructor(){this.columnReferences=[];this.visitedNodes=new Set;this.handlers=new Map,this.handlers.set(WithClause.kind,clause=>this.visitWithClause(clause)),this.handlers.set(CommonTable.kind,table=>this.visitCommonTable(table)),this.handlers.set(SelectClause.kind,clause=>this.visitSelectClause(clause)),this.handlers.set(FromClause.kind,clause=>this.visitFromClause(clause)),this.handlers.set(WhereClause.kind,clause=>this.visitWhereClause(clause)),this.handlers.set(GroupByClause.kind,clause=>this.visitGroupByClause(clause)),this.handlers.set(HavingClause.kind,clause=>this.visitHavingClause(clause)),this.handlers.set(OrderByClause.kind,clause=>this.visitOrderByClause(clause)),this.handlers.set(WindowsClause.kind,clause=>this.visitWindowsClause(clause)),this.handlers.set(LimitClause.kind,clause=>this.visitLimitClause(clause)),this.handlers.set(OffsetClause.kind,clause=>this.visitOffsetClause(clause)),this.handlers.set(FetchClause.kind,clause=>this.visitFetchClause(clause)),this.handlers.set(ForClause.kind,clause=>this.visitForClause(clause)),this.handlers.set(JoinClause.kind,clause=>this.visitJoinClause(clause)),this.handlers.set(JoinOnClause.kind,clause=>this.visitJoinOnClause(clause)),this.handlers.set(JoinUsingClause.kind,clause=>this.visitJoinUsingClause(clause)),this.handlers.set(SourceExpression.kind,source=>this.visitSourceExpression(source)),this.handlers.set(SubQuerySource.kind,source=>this.visitSubQuerySource(source)),this.handlers.set(ColumnReference.kind,ref=>this.visitColumnReference(ref)),this.handlers.set(BinaryExpression.kind,expr=>this.visitBinaryExpression(expr)),this.handlers.set(UnaryExpression.kind,expr=>this.visitUnaryExpression(expr)),this.handlers.set(FunctionCall.kind,func=>this.visitFunctionCall(func)),this.handlers.set(CaseExpression.kind,expr=>this.visitCaseExpression(expr)),this.handlers.set(CastExpression.kind,expr=>this.visitCastExpression(expr)),this.handlers.set(BetweenExpression.kind,expr=>this.visitBetweenExpression(expr)),this.handlers.set(ParenExpression.kind,expr=>this.visitParenExpression(expr)),this.handlers.set(InlineQuery.kind,query=>this.visitInlineQuery(query)),this.handlers.set(ArrayExpression.kind,expr=>this.visitArrayExpression(expr)),this.handlers.set(ArrayQueryExpression.kind,expr=>this.visitArrayQueryExpression(expr)),this.handlers.set(ValueList.kind,list=>this.visitValueList(list)),this.handlers.set(WindowFrameExpression.kind,expr=>this.visitWindowFrameExpression(expr))}collect(query){return this.columnReferences=[],this.visitedNodes.clear(),query instanceof SimpleSelectQuery?this.collectFromSimpleQuery(query):query instanceof BinarySelectQuery?this.collectFromSimpleQuery(query.toSimpleQuery()):query.accept(this),[...this.columnReferences]}collectFromSimpleQuery(query){if(query.withClause&&query.withClause.tables)for(let cte of query.withClause.tables)this.collectFromSimpleQuery(cte.query);if(this.collectFromSelectClause(query.selectClause),query.fromClause&&this.collectFromFromClause(query.fromClause),query.whereClause&&this.collectFromValueComponent(query.whereClause.condition),query.groupByClause&&query.groupByClause.grouping)for(let item of query.groupByClause.grouping)this.collectFromValueComponent(item);if(query.havingClause&&this.collectFromValueComponent(query.havingClause.condition),query.orderByClause&&query.orderByClause.order)for(let item of query.orderByClause.order)typeof item=="object"&&"value"in item&&item.value?this.collectFromValueComponent(item.value):this.collectFromValueComponent(item)}collectFromSelectClause(clause){for(let item of clause.items)this.collectFromValueComponent(item.value)}collectFromFromClause(clause){if(this.collectFromSourceExpression(clause.source),clause.joins)for(let join of clause.joins)this.collectFromSourceExpression(join.source),join.condition&&this.collectFromValueComponent(join.condition.condition)}collectFromSourceExpression(source){source.datasource instanceof SubQuerySource&&(source.datasource.query instanceof SimpleSelectQuery?this.collectFromSimpleQuery(source.datasource.query):source.datasource.query instanceof BinarySelectQuery&&this.collectFromSimpleQuery(source.datasource.query.toSimpleQuery()))}collectFromValueComponent(value){if(value instanceof ColumnReference)this.columnReferences.push(value);else if(value instanceof BinaryExpression)this.collectFromValueComponent(value.left),this.collectFromValueComponent(value.right);else if(value instanceof UnaryExpression)this.collectFromValueComponent(value.expression);else if(value instanceof FunctionCall&&value.argument)this.collectFromValueComponent(value.argument);else if(value instanceof CaseExpression){if(value.condition&&this.collectFromValueComponent(value.condition),value.switchCase&&value.switchCase.cases)for(let pair of value.switchCase.cases)this.collectFromValueComponent(pair.key),this.collectFromValueComponent(pair.value);value.switchCase&&value.switchCase.elseValue&&this.collectFromValueComponent(value.switchCase.elseValue)}else value instanceof ParenExpression?this.collectFromValueComponent(value.expression):value instanceof InlineQuery&&(value.selectQuery instanceof SimpleSelectQuery?this.collectFromSimpleQuery(value.selectQuery):value.selectQuery instanceof BinarySelectQuery&&this.collectFromSimpleQuery(value.selectQuery.toSimpleQuery()))}visit(component){if(this.visitedNodes.has(component))return;this.visitedNodes.add(component);let handler=this.handlers.get(component.getKind());handler&&handler(component)}visitSimpleSelectQuery(query){query.withClause&&query.withClause.accept(this),query.selectClause.accept(this),query.fromClause&&query.fromClause.accept(this),query.whereClause&&query.whereClause.accept(this),query.groupByClause&&query.groupByClause.accept(this),query.havingClause&&query.havingClause.accept(this),query.orderByClause&&query.orderByClause.accept(this),query.windowClause&&query.windowClause.accept(this),query.limitClause&&query.limitClause.accept(this),query.offsetClause&&query.offsetClause.accept(this),query.fetchClause&&query.fetchClause.accept(this),query.forClause&&query.forClause.accept(this)}visitWithClause(clause){for(let table of clause.tables)table.accept(this)}visitCommonTable(table){table.query.accept(this)}visitSelectClause(clause){for(let item of clause.items)item.value.accept(this)}visitFromClause(clause){if(clause.source.accept(this),clause.joins)for(let join of clause.joins)join.accept(this)}visitWhereClause(clause){clause.condition.accept(this)}visitGroupByClause(clause){if(clause.grouping)for(let item of clause.grouping)item.accept(this)}visitHavingClause(clause){clause.condition.accept(this)}visitOrderByClause(clause){if(clause.order)for(let item of clause.order)typeof item=="object"&&"value"in item&&item.value?typeof item.value=="object"&&"accept"in item.value&&item.value.accept(this):typeof item=="object"&&"accept"in item&&item.accept(this)}visitWindowsClause(clause){for(let window of clause.windows)window.expression.accept(this)}visitLimitClause(clause){clause.value.accept(this)}visitOffsetClause(clause){clause.value.accept(this)}visitFetchClause(clause){clause.expression.accept(this)}visitForClause(clause){}visitJoinClause(clause){clause.source.accept(this),clause.condition&&clause.condition.accept(this)}visitJoinOnClause(clause){clause.condition.accept(this)}visitJoinUsingClause(clause){clause.condition.accept(this)}visitSourceExpression(source){source.datasource.accept(this)}visitSubQuerySource(source){source.query.accept(this)}visitColumnReference(ref){this.columnReferences.push(ref)}visitBinaryExpression(expr){expr.left.accept(this),expr.right.accept(this)}visitUnaryExpression(expr){expr.expression.accept(this)}visitFunctionCall(func){func.argument&&func.argument.accept(this)}visitCaseExpression(expr){if(expr.condition&&expr.condition.accept(this),expr.switchCase&&expr.switchCase.cases)for(let pair of expr.switchCase.cases)pair.key.accept(this),pair.value.accept(this);expr.switchCase&&expr.switchCase.elseValue&&expr.switchCase.elseValue.accept(this)}visitCastExpression(expr){expr.input.accept(this)}visitBetweenExpression(expr){expr.expression.accept(this),expr.lower.accept(this),expr.upper.accept(this)}visitParenExpression(expr){expr.expression.accept(this)}visitInlineQuery(query){query.selectQuery.accept(this)}visitArrayExpression(expr){expr.expression&&expr.expression.accept(this)}visitArrayQueryExpression(expr){expr.query.accept(this)}visitValueList(list){if(list.values)for(let item of list.values)item.accept(this)}visitWindowFrameExpression(expr){expr.partition&&expr.partition.accept(this),expr.order&&expr.order.accept(this)}};var ERROR_MESSAGES={nullQuery:"Query cannot be null or undefined",invalidOldName:"Old CTE name must be a non-empty string",invalidNewName:"New CTE name must be a non-empty string",sameNames:"Old and new CTE names cannot be the same",unsupportedQuery:"Unsupported query type for CTE renaming",cteNotExists:name=>`CTE '${name}' does not exist`,cteAlreadyExists:name=>`CTE '${name}' already exists`,cteNotFound:name=>`CTE '${name}' not found`},CTERenamer=class{constructor(){this.dependencyAnalyzer=new CTEDependencyAnalyzer,this.columnReferenceCollector=new ColumnReferenceCollector,this.tableSourceCollector=new TableSourceCollector,this.keywordParser=new KeywordParser(keywordTrie)}renameCTE(query,oldName,newName){this.validateInputs(query,oldName,newName);let sanitizedOldName=oldName.trim(),sanitizedNewName=newName.trim();if(query instanceof SimpleSelectQuery)this.renameInSimpleQuery(query,sanitizedOldName,sanitizedNewName);else if(query instanceof BinarySelectQuery)this.renameInBinaryQuery(query,sanitizedOldName,sanitizedNewName);else throw new Error(ERROR_MESSAGES.unsupportedQuery)}validateInputs(query,oldName,newName){if(!query)throw new Error(ERROR_MESSAGES.nullQuery);if(!oldName||typeof oldName!="string"||oldName.trim()==="")throw new Error(ERROR_MESSAGES.invalidOldName);if(!newName||typeof newName!="string"||newName.trim()==="")throw new Error(ERROR_MESSAGES.invalidNewName);if(oldName.trim()===newName.trim())throw new Error(ERROR_MESSAGES.sameNames)}renameInSimpleQuery(query,oldName,newName){let availableCTEs=query.getCTENames();if(!availableCTEs.includes(oldName))throw new Error(ERROR_MESSAGES.cteNotExists(oldName));if(availableCTEs.includes(newName))throw new Error(ERROR_MESSAGES.cteAlreadyExists(newName));this.renameCTEDefinition(query,oldName,newName),this.updateAllReferences(query,oldName,newName)}renameInBinaryQuery(query,oldName,newName){let withClauseQuery=query.toSimpleQuery(),availableCTEs=[];if(withClauseQuery.withClause&&withClauseQuery.withClause.tables&&(availableCTEs=withClauseQuery.withClause.tables.map(cte=>cte.aliasExpression.table.name)),!availableCTEs.includes(oldName))throw new Error(ERROR_MESSAGES.cteNotExists(oldName));if(availableCTEs.includes(newName))throw new Error(ERROR_MESSAGES.cteAlreadyExists(newName));this.renameCTEDefinition(withClauseQuery,oldName,newName),withClauseQuery.withClause&&(query.withClause=withClauseQuery.withClause,query.left instanceof SimpleSelectQuery&&(query.left.withClause=withClauseQuery.withClause)),this.renameInSelectQuery(query.left,oldName,newName),this.renameInSelectQuery(query.right,oldName,newName)}renameInSelectQuery(query,oldName,newName){query instanceof SimpleSelectQuery?this.updateAllReferences(query,oldName,newName):query instanceof BinarySelectQuery&&(this.renameInSelectQuery(query.left,oldName,newName),this.renameInSelectQuery(query.right,oldName,newName))}renameCTEDefinition(query,oldName,newName){if(!query.withClause||!query.withClause.tables)throw new Error(ERROR_MESSAGES.cteNotFound(oldName));let cteToRename=query.withClause.tables.find(cte=>cte.aliasExpression.table.name===oldName);if(!cteToRename)throw new Error(ERROR_MESSAGES.cteNotFound(oldName));cteToRename.aliasExpression.table.name=newName}updateAllReferences(query,oldName,newName){let columnReferences=this.columnReferenceCollector.collect(query);for(let columnRef of columnReferences)if(columnRef.namespaces&&columnRef.namespaces.length>0){for(let namespace of columnRef.namespaces)if(namespace.name===oldName){namespace.name=newName;break}}let tableSources=this.tableSourceCollector.collect(query);for(let tableSource of tableSources)tableSource.getSourceName()===oldName&&(tableSource.qualifiedName.name instanceof ColumnReference||("name"in tableSource.qualifiedName.name?tableSource.qualifiedName.name.name=newName:tableSource.qualifiedName.name.value=newName));this.updateTableSourcesInCTEs(query,oldName,newName)}updateTableSourcesInCTEs(query,oldName,newName){if(!(!query.withClause||!query.withClause.tables))for(let cte of query.withClause.tables)this.updateTableSourcesInQuery(cte.query,oldName,newName)}updateTableSourcesInQuery(query,oldName,newName){if(query.fromClause&&query.fromClause.source.datasource&&this.updateTableSource(query.fromClause.source.datasource,oldName,newName),query.fromClause&&query.fromClause.joins)for(let join of query.fromClause.joins)join.source.datasource&&this.updateTableSource(join.source.datasource,oldName,newName)}updateTableSource(datasource,oldName,newName){if(!datasource||typeof datasource!="object")return;let source=datasource;if(typeof source.getSourceName=="function")try{if(source.getSourceName()===oldName&&source.qualifiedName&&typeof source.qualifiedName=="object"){let qualifiedName=source.qualifiedName;if(qualifiedName.name&&typeof qualifiedName.name=="object"){let nameObj=qualifiedName.name;"name"in nameObj&&typeof nameObj.name=="string"?nameObj.name=newName:"value"in nameObj&&typeof nameObj.value=="string"&&(nameObj.value=newName)}}}catch(error){console.warn("Warning: Failed to update table source:",error)}}renameCTEAtPosition(sql,position,newName){if(!sql?.trim())throw new Error("SQL cannot be empty");if(!position||position.line<1||position.column<1)throw new Error("Position must be a valid line/column (1-based)");if(!newName?.trim())throw new Error("New CTE name cannot be empty");let lexeme=LexemeCursor.findLexemeAtLineColumn(sql,position);if(!lexeme)throw new Error(`No CTE name found at line ${position.line}, column ${position.column}`);let cteName=lexeme.value,query=SelectQueryParser.parse(sql);if(!this.isCTENameInQuery(query,cteName))throw new Error(`'${cteName}' is not a CTE name in this query`);if(!(lexeme.type&2112))throw new Error(`Token at position is not a CTE name: '${lexeme.value}'`);let conflicts=this.checkNameConflicts(query,newName,cteName);if(conflicts.length>0)throw new Error(conflicts.join(", "));return this.renameCTE(query,cteName,newName),new SqlFormatter().format(query).formattedSql}checkNameConflicts(query,newName,currentName){let conflicts=[];return currentName===newName||(conflicts.push(...this.checkKeywordConflicts(newName)),this.isCTENameInQuery(query,newName)&&conflicts.push(`CTE name '${newName}' already exists`)),conflicts}checkKeywordConflicts(newName){let conflicts=[];try{let keywordResult=this.keywordParser.parse(newName,0);keywordResult!==null&&keywordResult.keyword.toLowerCase()===newName.toLowerCase()&&conflicts.push(`'${newName}' is a reserved SQL keyword and should not be used as a CTE name`)}catch(error){console.warn(`Failed to check keyword conflicts for '${newName}':`,error),this.isBasicReservedKeyword(newName)&&conflicts.push(`'${newName}' is a reserved SQL keyword and should not be used as a CTE name`)}return conflicts}isBasicReservedKeyword(name){return["select","from","where","with","as","union","join","table","null"].includes(name.toLowerCase())}isCTENameInQuery(query,cteName){return query instanceof SimpleSelectQuery&&query.withClause?query.withClause.tables.some(cte=>cte.aliasExpression&&cte.aliasExpression.table&&cte.aliasExpression.table.name===cteName):query instanceof BinarySelectQuery?this.isCTENameInQuery(query.left,cteName)||this.isCTENameInQuery(query.right,cteName):!1}};var ERROR_MESSAGES2={invalidSql:"Invalid SQL: unable to parse query",invalidPosition:"Invalid position: line or column out of bounds",noLexemeAtPosition:"No lexeme found at the specified position",notAnAlias:"Selected lexeme is not a valid alias",invalidNewName:"New alias name must be a non-empty string",sameNames:"Old and new alias names cannot be the same",nameConflict:name=>`Alias '${name}' already exists in this scope`,aliasNotFound:name=>`Alias '${name}' not found in current scope`},AliasRenamer=class{constructor(){this.keywordParser=new KeywordParser(keywordTrie)}renameAlias(sql,position,newName,options={}){try{this.validateInputs(sql,position,newName);let lexeme=LexemeCursor.findLexemeAtLineColumn(sql,position);if(!lexeme)throw new Error(ERROR_MESSAGES2.noLexemeAtPosition);this.validateLexemeIsAlias(lexeme);let query=SelectQueryParser.parse(sql),scope=this.detectAliasScope(sql,query,lexeme,options.scopeType),references=this.collectAliasReferences(scope,lexeme.value),conflicts=this.checkNameConflicts(scope,newName,lexeme.value);if(conflicts.length>0)return{success:!1,originalSql:sql,changes:[],conflicts,scope};let changes=this.prepareChanges(references,newName);if(options.dryRun)return{success:!0,originalSql:sql,changes,conflicts,scope};let newSql=this.performLexemeBasedRename(sql,lexeme.value,newName,scope);return{success:!0,originalSql:sql,newSql,changes,scope}}catch(error){return{success:!1,originalSql:sql,changes:[],conflicts:[error instanceof Error?error.message:String(error)]}}}validateInputs(sql,position,newName){if(!sql||typeof sql!="string"||sql.trim()==="")throw new Error(ERROR_MESSAGES2.invalidSql);if(!position||typeof position.line!="number"||typeof position.column!="number"||position.line<1||position.column<1)throw new Error(ERROR_MESSAGES2.invalidPosition);if(!newName||typeof newName!="string"||newName.trim()==="")throw new Error(ERROR_MESSAGES2.invalidNewName)}validateLexemeIsAlias(lexeme){if(!(lexeme.type&64))throw new Error(ERROR_MESSAGES2.notAnAlias)}detectAliasScope(sql,query,lexeme,scopeType){if(!lexeme.position)return{type:"main",query,startPosition:0,endPosition:sql.length};let lexemePosition=lexeme.position.startPosition;return scopeType&&scopeType!=="auto"?this.createScopeForType(scopeType,sql,query,lexemePosition):this.autoDetectScope(sql,query,lexemePosition)}createScopeForType(scopeType,sql,query,position){switch(scopeType){case"cte":return this.detectCTEScope(sql,query,position);case"subquery":return this.detectSubqueryScope(sql,query,position);case"main":default:return{type:"main",query,startPosition:0,endPosition:sql.length}}}autoDetectScope(sql,query,position){let cteScope=this.detectCTEScope(sql,query,position);if(cteScope.type==="cte")return cteScope;let subqueryScope=this.detectSubqueryScope(sql,query,position);return subqueryScope.type==="subquery"?subqueryScope:{type:"main",query,startPosition:0,endPosition:sql.length}}detectCTEScope(sql,query,position){try{let analysis=CTERegionDetector.analyzeCursorPosition(sql,position);if(analysis.isInCTE&&analysis.cteRegion){let cteQuery=this.findCTEQueryByName(query,analysis.cteRegion.name);return{type:"cte",name:analysis.cteRegion.name,query:cteQuery||query,startPosition:analysis.cteRegion.startPosition,endPosition:analysis.cteRegion.endPosition}}}catch(error){console.warn("CTE scope detection failed:",error)}return{type:"main",query,startPosition:0,endPosition:sql.length}}detectSubqueryScope(sql,query,position){return{type:"main",query,startPosition:0,endPosition:sql.length}}findCTEQueryByName(query,cteName){if(query instanceof SimpleSelectQuery&&query.withClause?.tables){for(let cte of query.withClause.tables)if(cte.aliasExpression.table.name===cteName)return cte.query}else if(query instanceof BinarySelectQuery){let leftResult=this.findCTEQueryByName(query.left,cteName);if(leftResult)return leftResult;let rightResult=this.findCTEQueryByName(query.right,cteName);if(rightResult)return rightResult}return null}collectAliasReferences(scope,aliasName){let references=[];try{let tableReferences=this.collectTableAliasReferences(scope,aliasName);references.push(...tableReferences);let columnReferences=this.collectColumnAliasReferences(scope,aliasName);references.push(...columnReferences)}catch(error){console.warn(`Failed to collect alias references for '${aliasName}':`,error)}return references}collectTableAliasReferences(scope,aliasName){let references=[];try{let tableSources=new TableSourceCollector(!0).collect(scope.query);for(let tableSource of tableSources)if(tableSource.getSourceName()===aliasName){let lexeme=this.createLexemeFromTableSource(tableSource,aliasName);lexeme&&references.push({lexeme,scope,referenceType:"definition",context:"table"})}}catch(error){console.warn(`Failed to collect table alias references for '${aliasName}':`,error)}return references}collectColumnAliasReferences(scope,aliasName){let references=[];try{let columnRefs=new ColumnReferenceCollector().collect(scope.query);for(let columnRef of columnRefs)if(columnRef.namespaces&&columnRef.namespaces.length>0){for(let namespace of columnRef.namespaces)if(namespace.name===aliasName){let lexeme=this.createLexemeFromNamespace(namespace,aliasName);lexeme&&references.push({lexeme,scope,referenceType:"usage",context:"column"})}}}catch(error){console.warn(`Failed to collect column alias references for '${aliasName}':`,error)}return references}createLexemeFromTableSource(tableSource,aliasName){try{return{type:64,value:aliasName,comments:null,position:{startPosition:0,endPosition:aliasName.length}}}catch(error){return console.warn("Failed to create lexeme from table source:",error),null}}createLexemeFromNamespace(namespace,aliasName){try{return{type:64,value:aliasName,comments:null,position:{startPosition:0,endPosition:aliasName.length}}}catch(error){return console.warn("Failed to create lexeme from namespace:",error),null}}checkNameConflicts(scope,newName,currentName){let conflicts=[];if(newName.toLowerCase()===currentName.toLowerCase())return conflicts.push(ERROR_MESSAGES2.sameNames),conflicts;try{let tableConflicts=this.checkTableAliasConflicts(scope,newName);conflicts.push(...tableConflicts);let keywordConflicts=this.checkKeywordConflicts(newName);conflicts.push(...keywordConflicts)}catch(error){console.warn(`Error during conflict detection for '${newName}':`,error),conflicts.push(`Unable to verify conflicts for name '${newName}'`)}return conflicts}checkTableAliasConflicts(scope,newName){let conflicts=[];try{let tableSources=new TableSourceCollector(!0).collect(scope.query);for(let tableSource of tableSources){let aliasName=tableSource.getSourceName();if(aliasName&&aliasName.toLowerCase()===newName.toLowerCase()){conflicts.push(ERROR_MESSAGES2.nameConflict(newName));continue}let tableName=this.extractTableName(tableSource);tableName&&tableName.toLowerCase()===newName.toLowerCase()&&conflicts.push(`'${newName}' conflicts with table name in this scope`)}}catch(error){console.warn(`Failed to check table alias conflicts for '${newName}':`,error)}return conflicts}extractTableName(tableSource){try{if(tableSource.qualifiedName&&tableSource.qualifiedName.name){let name=tableSource.qualifiedName.name;if(typeof name=="string")return name;if(name.name&&typeof name.name=="string")return name.name;if(name.value&&typeof name.value=="string")return name.value}return tableSource.table&&typeof tableSource.table=="string"?tableSource.table:null}catch(error){return console.warn("Failed to extract table name from table source:",error),null}}checkKeywordConflicts(newName){let conflicts=[];if(this.isBasicReservedKeyword(newName))return conflicts.push(`'${newName}' is a reserved SQL keyword and should not be used as an alias`),conflicts;try{let keywordResult=this.keywordParser.parse(newName,0);keywordResult!==null&&keywordResult.keyword.toLowerCase()===newName.toLowerCase()&&conflicts.push(`'${newName}' is a reserved SQL keyword and should not be used as an alias`)}catch(error){console.warn(`Failed to check keyword conflicts for '${newName}':`,error)}return conflicts}isBasicReservedKeyword(name){return["select","from","where","join","table","null","and","or"].includes(name.toLowerCase())}prepareChanges(references,newName){return references.map(ref=>({oldName:ref.lexeme.value,newName,position:LexemeCursor.charOffsetToLineColumn("",ref.lexeme.position?.startPosition||0)||{line:1,column:1},context:ref.context,referenceType:ref.referenceType}))}performLexemeBasedRename(sql,aliasName,newName,scope){try{let targetLexemes=LexemeCursor.getAllLexemesWithPosition(sql).filter(lexeme=>lexeme.value===aliasName&&lexeme.position&&lexeme.position.startPosition>=scope.startPosition&&lexeme.position.endPosition<=scope.endPosition&&lexeme.type&64);if(targetLexemes.length===0)return sql;targetLexemes.sort((a,b)=>b.position.startPosition-a.position.startPosition);let modifiedSql=sql;for(let lexeme of targetLexemes){let pos=lexeme.position;modifiedSql=modifiedSql.substring(0,pos.startPosition)+newName+modifiedSql.substring(pos.endPosition)}return modifiedSql}catch(error){throw console.error("Failed to perform lexeme-based rename:",error),new Error(`Unable to rename alias using lexeme approach: ${error instanceof Error?error.message:String(error)}`)}}};var SqlIdentifierRenamer=class{renameIdentifiers(sql,renames){if(renames.size===0)return sql;let result=sql;for(let[originalValue,newValue]of renames)result=this.replaceIdentifierSafely(result,originalValue,newValue);return result}renameIdentifier(sql,oldIdentifier,newIdentifier){return this.replaceIdentifierSafely(sql,oldIdentifier,newIdentifier)}renameIdentifierInScope(sql,oldIdentifier,newIdentifier,scopeRange){if(!scopeRange)return this.replaceIdentifierSafely(sql,oldIdentifier,newIdentifier);let beforeScope=sql.slice(0,scopeRange.start),scopeContent=sql.slice(scopeRange.start,scopeRange.end),afterScope=sql.slice(scopeRange.end),modifiedScopeContent=this.replaceIdentifierSafely(scopeContent,oldIdentifier,newIdentifier);return beforeScope+modifiedScopeContent+afterScope}checkRenameability(sql,position){let charPosition=this.positionToCharIndex(sql,position);if(this.isInsideStringLiteral(sql,charPosition))return{canRename:!1,reason:"Cannot rename identifiers inside string literal"};let identifier=this.getIdentifierAtPosition(sql,charPosition);if(!identifier)return{canRename:!1,reason:"No identifier found at position"};let type=this.determineIdentifierType(sql,charPosition,identifier),scopeRange=this.calculateScopeRange(sql,charPosition,type);return{canRename:!0,currentName:identifier,type,scopeRange}}renameAtPosition(sql,position,newName){let renameability=this.checkRenameability(sql,position);if(!renameability.canRename||!renameability.currentName)throw new Error(renameability.reason||"Cannot rename at this position");return this.renameIdentifierInScope(sql,renameability.currentName,newName,renameability.scopeRange)}positionToCharIndex(sql,position){let lines=sql.split(`
32
+ `),charIndex=0;for(let i=0;i<position.line-1&&i<lines.length;i++)charIndex+=lines[i].length+1;return charIndex+=position.column-1,Math.min(charIndex,sql.length-1)}isInsideStringLiteral(sql,charPosition){let inString=!1;for(let i=0;i<charPosition&&i<sql.length;i++)sql[i]==="'"&&(inString=!inString);return inString}getIdentifierAtPosition(sql,charPosition){if(charPosition>=sql.length)return null;let start=charPosition;for(;start>0&&this.isIdentifierChar(sql.charCodeAt(start-1));)start--;let end=charPosition;for(;end<sql.length&&this.isIdentifierChar(sql.charCodeAt(end));)end++;return start===end?null:sql.slice(start,end)}determineIdentifierType(sql,charPosition,identifier){let beforePosition=sql.slice(0,charPosition),afterPosition=sql.slice(charPosition),beforeUpper=beforePosition.toUpperCase(),afterUpper=afterPosition.toUpperCase();if(beforeUpper.lastIndexOf("WITH")!==-1){let start=charPosition;for(;start>0&&this.isIdentifierChar(sql.charCodeAt(start-1));)start--;let end=charPosition;for(;end<sql.length&&this.isIdentifierChar(sql.charCodeAt(end));)end++;if(sql.slice(end).toUpperCase().trim().startsWith("AS ("))return"cte"}let beforeLines=beforePosition.split(`
33
+ `),currentLine=beforeLines[beforeLines.length-1].toUpperCase();if(currentLine.includes("FROM ")||currentLine.includes("JOIN "))return"table_alias";let contextBefore=beforePosition.slice(Math.max(0,charPosition-50)),contextAfter=afterPosition.slice(0,50),fullContext=(contextBefore+identifier+contextAfter).toUpperCase();return fullContext.includes(" AS "+identifier.toUpperCase())||fullContext.includes(" "+identifier.toUpperCase()+" ON")||fullContext.includes(" "+identifier.toUpperCase()+`
34
+ `),"table_alias"}calculateScopeRange(sql,charPosition,type){if(type==="cte")return{start:0,end:sql.length};let beforePosition=sql.slice(0,charPosition),afterPosition=sql.slice(charPosition),lastSelect=beforePosition.toUpperCase().lastIndexOf("SELECT"),start=lastSelect!==-1?lastSelect:0,nextMajorClause=afterPosition.search(/\b(SELECT|WITH|UNION)\b/i),end=nextMajorClause!==-1?charPosition+nextMajorClause:sql.length;return{start,end}}replaceIdentifierSafely(sql,oldIdentifier,newIdentifier){if(oldIdentifier===newIdentifier||oldIdentifier.length===0)return sql;let result=[],position=0,sqlLength=sql.length,oldIdLength=oldIdentifier.length;for(;position<sqlLength;){let char=sql[position],charCode=char.charCodeAt(0);if(charCode===34||charCode===96||charCode===91){let{content,nextPosition}=this.extractAndReplaceQuotedIdentifier(sql,position,char,oldIdentifier,newIdentifier);result.push(content),position=nextPosition;continue}if(charCode===39){let{content,nextPosition}=this.extractQuotedString(sql,position,char);result.push(content),position=nextPosition;continue}if(charCode===45&&position+1<sqlLength&&sql.charCodeAt(position+1)===45){let{content,nextPosition}=this.extractLineComment(sql,position);result.push(content),position=nextPosition;continue}if(charCode===47&&position+1<sqlLength&&sql.charCodeAt(position+1)===42){let{content,nextPosition}=this.extractBlockComment(sql,position);result.push(content),position=nextPosition;continue}if(this.isIdentifierStartChar(charCode)&&this.matchesIdentifierAt(sql,position,oldIdentifier)){let beforePosition=position-1,afterPosition=position+oldIdLength,beforeChar=beforePosition>=0?sql[beforePosition]:null,afterChar=afterPosition<sqlLength?sql[afterPosition]:null;if(this.hasValidWordBoundaries(beforeChar,afterChar)){result.push(newIdentifier),position+=oldIdLength;continue}}result.push(char),position++}return result.join("")}validateRename(originalSql,modifiedSql,oldIdentifier,newIdentifier){if(originalSql===modifiedSql||!modifiedSql.includes(newIdentifier))return!1;let originalOccurrences=this.countWordOccurrences(originalSql,oldIdentifier);return this.countWordOccurrences(modifiedSql,oldIdentifier)<originalOccurrences}extractAndReplaceQuotedIdentifier(sql,startPosition,quoteChar,oldIdentifier,newIdentifier){if(quoteChar==="[")return this.extractAndReplaceBracketedIdentifier(sql,startPosition,oldIdentifier,newIdentifier);let result=[quoteChar],position=startPosition+1,identifierStart=position;for(;position<sql.length;){let char=sql[position];if(char===quoteChar){if(position+1<sql.length&&sql[position+1]===quoteChar){result.push(char),result.push(sql[position+1]),position+=2;continue}let quotedContent=sql.slice(identifierStart,position);quotedContent.toLowerCase()===oldIdentifier.toLowerCase()?result.push(newIdentifier):result.push(quotedContent),result.push(char);break}position++}return{content:result.join(""),nextPosition:position+1}}extractAndReplaceBracketedIdentifier(sql,startPosition,oldIdentifier,newIdentifier){let result=["["],position=startPosition+1,identifierStart=position;for(;position<sql.length;){let char=sql[position];if(char==="]"){let bracketedContent=sql.slice(identifierStart,position);bracketedContent.toLowerCase()===oldIdentifier.toLowerCase()?result.push(newIdentifier):result.push(bracketedContent),result.push(char);break}position++}return{content:result.join(""),nextPosition:position+1}}extractQuotedString(sql,startPosition,quoteChar){let result=[quoteChar],position=startPosition+1;for(;position<sql.length;){let char=sql[position];if(result.push(char),char===quoteChar){if(position+1<sql.length&&sql[position+1]===quoteChar){result.push(sql[position+1]),position+=2;continue}break}position++}return{content:result.join(""),nextPosition:position+1}}extractLineComment(sql,startPosition){let result=[],position=startPosition;for(;position<sql.length&&sql.charCodeAt(position)!==10&&sql.charCodeAt(position)!==13;)result.push(sql[position]),position++;return position<sql.length&&(sql.charCodeAt(position)===10||sql.charCodeAt(position)===13)&&(result.push(sql[position]),position++),{content:result.join(""),nextPosition:position}}extractBlockComment(sql,startPosition){let result=["/","*"],position=startPosition+2;for(;position<sql.length-1;){let char=sql[position];if(result.push(char),char==="*"&&sql[position+1]==="/"){result.push("/"),position+=2;break}position++}return{content:result.join(""),nextPosition:position}}isIdentifierStartChar(charCode){return charCode>=65&&charCode<=90||charCode>=97&&charCode<=122||charCode===95}isIdentifierChar(charCode){return charCode>=65&&charCode<=90||charCode>=97&&charCode<=122||charCode>=48&&charCode<=57||charCode===95}matchesIdentifierAt(sql,position,identifier){if(position+identifier.length>sql.length)return!1;for(let i=0;i<identifier.length;i++){let sqlChar=sql.charCodeAt(position+i),idChar=identifier.charCodeAt(i),sqlLower=sqlChar>=65&&sqlChar<=90?sqlChar+32:sqlChar,idLower=idChar>=65&&idChar<=90?idChar+32:idChar;if(sqlLower!==idLower)return!1}return!0}hasValidWordBoundaries(beforeChar,afterChar){let isValidBefore=beforeChar===null||!this.isIdentifierChar(beforeChar.charCodeAt(0)),isValidAfter=afterChar===null||!this.isIdentifierChar(afterChar.charCodeAt(0));return isValidBefore&&isValidAfter}countWordOccurrences(sql,identifier){let count=0,position=0,sqlLength=sql.length,idLength=identifier.length;for(;position<=sqlLength-idLength;){if(this.matchesIdentifierAt(sql,position,identifier)){let beforePosition=position-1,afterPosition=position+idLength,beforeChar=beforePosition>=0?sql[beforePosition]:null,afterChar=afterPosition<sqlLength?sql[afterPosition]:null;this.hasValidWordBoundaries(beforeChar,afterChar)&&count++}position++}return count}};var SmartRenamer=class{constructor(){this.cteRenamer=new CTERenamer,this.aliasRenamer=new AliasRenamer,this.identifierRenamer=new SqlIdentifierRenamer}isRenameable(sql,position){try{if(!sql?.trim())return{renameable:!1,renamerType:"none",reason:"Empty SQL"};if(!position||position.line<1||position.column<1)return{renameable:!1,renamerType:"none",reason:"Invalid position"};let lexeme=LexemeCursor.findLexemeAtLineColumn(sql,position);if(!lexeme)return{renameable:!1,renamerType:"none",reason:"No token found"};if(!(lexeme.type&2112))return{renameable:!1,renamerType:"none",tokenName:lexeme.value,reason:`Token '${lexeme.value}' is not an identifier`};let tokenName=lexeme.value,renamerType=this.detectRenamerType(sql,tokenName);return renamerType==="unknown"?{renameable:!1,renamerType:"none",tokenName,reason:`Cannot determine if '${tokenName}' is renameable`}:{renameable:!0,renamerType,tokenName}}catch(error){return{renameable:!1,renamerType:"none",reason:`Error: ${error instanceof Error?error.message:String(error)}`}}}rename(sql,position,newName,options){try{if(!sql?.trim())return this.createErrorResult(sql,newName,"unknown","","SQL cannot be empty");if(!position||position.line<1||position.column<1)return this.createErrorResult(sql,newName,"unknown","","Position must be valid line/column (1-based)");if(!newName?.trim())return this.createErrorResult(sql,newName,"unknown","","New name cannot be empty");let lexeme=LexemeCursor.findLexemeAtLineColumn(sql,position);if(!lexeme)return this.createErrorResult(sql,newName,"unknown","",`No identifier found at line ${position.line}, column ${position.column}`);if(!(lexeme.type&64))return this.createErrorResult(sql,newName,"unknown",lexeme.value,`Token '${lexeme.value}' is not renameable`);let originalName=lexeme.value,preserveFormatting=options?.preserveFormatting??!1,renamerType=this.detectRenamerType(sql,originalName);if(preserveFormatting)try{let formatPreservedResult=this.attemptFormattingPreservationRename(sql,position,newName,originalName,renamerType);if(formatPreservedResult.success)return formatPreservedResult}catch(error){console.warn("Formatting preservation failed, falling back to standard rename:",error)}try{let newSql;if(renamerType==="cte")newSql=this.cteRenamer.renameCTEAtPosition(sql,position,newName);else if(renamerType==="alias"){let result=this.aliasRenamer.renameAlias(sql,position,newName);if(!result.success)return{success:!1,originalSql:sql,renamerType:"alias",originalName,newName,error:result.conflicts?.join(", ")||"Alias rename failed",formattingPreserved:!1,formattingMethod:"smart-renamer-only"};newSql=result.newSql}else return this.createErrorResult(sql,newName,"unknown",originalName,`Cannot determine if '${originalName}' is a CTE name or table alias`);return{success:!0,originalSql:sql,newSql,renamerType,originalName,newName,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}catch(error){return this.createErrorResult(sql,newName,renamerType,originalName,`${renamerType.toUpperCase()} rename failed: ${error instanceof Error?error.message:String(error)}`)}}catch(error){return this.createErrorResult(sql,newName,"unknown","",`Unexpected error: ${error instanceof Error?error.message:String(error)}`)}}detectRenamerType(sql,identifierName){try{let query=SelectQueryParser.parse(sql);return this.isCTEName(query,identifierName)?"cte":"alias"}catch{return"unknown"}}isCTEName(query,name){return query instanceof SimpleSelectQuery&&query.withClause?query.withClause.tables.some(cte=>cte.aliasExpression&&cte.aliasExpression.table&&cte.aliasExpression.table.name===name):query instanceof BinarySelectQuery?this.isCTEName(query.left,name)||this.isCTEName(query.right,name):!1}attemptFormattingPreservationRename(sql,position,newName,originalName,renamerType){let standardResult=this.performStandardRename(sql,position,newName,originalName,renamerType);if(!standardResult.success)return{...standardResult,formattingPreserved:!1,formattingMethod:"smart-renamer-only"};let renameMap=new Map([[originalName,newName]]);try{let formattedSql=this.identifierRenamer.renameIdentifiers(sql,renameMap);if(this.validateRenameResult(sql,formattedSql,originalName,newName))return{success:!0,originalSql:sql,newSql:formattedSql,renamerType,originalName,newName,formattingPreserved:!0,formattingMethod:"sql-identifier-renamer"};throw new Error("Validation failed: rename may not have been applied correctly")}catch{return{...standardResult,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}}performStandardRename(sql,position,newName,originalName,renamerType){try{let newSql;if(renamerType==="cte")newSql=this.cteRenamer.renameCTEAtPosition(sql,position,newName);else if(renamerType==="alias"){let result=this.aliasRenamer.renameAlias(sql,position,newName);if(!result.success)return{success:!1,originalSql:sql,renamerType:"alias",originalName,newName,error:result.conflicts?.join(", ")||"Alias rename failed"};newSql=result.newSql}else return{success:!1,originalSql:sql,renamerType:"unknown",originalName,newName,error:`Cannot determine if '${originalName}' is a CTE name or table alias`};return{success:!0,originalSql:sql,newSql,renamerType,originalName,newName}}catch(error){return{success:!1,originalSql:sql,renamerType,originalName,newName,error:`${renamerType.toUpperCase()} rename failed: ${error instanceof Error?error.message:String(error)}`}}}validateRenameResult(originalSql,newSql,oldName,newName){if(originalSql===newSql||!newSql.includes(newName))return!1;let originalOccurrences=this.countWordOccurrences(originalSql,oldName);return this.countWordOccurrences(newSql,oldName)<originalOccurrences}countWordOccurrences(sql,name){let regex=new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\b`,"gi"),matches=sql.match(regex);return matches?matches.length:0}createErrorResult(sql,newName,renamerType,originalName,error){return{success:!1,originalSql:sql,renamerType,originalName,newName,error,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}batchRename(sql,renames,options){if(options?.preserveFormatting??!1)try{let renameMap=new Map(Object.entries(renames)),formattedSql=this.identifierRenamer.renameIdentifiers(sql,renameMap),originalNames=Object.keys(renames),newNames=Object.values(renames);return{success:!0,originalSql:sql,newSql:formattedSql,renamerType:"alias",originalName:originalNames.join(", "),newName:newNames.join(", "),formattingPreserved:!0,formattingMethod:"sql-identifier-renamer"}}catch(error){return{success:!1,originalSql:sql,renamerType:"unknown",originalName:Object.keys(renames).join(", "),newName:Object.values(renames).join(", "),error:`Batch rename failed: ${error instanceof Error?error.message:String(error)}`,formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}else return{success:!1,originalSql:sql,renamerType:"unknown",originalName:Object.keys(renames).join(", "),newName:Object.values(renames).join(", "),error:"Batch rename without formatting preservation not implemented. Use individual renames or enable formatting preservation.",formattingPreserved:!1,formattingMethod:"smart-renamer-only"}}};var OriginalFormatRestorer=class{restore(lexemes){if(lexemes.length===0)return"";let result="";for(let lexeme of lexemes)result+=lexeme.value,lexeme.followingWhitespace&&(result+=lexeme.followingWhitespace);return result}restoreWithComments(lexemes,includeComments=!0){if(lexemes.length===0)return"";let result="";for(let lexeme of lexemes){if(result+=lexeme.value,includeComments&&lexeme.inlineComments&&lexeme.inlineComments.length>0)for(let comment of lexeme.inlineComments)comment.trim().length>0&&(result+=` -- ${comment}`);lexeme.followingWhitespace&&(result+=lexeme.followingWhitespace)}return result}analyzeFormatting(lexemes){let totalWhitespace=0,totalComments=0,spaceCount=0,tabCount=0,indentLines=0,totalIndentSize=0;for(let lexeme of lexemes){if(lexeme.followingWhitespace){totalWhitespace+=lexeme.followingWhitespace.length;let lines=lexeme.followingWhitespace.split(`
35
+ `);for(let i=1;i<lines.length;i++){let line=lines[i],leadingSpaces=line.match(/^ */)?.[0].length||0,leadingTabs=line.match(/^\t*/)?.[0].length||0;(leadingSpaces>0||leadingTabs>0)&&(indentLines++,totalIndentSize+=leadingSpaces+leadingTabs*4,spaceCount+=leadingSpaces,tabCount+=leadingTabs)}}lexeme.inlineComments&&(totalComments+=lexeme.inlineComments.length)}let indentationStyle="none";return spaceCount>0&&tabCount>0?indentationStyle="mixed":spaceCount>0?indentationStyle="spaces":tabCount>0&&(indentationStyle="tabs"),{totalWhitespace,totalComments,indentationStyle,averageIndentSize:indentLines>0?totalIndentSize/indentLines:0}}validateFormattingLexemes(lexemes){let issues=[];for(let i=0;i<lexemes.length;i++){let lexeme=lexemes[i];lexeme.position||issues.push(`Lexeme ${i} missing position information`),lexeme.followingWhitespace===void 0&&issues.push(`Lexeme ${i} missing followingWhitespace property`),lexeme.inlineComments===void 0&&issues.push(`Lexeme ${i} missing inlineComments property`),lexeme.position&&lexeme.position.startPosition>=lexeme.position.endPosition&&issues.push(`Lexeme ${i} has invalid position range`)}return{isValid:issues.length===0,issues}}};var PostgresObjectEntityCteBuilder=class _PostgresObjectEntityCteBuilder{constructor(){this.jsonColumnCounter=0;this.entityToJsonColumnMap=new Map;this.columnMappings=[]}static{this.CTE_OBJECT_PREFIX="cte_object_depth_"}static{this.WILDCARD_COLUMN="*"}buildObjectEntityCtes(initialCte,allEntities,mapping){this.jsonColumnCounter=0,this.entityToJsonColumnMap.clear(),this.columnMappings=[];let ctes=[initialCte],previousCteAlias=initialCte.aliasExpression.table.name,objectEntityInfos=this.collectAndSortObjectEntities(mapping,allEntities),entitiesByDepth=this.groupEntitiesByDepth(objectEntityInfos),depths=Array.from(entitiesByDepth.keys()).sort((a,b)=>b-a);for(let depth of depths){let entitiesAtDepth=entitiesByDepth.get(depth),cteAlias=`${_PostgresObjectEntityCteBuilder.CTE_OBJECT_PREFIX}${depth}`,cte=this.buildDepthCte(entitiesAtDepth,previousCteAlias,cteAlias,mapping,allEntities);ctes.push(cte),previousCteAlias=cteAlias}return{ctes,lastCteAlias:previousCteAlias,columnMappings:this.columnMappings}}generateUniqueJsonColumnName(entityName,entityId,depth){this.jsonColumnCounter++;let columnName=`${entityName.toLowerCase()}_json_${this.jsonColumnCounter}`;return this.columnMappings.push({entityId,entityName,generatedColumnName:columnName,depth}),columnName}collectAndSortObjectEntities(mapping,allEntities){let objectInfos=[],calculateActualObjectNestingDepth=entityIdOfObject=>{let initialEntity=allEntities.get(entityIdOfObject);if(!initialEntity)throw new Error(`Entity ${entityIdOfObject} not found for depth calculation.`);if(initialEntity.isRoot)return 0;if(!initialEntity.parentId)return 1;let currentParentIdInHierarchy=initialEntity.parentId,calculatedObjectDepth=0,visitedInPath=new Set;for(visitedInPath.add(entityIdOfObject);currentParentIdInHierarchy;){if(visitedInPath.has(currentParentIdInHierarchy))throw new Error(`Circular dependency detected: ${currentParentIdInHierarchy} already visited in path for ${entityIdOfObject}`);visitedInPath.add(currentParentIdInHierarchy);let parentEntityData=allEntities.get(currentParentIdInHierarchy);if(!parentEntityData)throw new Error(`Parent entity ${currentParentIdInHierarchy} not found during depth calculation for ${entityIdOfObject}`);let parentIsConsideredAnObjectForNesting=!1;if(parentEntityData.isRoot)parentIsConsideredAnObjectForNesting=!0;else{let parentDefinition=mapping.nestedEntities.find(ne=>ne.id===currentParentIdInHierarchy);if(parentDefinition)parentDefinition.relationshipType==="object"&&(parentIsConsideredAnObjectForNesting=!0);else throw new Error(`Parent entity ${currentParentIdInHierarchy} (ancestor of ${entityIdOfObject}) has no definition in mapping.nestedEntities and is not root.`)}if(parentIsConsideredAnObjectForNesting&&calculatedObjectDepth++,parentEntityData.isRoot)break;currentParentIdInHierarchy=parentEntityData.parentId}return calculatedObjectDepth};return mapping.nestedEntities.forEach(nestedEntity=>{if(nestedEntity.relationshipType==="object"){let entity=allEntities.get(nestedEntity.id);entity&&!entity.isRoot&&objectInfos.push({entity,depth:calculateActualObjectNestingDepth(nestedEntity.id)})}}),objectInfos}groupEntitiesByDepth(objectInfos){let entitiesByDepth=new Map;return objectInfos.forEach(info=>{let depth=info.depth;entitiesByDepth.has(depth)||entitiesByDepth.set(depth,[]),entitiesByDepth.get(depth).push(info)}),entitiesByDepth}buildDepthCte(entitiesAtDepth,previousCteAlias,cteAlias,mapping,allEntities){let selectItems=[new SelectItem(new ColumnReference(null,new IdentifierString(_PostgresObjectEntityCteBuilder.WILDCARD_COLUMN)))];for(let{entity}of entitiesAtDepth){let jsonColumn=this.buildEntityJsonColumn(entity,mapping,allEntities);selectItems.push(jsonColumn)}let cteSelect=new SimpleSelectQuery({selectClause:new SelectClause(selectItems),fromClause:new FromClause(new SourceExpression(new TableSource(null,new IdentifierString(previousCteAlias)),null),null)});return new CommonTable(cteSelect,new SourceAliasExpression(cteAlias,null),null)}buildEntityJsonColumn(entity,mapping,allEntities){let{jsonObjectArgs,nullChecks}=this.prepareEntityColumns(entity);this.addChildObjectRelationships(entity,jsonObjectArgs,mapping,allEntities);let jsonObject=this.createJsonObject(jsonObjectArgs),nullCondition=this.buildNullCondition(nullChecks),caseExpr=this.createCaseExpression(nullCondition,jsonObject),depth=this.calculateApproximateDepth(entity,mapping),jsonColumnName=this.generateUniqueJsonColumnName(entity.name,entity.id,depth);return this.entityToJsonColumnMap.set(entity.id,jsonColumnName),new SelectItem(caseExpr,jsonColumnName)}calculateApproximateDepth(entity,mapping){if(entity.isRoot)return 0;if(!entity.parentId)return 1;let depth=1,currentParentId=entity.parentId;for(;currentParentId&&currentParentId!==mapping.rootEntity.id;){let parentEntity=mapping.nestedEntities.find(e=>e.id===currentParentId);if(!parentEntity)break;depth++,currentParentId=parentEntity.parentId}return depth}prepareEntityColumns(entity){let jsonObjectArgs=[],nullChecks=[];return Object.entries(entity.columns).forEach(([jsonKey,sqlColumn])=>{jsonObjectArgs.push(new LiteralValue(jsonKey,void 0,!0)),jsonObjectArgs.push(new ColumnReference(null,new IdentifierString(sqlColumn))),nullChecks.push(new BinaryExpression(new ColumnReference(null,new IdentifierString(sqlColumn)),"is",new LiteralValue(null)))}),{jsonObjectArgs,nullChecks}}addChildObjectRelationships(entity,jsonObjectArgs,mapping,allEntities){mapping.nestedEntities.filter(ne=>ne.parentId===entity.id&&ne.relationshipType==="object").forEach(childEntity=>{let child=allEntities.get(childEntity.id);if(child){jsonObjectArgs.push(new LiteralValue(childEntity.propertyName,void 0,!0));let jsonColumnName=this.entityToJsonColumnMap.get(child.id);if(!jsonColumnName)throw new Error(`JSON column name not found for child entity: ${child.id}`);jsonObjectArgs.push(new ColumnReference(null,new IdentifierString(jsonColumnName)))}})}createJsonObject(args){let jsonBuildFunction="jsonb_build_object";return new FunctionCall(null,new RawString(jsonBuildFunction),new ValueList(args),null)}buildNullCondition(nullChecks){return nullChecks.reduce((acc,check)=>acc?new BinaryExpression(acc,"and",check):check)}createCaseExpression(nullCondition,jsonObject){return new CaseExpression(null,new SwitchCaseArgument([new CaseKeyValuePair(nullCondition,new LiteralValue(null))],jsonObject))}};var PostgresArrayEntityCteBuilder=class _PostgresArrayEntityCteBuilder{static{this.CTE_ARRAY_PREFIX="cte_array_depth_"}static{this.JSON_FUNCTIONS={BUILD_OBJECT:"jsonb_build_object",AGGREGATE:"jsonb_agg"}}buildArrayEntityCtes(ctesSoFar,aliasOfCteToBuildUpon,allEntities,mapping,columnMappings){let currentCtes=[...ctesSoFar],currentCteAlias=aliasOfCteToBuildUpon,sortedArrayInfos=this.collectAndSortArrayEntities(mapping,allEntities);if(sortedArrayInfos.length===0)return{updatedCtes:currentCtes,lastCteAlias:currentCteAlias};let entitiesByDepth=this.groupEntitiesByDepth(sortedArrayInfos),depths=Array.from(entitiesByDepth.keys()).sort((a,b)=>b-a);for(let depth of depths){let infos=entitiesByDepth.get(depth),{cte,newCteAlias}=this.buildDepthCte(infos,currentCteAlias,currentCtes,depth,mapping,columnMappings);currentCtes.push(cte),currentCteAlias=newCteAlias}return{updatedCtes:currentCtes,lastCteAlias:currentCteAlias}}collectAndSortArrayEntities(mapping,allEntities){let arrayEntityInfos=[],getDepth=entityId=>{let entity=allEntities.get(entityId);return!entity||entity.isRoot?0:entity.parentId?1+getDepth(entity.parentId):1};return mapping.nestedEntities.forEach(ne=>{if(ne.relationshipType==="array"){let currentArrayEntity=allEntities.get(ne.id),parentEntity=allEntities.get(ne.parentId);if(!currentArrayEntity||!parentEntity)throw new Error(`Configuration error: Array entity '${ne.id}' or its parent '${ne.parentId}' not found.`);let parentSqlColumns=Object.values(parentEntity.columns);if(parentSqlColumns.length===0)throw new Error(`Configuration error: Parent entity '${parentEntity.name}' (ID: ${parentEntity.id}) must have at least one column defined to serve as a linking key for child array '${ne.name}'.`);let parentIdColumnSqlName=parentSqlColumns[0];arrayEntityInfos.push({entity:currentArrayEntity,parentEntity,parentIdColumnSqlName,depth:getDepth(ne.id)})}}),arrayEntityInfos.sort((a,b)=>b.depth-a.depth),arrayEntityInfos}groupEntitiesByDepth(arrayInfos){let entitiesByDepth=new Map;return arrayInfos.forEach(info=>{let depth=info.depth;entitiesByDepth.has(depth)||entitiesByDepth.set(depth,[]),entitiesByDepth.get(depth).push(info)}),entitiesByDepth}buildDepthCte(infos,currentCteAlias,currentCtes,depth,mapping,columnMappings){let arrayColumns=new Set;infos.forEach(info=>{Object.values(info.entity.columns).forEach(col=>arrayColumns.add(col));let collectNestedColumns=parentEntityId=>{mapping.nestedEntities.filter(nestedEntity=>nestedEntity.parentId===parentEntityId).forEach(nestedEntity=>{Object.values(nestedEntity.columns).forEach(column=>{let columnName=typeof column=="string"?column:column.column;arrayColumns.add(columnName)}),collectNestedColumns(nestedEntity.id)})};collectNestedColumns(info.entity.id)});let prevCte=currentCtes.find(c=>c.aliasExpression.table.name===currentCteAlias)?.query;if(!prevCte)throw new Error(`CTE not found: ${currentCteAlias}`);let prevSelects=new SelectValueCollector(null,currentCtes).collect(prevCte),groupByItems=[],selectItems=[],currentLevelArrayColumns=new Set;infos.forEach(info=>{Object.values(info.entity.columns).forEach(col=>currentLevelArrayColumns.add(col))});let arrayEntityColumns=this.collectArrayEntityColumnsByDepth(mapping,depth),arrayInternalObjectColumns=new Set;columnMappings&&infos.forEach(info=>{mapping.nestedEntities.filter(ne=>ne.parentId===info.entity.id&&ne.relationshipType==="object").forEach(objectEntity=>{let columnMapping=columnMappings.find(cm=>cm.entityId===objectEntity.id);columnMapping&&arrayInternalObjectColumns.add(columnMapping.generatedColumnName)})}),this.processSelectVariablesForGroupBy(prevSelects,arrayColumns,arrayEntityColumns,depth,selectItems,groupByItems,arrayInternalObjectColumns);for(let info of infos){let agg=this.buildAggregationDetailsForArrayEntity(info.entity,mapping.nestedEntities,new Map,columnMappings);selectItems.push(new SelectItem(agg.jsonAgg,info.entity.propertyName))}let cteAlias=`${_PostgresArrayEntityCteBuilder.CTE_ARRAY_PREFIX}${depth}`,cteSelect=new SimpleSelectQuery({selectClause:new SelectClause(selectItems),fromClause:new FromClause(new SourceExpression(new TableSource(null,new IdentifierString(currentCteAlias)),null),null),groupByClause:groupByItems.length>0?new GroupByClause(groupByItems):null});return{cte:new CommonTable(cteSelect,new SourceAliasExpression(cteAlias,null),null),newCteAlias:cteAlias}}buildAggregationDetailsForArrayEntity(entity,nestedEntities,allEntities,columnMappings){let jsonBuildFunction=_PostgresArrayEntityCteBuilder.JSON_FUNCTIONS.BUILD_OBJECT,args=[];Object.entries(entity.columns).forEach(([jsonKey,sqlColumn])=>{args.push(new LiteralValue(jsonKey,void 0,!0)),args.push(new ColumnReference(null,new IdentifierString(sqlColumn)))}),nestedEntities.filter(ne=>ne.parentId===entity.id).forEach(childEntity=>{let propertyNameForJson=childEntity.originalPropertyName||childEntity.propertyName;if(args.push(new LiteralValue(propertyNameForJson,void 0,!0)),childEntity.relationshipType==="object"){if(!columnMappings)throw new Error(`\u274C PostgresArrayEntityCteBuilder Error: Column mappings not provided
34
36
 
35
37
  \u{1F50D} Details:
36
- - Entity ID: ${d.id}
37
- - Entity Name: ${d.name||"unknown"}
38
- - Property Name: ${d.propertyName}
39
- - Relationship Type: ${d.relationshipType}
38
+ - Entity ID: ${childEntity.id}
39
+ - Entity Name: ${childEntity.name||"unknown"}
40
+ - Property Name: ${childEntity.propertyName}
41
+ - Relationship Type: ${childEntity.relationshipType}
40
42
 
41
43
  \u{1F4A1} Solution:
42
44
  Column mappings are required for hybrid JSON column naming.
@@ -46,16 +48,16 @@ ${e}`}addRestorationComments(e,t,n){let i=[];return i.push("-- CTE Restoration:
46
48
  \u{1F527} Check:
47
49
  1. Ensure PostgresJsonQueryBuilder.buildJsonWithCteStrategy() passes columnMappings
48
50
  2. Verify PostgresObjectEntityCteBuilder.buildObjectEntityCtes() returns columnMappings
49
- 3. Check that Model-driven mapping conversion generates unique entity IDs`);let C=i.find(f=>f.entityId===d.id);if(!C){let f=i.map(J=>`${J.entityId} \u2192 ${J.generatedColumnName}`).join(", ");throw new Error(`\u274C PostgresArrayEntityCteBuilder Error: Column mapping not found
51
+ 3. Check that Model-driven mapping conversion generates unique entity IDs`);let mapping=columnMappings.find(m=>m.entityId===childEntity.id);if(!mapping){let availableMappings=columnMappings.map(m=>`${m.entityId} \u2192 ${m.generatedColumnName}`).join(", ");throw new Error(`\u274C PostgresArrayEntityCteBuilder Error: Column mapping not found
50
52
 
51
53
  \u{1F50D} Details:
52
- - Looking for Entity ID: ${d.id}
53
- - Entity Name: ${d.name||"unknown"}
54
- - Property Name: ${d.propertyName}
55
- - Relationship Type: ${d.relationshipType}
54
+ - Looking for Entity ID: ${childEntity.id}
55
+ - Entity Name: ${childEntity.name||"unknown"}
56
+ - Property Name: ${childEntity.propertyName}
57
+ - Relationship Type: ${childEntity.relationshipType}
56
58
 
57
59
  \u{1F4CB} Available Mappings:
58
- ${f||"None"}
60
+ ${availableMappings||"None"}
59
61
 
60
62
  \u{1F4A1} Solution:
61
63
  Entity IDs must match between mapping generation and usage.
@@ -64,22 +66,22 @@ ${e}`}addRestorationComments(e,t,n){let i=[];return i.push("-- CTE Restoration:
64
66
  \u{1F527} Check:
65
67
  1. Model-driven mapping conversion generates consistent entity IDs
66
68
  2. PostgresObjectEntityCteBuilder processes all entities correctly
67
- 3. Entity hierarchy and parentId relationships are correct`)}r.push(new b(null,new I(C.generatedColumnName)))}else d.relationshipType==="array"&&r.push(new b(null,new I(d.propertyName)))});let l=new U(null,new V(s),new D(r),null),u=a.JSON_FUNCTIONS.AGGREGATE,c=Object.values(e.columns)[0];return{jsonAgg:new U(null,new V(u),new D([l]),null)}}collectArrayEntityColumnsByDepth(e,t){let n=new Map,i=Math.max(t+3,5);for(let s=t;s<=i;s++)n.set(s,new Set);return e.nestedEntities.filter(s=>s.relationshipType==="array").forEach(s=>{let r=this.calculateEntityDepth(s,e);n.has(r)||n.set(r,new Set),this.addEntityColumnsToDepthSet(s,r,n),this.collectDescendantColumns(s.id,r,e,n)}),n}calculateEntityDepth(e,t){let n=0,i=e;for(;i.parentId&&i.parentId!==t.rootEntity.id;)n++,i=t.nestedEntities.find(s=>s.id===i.parentId)||i;return n}addEntityColumnsToDepthSet(e,t,n){Object.values(e.columns).forEach(i=>{let s=typeof i=="string"?i:i.column;n.get(t).add(s)})}collectDescendantColumns(e,t,n,i){n.nestedEntities.filter(s=>s.parentId===e).forEach(s=>{this.addEntityColumnsToDepthSet(s,t,i),this.collectDescendantColumns(s.id,t,n,i)})}processSelectVariablesForGroupBy(e,t,n,i,s,r,o){e.forEach(l=>{if(!t.has(l.name)){if(o&&o.has(l.name))return;this.shouldIncludeColumnInGroupBy(l.name,n,i)&&(s.push(new _(new b(null,new I(l.name)),l.name)),l.name.endsWith("_json")||r.push(new b(null,new I(l.name))))}})}shouldIncludeColumnInGroupBy(e,t,n){let i=e.endsWith("_json"),s=!0;for(let[r,o]of t.entries())if(r>=n&&o.has(e)){s=!1;break}return i&&e.startsWith("entity_")&&(s=this.shouldIncludeJsonColumn(e,n)),s}shouldIncludeJsonColumn(e,t){let n=e.match(/entity_(\d+)_json/);return n&&t>0?parseInt(n[1])<=2:!0}};var ii=class{constructor(){this.selectValueCollector=new _e(null),this.objectEntityCteBuilder=new ti,this.arrayEntityCteBuilder=new ni}validateMapping(e,t){let i=new _e().collect(e),s=new Set(i.map(u=>u.name));for(let u in t.rootEntity.columns){let c=t.rootEntity.columns[u],p=typeof c=="string"?c:c.column;if(!s.has(p))throw new Error(`Validation Error: Column "${p}" for JSON key "${u}" in root entity "${t.rootEntity.name}" not found in the query's select list.`)}let r=new Set([t.rootEntity.id]),o=new Map;t.nestedEntities.forEach(u=>{r.add(u.id),o.has(u.parentId)||o.set(u.parentId,[]),o.get(u.parentId).push(u.id)});for(let u of t.nestedEntities){if(!r.has(u.parentId))throw new Error(`Validation Error: Parent entity with ID "${u.parentId}" for nested entity "${u.name}" (ID: ${u.id}) not found.`);for(let c in u.columns){let p=u.columns[c],d=typeof p=="string"?p:p.column;if(!s.has(d))throw new Error(`Validation Error: Column "${d}" for JSON key "${c}" in nested entity "${u.name}" (ID: ${u.id}) not found in the query's select list.`)}}let l=new Set([t.rootEntity.id,...t.nestedEntities.map(u=>u.parentId)]);for(let u of l){let c=t.nestedEntities.filter(h=>h.parentId===u);if(c.filter(h=>h.relationshipType==="array").length>1){let h=u===t.rootEntity.id?t.rootEntity.name:t.nestedEntities.find(C=>C.id===u)?.name;throw new Error(`Validation Error: Parent entity "${h}" (ID: ${u}) has multiple direct array children. This is not supported.`)}let d=new Set;for(let h of c){if(d.has(h.propertyName)){let C=u===t.rootEntity.id?t.rootEntity.name:t.nestedEntities.find(f=>f.id===u)?.name;throw new Error(`Validation Error: Parent entity "${C}" (ID: ${u}) has duplicate property name "${h.propertyName}" for its children.`)}d.add(h.propertyName)}}}buildJsonQuery(e,t,n){if(n?.jsonb===!1)throw new Error("JSONB must be enabled for PostgreSQL GROUP BY compatibility. JSON type cannot be used in GROUP BY clauses. Please set jsonb: true or omit the jsonb option (defaults to true).");let i=e instanceof g?e:We.buildSimpleQuery(e);return this.buildJsonWithCteStrategy(i,t)}buildJson(e,t){return console.warn("buildJson is deprecated. Use buildJsonQuery instead."),this.buildJsonQuery(e,t)}buildJsonWithCteStrategy(e,t){this.validateMapping(e,t);let{initialCte:n,initialCteAlias:i}=this.createInitialCte(e),s=[n],r=i,o=new Map;o.set(t.rootEntity.id,{...t.rootEntity,isRoot:!0,propertyName:t.rootName}),t.nestedEntities.forEach(p=>o.set(p.id,{...p,isRoot:!1,propertyName:p.propertyName}));let l=this.objectEntityCteBuilder.buildObjectEntityCtes(n,o,t);s=l.ctes,r=l.lastCteAlias;let u=l.columnMappings,c=this.arrayEntityCteBuilder.buildArrayEntityCtes(s,r,o,t,u);return s=c.updatedCtes,r=c.lastCteAlias,this.buildFinalSelectQuery(s,r,o,t,u)}createInitialCte(e){let t="origin_query";return{initialCte:new ie(e,new ee(t,null),null),initialCteAlias:t}}buildFinalSelectQuery(e,t,n,i,s){let r=[...e],o=`cte_root_${i.rootName.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`,l=n.get(i.rootEntity.id);if(!l)throw new Error(`Root entity ${i.rootEntity.id} not found`);if(i.resultFormat==="array"||!i.resultFormat){let u=this.buildEntityJsonObject(l,null,i.nestedEntities,n,s),c=new _(u,i.rootName),p=new ie(new g({selectClause:new q([c]),fromClause:new K(new B(new O(null,new I(t)),null),null)}),new ee(o,null),null);r.push(p);let d="jsonb_agg",h=new U(null,new V(d),new D([new b(null,new I(i.rootName))]),null);return new g({withClause:new ae(!1,r),selectClause:new q([new _(h,`${i.rootName}_array`)]),fromClause:new K(new B(new O(null,new I(o)),null),null)})}else{let u=this.buildEntityJsonObject(l,null,i.nestedEntities,n,s),c=new _(u,i.rootName),p=new ie(new g({selectClause:new q([c]),fromClause:new K(new B(new O(null,new I(t)),null),null)}),new ee(o,null),null);return r.push(p),new g({withClause:new ae(!1,r),selectClause:new q([new _(new b(null,new I(i.rootName)),i.rootName)]),fromClause:new K(new B(new O(null,new I(o)),null),null),limitClause:new oe(new Y(1))})}}buildEntityJsonObject(e,t,n,i,s){let r="jsonb_build_object",o=[];return Object.entries(e.columns).forEach(([u,c])=>{let p=typeof c=="string"?c:c.column;o.push(new Y(u,void 0,!0)),o.push(new b(null,new I(p)))}),n.filter(u=>u.parentId===e.id).forEach(u=>{let c=i.get(u.id);if(c)if(o.push(new Y(u.propertyName,void 0,!0)),u.relationshipType==="object"){let p=s.find(d=>d.entityId===c.id);if(!p)throw new Error(`Column mapping not found for entity: ${c.id}`);o.push(new b(null,new I(p.generatedColumnName)))}else u.relationshipType==="array"&&o.push(new b(null,new I(u.propertyName)))}),new U(null,new V(r),new D(o),null)}};var Ct=class{static extractParameterNames(e){return mt.collect(e).map(n=>n.name.value)}static hasParameter(e,t){return this.extractParameterNames(e).includes(t)}static separateFilters(e,t){let n=this.extractParameterNames(e),i={},s={};for(let[r,o]of Object.entries(t))n.includes(r)?i[r]=o:s[r]=o;return{hardcodedParams:i,dynamicFilters:s}}};var $t=class{constructor(e,t,n){this.name=e;this.type=t;this.tableName=n}},Bi=class{constructor(e,t){this.tableColumnResolver=e,this.options={qualified:!1,upstream:!0,...t}}collect(e){let t=[],n=this.collectColumns(e);t.push(...n);let i=this.collectParameters(e);return t.push(...i),this.removeDuplicates(t)}collectColumns(e){let t=[];try{let i=new ke(this.tableColumnResolver,!1,"fullName",{upstream:this.options.upstream}).collect(e);for(let s of i){let r,o;if(s.value&&typeof s.value.getNamespace=="function"){let u=s.value.getNamespace();u&&u.trim()!==""&&(r=u,this.options.qualified&&(o=this.getRealTableName(e,u)))}r||(r=this.inferTableNameFromQuery(e),r&&this.options.qualified&&(o=r));let l=s.name;this.options.qualified&&(o||r)&&(l=`${o||r}.${s.name}`),t.push(new $t(l,"column",r))}}catch(n){console.warn("Failed to collect columns with SelectableColumnCollector, using fallback:",n);try{let s=new Bt(this.tableColumnResolver,!0).collect(e);for(let r of s)for(let o of r.columns){let l=o;this.options.qualified&&(l=`${r.name}.${o}`),t.push(new $t(l,"column",r.name))}}catch(i){console.warn("Failed to collect columns with both approaches:",n,i)}}return t}inferTableNameFromQuery(e){if(e instanceof g&&e.fromClause&&e.fromClause.source){let t=e.fromClause.source.datasource;if(t&&typeof t.table=="object"){let n=t.table;if(n&&typeof n.name=="string")return n.name}}}getRealTableName(e,t){try{let n=e.type==="WITH"?e.toSimpleQuery():e;if(n instanceof g&&n.fromClause){if(n.fromClause.source?.datasource){let s=n.fromClause.source,r=this.extractRealTableName(s,t);if(r)return r}let i=n.fromClause;if(i.joinClauses&&Array.isArray(i.joinClauses)){for(let s of i.joinClauses)if(s.source?.datasource){let r=this.extractRealTableName(s.source,t);if(r)return r}}}}catch(n){console.warn("Error resolving real table name:",n)}return t}extractRealTableName(e,t){try{let n=e.datasource;if(!n)return;let i=e.alias||e.aliasExpression?.table?.name,s=n.table?.name;if(i===t&&s||!i&&s===t)return s}catch{}}collectParameters(e){let t=[];try{let n=Ct.extractParameterNames(e);for(let i of n)t.push(new $t(i,"parameter"))}catch(n){console.warn("Failed to collect parameters:",n)}return t}removeDuplicates(e){let t=new Set,n=[];for(let i of e){let s=`${i.type}:${i.name}:${i.tableName||"none"}`;t.has(s)||(t.add(s),n.push(i))}return n.sort((i,s)=>{if(i.type!==s.type)return i.type==="column"?-1:1;if(i.type==="column"){let r=i.tableName||"",o=s.tableName||"";if(r!==o)return r.localeCompare(o)}return i.name.localeCompare(s.name)})}};var si=class{constructor(e,t){typeof e=="function"?(this.tableColumnResolver=e,this.options=t||{}):(this.tableColumnResolver=void 0,this.options=e||{})}inject(e,t){typeof e=="string"&&(e=A.parse(e));let n=new Ot(this.tableColumnResolver,this.options),i=new ke(this.tableColumnResolver,!1,"fullName",{upstream:!0}),s=E=>this.options.ignoreCaseAndUnderscore?E.toLowerCase().replace(/_/g,""):E,r=["min","max","like","ilike","in","any","=","<",">","!=","<>","<=",">=","or","and","column"],o=Object.values(t);if(o.length>0&&o.every(E=>E===void 0)&&!this.options.allowAllUndefined)throw new Error("All parameters are undefined. This would result in fetching all records. Use allowAllUndefined: true option to explicitly allow this behavior.");let c=[],p=[];for(let[E,y]of Object.entries(t))y!==void 0&&(this.isQualifiedColumnName(E)?c.push([E,y]):p.push([E,y]));for(let[E,y]of c)this.processStateParameter(E,y,e,n,i,s,r,C,h,J,H,f);let d=new Set;for(let[E,y]of c){let P=this.parseQualifiedColumnName(E);P&&d.add(`${P.table.toLowerCase()}.${P.column.toLowerCase()}`)}for(let[E,y]of p)this.processUnqualifiedParameter(E,y,e,n,i,s,r,C,h,J,H,f,d);function h(E,y,P,T,j){for(let x=0;x<P.length;x++){let w=P[x],N=w.column||y,Xe=j.find(W=>T(W.name)===T(N));if(!Xe)throw new Error(`Column '${N}' not found in query for AND condition`);let Oe=Xe.value;if("="in w&&w["="]!==void 0){let W=`${y}_and_${x}_eq`,F=new L(W,w["="]);E.appendWhere(new S(Oe,"=",F))}if("min"in w&&w.min!==void 0){let W=`${y}_and_${x}_min`,F=new L(W,w.min);E.appendWhere(new S(Oe,">=",F))}if("max"in w&&w.max!==void 0){let W=`${y}_and_${x}_max`,F=new L(W,w.max);E.appendWhere(new S(Oe,"<=",F))}if("like"in w&&w.like!==void 0){let W=`${y}_and_${x}_like`,F=new L(W,w.like);E.appendWhere(new S(Oe,"like",F))}if("ilike"in w&&w.ilike!==void 0){let W=`${y}_and_${x}_ilike`,F=new L(W,w.ilike);E.appendWhere(new S(Oe,"ilike",F))}if("in"in w&&w.in!==void 0){let F=w.in.map((z,G)=>new L(`${y}_and_${x}_in_${G}`,z));E.appendWhere(new S(Oe,"in",new Z(new D(F))))}if("any"in w&&w.any!==void 0){let W=`${y}_and_${x}_any`,F=new L(W,w.any);E.appendWhere(new S(Oe,"=",new U(null,"any",F,null)))}if("<"in w&&w["<"]!==void 0){let W=`${y}_and_${x}_lt`,F=new L(W,w["<"]);E.appendWhere(new S(Oe,"<",F))}if(">"in w&&w[">"]!==void 0){let W=`${y}_and_${x}_gt`,F=new L(W,w[">"]);E.appendWhere(new S(Oe,">",F))}if("!="in w&&w["!="]!==void 0){let W=`${y}_and_${x}_neq`,F=new L(W,w["!="]);E.appendWhere(new S(Oe,"!=",F))}if("<>"in w&&w["<>"]!==void 0){let W=`${y}_and_${x}_ne`,F=new L(W,w["<>"]);E.appendWhere(new S(Oe,"<>",F))}if("<="in w&&w["<="]!==void 0){let W=`${y}_and_${x}_le`,F=new L(W,w["<="]);E.appendWhere(new S(Oe,"<=",F))}if(">="in w&&w[">="]!==void 0){let W=`${y}_and_${x}_ge`,F=new L(W,w[">="]);E.appendWhere(new S(Oe,">=",F))}}}function C(E,y,P,T,j){let x=[];for(let w=0;w<P.length;w++){let N=P[w],Xe=N.column||y,Oe=j.find(z=>T(z.name)===T(Xe));if(!Oe)throw new Error(`Column '${Xe}' not found in query for OR condition`);let W=Oe.value,F=[];if("="in N&&N["="]!==void 0){let z=`${y}_or_${w}_eq`,G=new L(z,N["="]);F.push(new S(W,"=",G))}if("min"in N&&N.min!==void 0){let z=`${y}_or_${w}_min`,G=new L(z,N.min);F.push(new S(W,">=",G))}if("max"in N&&N.max!==void 0){let z=`${y}_or_${w}_max`,G=new L(z,N.max);F.push(new S(W,"<=",G))}if("like"in N&&N.like!==void 0){let z=`${y}_or_${w}_like`,G=new L(z,N.like);F.push(new S(W,"like",G))}if("ilike"in N&&N.ilike!==void 0){let z=`${y}_or_${w}_ilike`,G=new L(z,N.ilike);F.push(new S(W,"ilike",G))}if("in"in N&&N.in!==void 0){let G=N.in.map((_i,qi)=>new L(`${y}_or_${w}_in_${qi}`,_i));F.push(new S(W,"in",new Z(new D(G))))}if("any"in N&&N.any!==void 0){let z=`${y}_or_${w}_any`,G=new L(z,N.any);F.push(new S(W,"=",new U(null,"any",G,null)))}if("<"in N&&N["<"]!==void 0){let z=`${y}_or_${w}_lt`,G=new L(z,N["<"]);F.push(new S(W,"<",G))}if(">"in N&&N[">"]!==void 0){let z=`${y}_or_${w}_gt`,G=new L(z,N[">"]);F.push(new S(W,">",G))}if("!="in N&&N["!="]!==void 0){let z=`${y}_or_${w}_neq`,G=new L(z,N["!="]);F.push(new S(W,"!=",G))}if("<>"in N&&N["<>"]!==void 0){let z=`${y}_or_${w}_ne`,G=new L(z,N["<>"]);F.push(new S(W,"<>",G))}if("<="in N&&N["<="]!==void 0){let z=`${y}_or_${w}_le`,G=new L(z,N["<="]);F.push(new S(W,"<=",G))}if(">="in N&&N[">="]!==void 0){let z=`${y}_or_${w}_ge`,G=new L(z,N[">="]);F.push(new S(W,">=",G))}if(F.length>0){let z=F[0];for(let G=1;G<F.length;G++)z=new S(z,"and",F[G]);F.length>1?x.push(new Z(z)):x.push(z)}}if(x.length>0){let w=x[0];for(let N=1;N<x.length;N++)w=new S(w,"or",x[N]);E.appendWhere(new Z(w))}}function f(E,y,P){Object.keys(E).forEach(T=>{if(!y.includes(T))throw new Error(`Unsupported operator '${T}' for state key '${P}'`)})}function J(E,y,P,T){let j=new L(P,T);E.appendWhere(new S(y,"=",j))}function H(E,y,P,T){let j=[];if("="in T){let x=new L(P,T["="]);j.push(new S(y,"=",x))}if("min"in T){let x=new L(P+"_min",T.min);j.push(new S(y,">=",x))}if("max"in T){let x=new L(P+"_max",T.max);j.push(new S(y,"<=",x))}if("like"in T){let x=new L(P+"_like",T.like);j.push(new S(y,"like",x))}if("ilike"in T){let x=new L(P+"_ilike",T.ilike);j.push(new S(y,"ilike",x))}if("in"in T){let w=T.in.map((N,Xe)=>new L(`${P}_in_${Xe}`,N));j.push(new S(y,"in",new Z(new D(w))))}if("any"in T){let x=new L(P+"_any",T.any);j.push(new S(y,"=",new U(null,"any",x,null)))}if("<"in T){let x=new L(P+"_lt",T["<"]);j.push(new S(y,"<",x))}if(">"in T){let x=new L(P+"_gt",T[">"]);j.push(new S(y,">",x))}if("!="in T){let x=new L(P+"_neq",T["!="]);j.push(new S(y,"!=",x))}if("<>"in T){let x=new L(P+"_ne",T["<>"]);j.push(new S(y,"<>",x))}if("<="in T){let x=new L(P+"_le",T["<="]);j.push(new S(y,"<=",x))}if(">="in T){let x=new L(P+"_ge",T[">="]);j.push(new S(y,">=",x))}if(j.length===1)E.appendWhere(j[0]);else if(j.length>1){let x=j[0];for(let w=1;w<j.length;w++)x=new S(x,"and",j[w]);E.appendWhere(new Z(x))}}return e}isOrCondition(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"or"in e}isAndCondition(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"and"in e}isExplicitColumnMapping(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"column"in e&&!("or"in e)}isValidatableObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}parseQualifiedColumnName(e){let t=e.split(".");return t.length===2&&t[0].trim()&&t[1].trim()?{table:t[0].trim(),column:t[1].trim()}:null}isQualifiedColumnName(e){return e.includes(".")&&this.parseQualifiedColumnName(e)!==null}sanitizeParameterName(e){return e.replace(/\./g,"_")}hasColumnMapping(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&"column"in e}isSimpleValue(e){return e===null||typeof e!="object"||Array.isArray(e)||e instanceof Date}processStateParameter(e,t,n,i,s,r,o,l,u,c,p,d){if(this.isOrCondition(t)){let h=t.or;if(h&&h.length>0){let C=this.findTargetQueryForLogicalCondition(i,n,e,h),f=this.getAllAvailableColumns(C,s);l(C,e,h,r,f);return}}if(this.isAndCondition(t)){let h=t.and;if(h&&h.length>0){let C=this.findTargetQueryForLogicalCondition(i,n,e,h),f=this.getAllAvailableColumns(C,s);u(C,e,h,r,f);return}}if(this.isExplicitColumnMapping(t)){let h=t.column;if(h){let C=i.find(n,h);if(C.length===0)throw new Error(`Explicit column '${h}' not found in query`);for(let f of C){let H=this.getAllAvailableColumns(f,s).find(E=>r(E.name)===r(h));if(!H)throw new Error(`Explicit column '${h}' not found in query`);this.isValidatableObject(t)&&d(t,o,e),p(f,H.value,e,t)}return}}this.processRegularColumnCondition(e,t,n,i,s,r,o,c,p,d)}processUnqualifiedParameter(e,t,n,i,s,r,o,l,u,c,p,d,h){if(this.isOrCondition(t)){let f=t.or;if(f&&f.length>0){let J=this.findTargetQueryForLogicalCondition(i,n,e,f),H=this.getAllAvailableColumns(J,s);l(J,e,f,r,H);return}}if(this.isAndCondition(t)){let f=t.and;if(f&&f.length>0){let J=this.findTargetQueryForLogicalCondition(i,n,e,f),H=this.getAllAvailableColumns(J,s);u(J,e,f,r,H);return}}if(this.isExplicitColumnMapping(t)){let f=t.column;if(f){let J=i.find(n,f);if(J.length===0)throw new Error(`Explicit column '${f}' not found in query`);for(let H of J){let y=this.getAllAvailableColumns(H,s).find(P=>r(P.name)===r(f));if(!y)throw new Error(`Explicit column '${f}' not found in query`);this.isValidatableObject(t)&&d(t,o,e),p(H,y.value,e,t)}return}}let C=i.find(n,e);if(C.length===0){if(this.options.ignoreNonExistentColumns)return;throw new Error(`Column '${e}' not found in query`)}for(let f of C){let J=this.getAllAvailableColumns(f,s),H=this.buildTableMapping(f),E=J.filter(y=>r(y.name)===r(e));for(let y of E){let P=!1;if(y.value&&typeof y.value.getNamespace=="function"){let x=y.value.getNamespace();if(x){let w=H.aliasToRealTable.get(x.toLowerCase());if(w){let N=`${w.toLowerCase()}.${e.toLowerCase()}`;h.has(N)&&(P=!0)}}}if(P)continue;let T=y.value;this.isValidatableObject(t)&&d(t,o,e);let j=T;if(this.hasColumnMapping(t)){let x=t.column;if(x){let w=J.find(N=>r(N.name)===r(x));w&&(j=w.value)}}this.isSimpleValue(t)?c(f,j,e,t):p(f,j,e,t)}}}processRegularColumnCondition(e,t,n,i,s,r,o,l,u,c){let p=e,d;if(this.isQualifiedColumnName(e)){let C=this.parseQualifiedColumnName(e);C&&(p=C.column,d=C.table)}let h=i.find(n,p);if(h.length===0){if(this.options.ignoreNonExistentColumns)return;throw new Error(`Column '${p}' not found in query`)}for(let C of h){let f=this.getAllAvailableColumns(C,s),J;if(d){let P=this.buildTableMapping(C);if(J=f.find(T=>{if(!(r(T.name)===r(p)))return!1;if(T.value&&typeof T.value.getNamespace=="function"){let x=T.value.getNamespace();if(x){let w=r(x),N=r(d),Xe=P.aliasToRealTable.get(w);if(Xe&&r(Xe)===N)return!0}}return!1}),!J){if(this.options.ignoreNonExistentColumns)continue;let T=this.buildTableMapping(C),j=Array.from(T.realTableToAlias.keys()).some(w=>r(w)===r(d)),x=Array.from(T.aliasToRealTable.keys()).some(w=>r(w)===r(d));throw!j&&!x?new Error(`Column '${e}' (qualified as ${e}) not found in query`):x&&!j?new Error(`Column '${e}' not found. Only real table names are allowed in qualified column references (e.g., 'users.name'), not aliases (e.g., 'u.name').`):new Error(`Column '${e}' (qualified as ${e}) not found in query`)}}else if(J=f.find(P=>r(P.name)===r(p)),!J)throw new Error(`Column '${p}' not found in query`);let H=J.value;this.isValidatableObject(t)&&c(t,o,e);let E=H;if(this.hasColumnMapping(t)){let P=t.column;if(P){let T=f.find(j=>r(j.name)===r(P));T&&(E=T.value)}}let y=this.sanitizeParameterName(e);this.isSimpleValue(t)?l(C,E,y,t):u(C,E,y,t)}}findTargetQueryForLogicalCondition(e,t,n,i){let s=i.map(o=>o.column||n).filter((o,l,u)=>u.indexOf(o)===l);for(let o of s){let l=e.find(t,o);if(l.length>0)return l[0]}let r=i===i.or?"OR":"AND";throw new Error(`None of the ${r} condition columns [${s.join(", ")}] found in query`)}getAllAvailableColumns(e,t){let n=t.collect(e),i=this.collectCTEColumns(e);return[...n,...i]}collectCTEColumns(e){let t=[];if(e.withClause)for(let n of e.withClause.tables)try{let i=this.collectColumnsFromSelectQuery(n.query);t.push(...i)}catch(i){console.warn(`Failed to collect columns from CTE '${n.getSourceAliasName()}':`,i)}return t}collectColumnsFromSelectQuery(e){return e instanceof g?new ke(this.tableColumnResolver,!1,"fullName",{upstream:!0}).collect(e):e instanceof Q?this.collectColumnsFromSelectQuery(e.left):[]}buildTableMapping(e){let t=new Map,n=new Map;try{if(e.fromClause&&(this.processSourceForMapping(e.fromClause.source,t,n),e.fromClause.joins))for(let i of e.fromClause.joins)this.processSourceForMapping(i.source,t,n);if(e.withClause)for(let i of e.withClause.tables){let s=i.getSourceAliasName();s&&(t.set(s.toLowerCase(),s),n.set(s.toLowerCase(),s))}}catch(i){console.warn("Failed to build table mapping:",i)}return{aliasToRealTable:t,realTableToAlias:n}}processSourceForMapping(e,t,n){try{if(e.datasource instanceof O){let i=e.datasource.getSourceName(),s=e.aliasExpression?.table?.name||i;i&&s&&(t.set(s.toLowerCase(),i),n.set(i.toLowerCase(),s),s===i&&t.set(i.toLowerCase(),i))}}catch(i){console.warn("Failed to process source for mapping:",i)}}};var ri=class{constructor(e){this.tableColumnResolver=e}static removeOrderBy(e){if(typeof e=="string"&&(e=A.parse(e)),!(e instanceof g))throw new Error("Complex queries are not supported for ORDER BY removal");return new g({withClause:e.withClause,selectClause:e.selectClause,fromClause:e.fromClause,whereClause:e.whereClause,groupByClause:e.groupByClause,havingClause:e.havingClause,orderByClause:null,windowClause:e.windowClause,limitClause:e.limitClause,offsetClause:e.offsetClause,fetchClause:e.fetchClause,forClause:e.forClause})}inject(e,t){if(typeof e=="string"&&(e=A.parse(e)),!(e instanceof g))throw new Error("Complex queries are not supported for sorting");let i=new ke(this.tableColumnResolver,!1,"fullName",{upstream:!0}).collect(e);for(let l of Object.keys(t))if(!i.find(c=>c.name===l))throw new Error(`Column or alias '${l}' not found in current query`);let s=[];for(let[l,u]of Object.entries(t)){let c=i.find(f=>f.name===l);if(!c)continue;let p=c.value;this.validateSortCondition(l,u);let d;u.desc?d="desc":d="asc";let h=null;u.nullsFirst?h="first":u.nullsLast&&(h="last");let C=new Le(p,d,h);s.push(C)}let r=[];e.orderByClause?r=[...e.orderByClause.order,...s]:r=s;let o=r.length>0?new pe(r):null;return new g({withClause:e.withClause,selectClause:e.selectClause,fromClause:e.fromClause,whereClause:e.whereClause,groupByClause:e.groupByClause,havingClause:e.havingClause,orderByClause:o,windowClause:e.windowClause,limitClause:e.limitClause,offsetClause:e.offsetClause,fetchClause:e.fetchClause,forClause:e.forClause})}validateSortCondition(e,t){if(t.asc&&t.desc)throw new Error(`Conflicting sort directions for column '${e}': both asc and desc specified`);if(t.nullsFirst&&t.nullsLast)throw new Error(`Conflicting nulls positions for column '${e}': both nullsFirst and nullsLast specified`);if(!t.asc&&!t.desc&&!t.nullsFirst&&!t.nullsLast)throw new Error(`Empty sort condition for column '${e}': at least one sort option must be specified`)}};var oi=class{inject(e,t){if(this.validatePaginationOptions(t),typeof e=="string"&&(e=A.parse(e)),!(e instanceof g))throw new Error("Complex queries are not supported for pagination");if(e.limitClause||e.offsetClause)throw new Error("Query already contains LIMIT or OFFSET clause. Use removePagination() first if you want to override existing pagination.");let n=(t.page-1)*t.pageSize,i=new oe(new L("paging_limit",t.pageSize)),s=new Fe(new L("paging_offset",n));return new g({withClause:e.withClause,selectClause:e.selectClause,fromClause:e.fromClause,whereClause:e.whereClause,groupByClause:e.groupByClause,havingClause:e.havingClause,orderByClause:e.orderByClause,windowClause:e.windowClause,limitClause:i,offsetClause:s,fetchClause:e.fetchClause,forClause:e.forClause})}static removePagination(e){if(typeof e=="string"&&(e=A.parse(e)),!(e instanceof g))throw new Error("Complex queries are not supported for pagination removal");return new g({withClause:e.withClause,selectClause:e.selectClause,fromClause:e.fromClause,whereClause:e.whereClause,groupByClause:e.groupByClause,havingClause:e.havingClause,orderByClause:e.orderByClause,windowClause:e.windowClause,limitClause:null,offsetClause:null,fetchClause:e.fetchClause,forClause:e.forClause})}validatePaginationOptions(e){if(!e)throw new Error("Pagination options are required");if(typeof e.page!="number"||e.page<1)throw new Error("Page number must be a positive integer (1 or greater)");if(typeof e.pageSize!="number"||e.pageSize<1)throw new Error("Page size must be a positive integer (1 or greater)");if(e.pageSize>1e3)throw new Error("Page size cannot exceed 1000 items")}};var ai=class{constructor(e={}){this.options={requireAllParameters:!0,...e}}bind(e,t){let n=e,i=Ct.extractParameterNames(n);if(this.options.requireAllParameters){let s=i.filter(r=>!(r in t)||t[r]===void 0);if(s.length>0)throw new Error(`Missing values for required parameters: ${s.join(", ")}`)}for(let[s,r]of Object.entries(t))if(i.includes(s))try{rt.set(n,s,r)}catch(o){throw new Error(`Failed to bind parameter '${s}': ${o instanceof Error?o.message:"Unknown error"}`)}return n}bindToSimpleQuery(e,t){return this.bind(e,t)}};var Vi=class{constructor(e){this.tableColumnResolver=e}buildQuery(e,t={}){let n;try{n=A.parse(e)}catch(s){throw new Error(`Failed to parse SQL: ${s instanceof Error?s.message:"Unknown error"}`)}let i=n;if(t.filter&&Object.keys(t.filter).length>0){let{hardcodedParams:s,dynamicFilters:r}=Ct.separateFilters(i,t.filter);if(Object.keys(s).length>0&&(i=new ai({requireAllParameters:!1}).bind(i,s)),Object.keys(r).length>0){let o=new si(this.tableColumnResolver),l=We.buildSimpleQuery(i);i=o.inject(l,r)}}if(t.sort&&Object.keys(t.sort).length>0){let s=new ri(this.tableColumnResolver),r=We.buildSimpleQuery(i);i=s.inject(r,t.sort)}if(t.paging){let{page:s=1,pageSize:r}=t.paging;if(r!==void 0){let o=new oi,l={page:s,pageSize:r},u=We.buildSimpleQuery(i);i=o.inject(u,l)}}if(t.serialize&&typeof t.serialize=="object"){let s=new ii,r=We.buildSimpleQuery(i);i=s.buildJsonQuery(r,t.serialize)}return i}buildFilteredQuery(e,t){return this.buildQuery(e,{filter:t})}buildSortedQuery(e,t){return this.buildQuery(e,{sort:t})}buildPaginatedQuery(e,t){return this.buildQuery(e,{paging:t})}buildSerializedQuery(e,t){return this.buildQuery(e,{serialize:t})}validateSql(e){try{return A.parse(e),!0}catch(t){throw new Error(`Invalid SQL: ${t instanceof Error?t.message:"Unknown error"}`)}}};function yi(a){let e=[],t=0,n={},i=()=>`entity_${++t}`,s=u=>(n[u]||(n[u]=0),n[u]++,n[u]===1?u:`${u}_${n[u]}`),r=(u,c=null)=>{let p={},d=[];for(let[h,C]of Object.entries(u))if(typeof C=="string")p[h]=C;else if("column"in C&&typeof C.column=="string"&&!("type"in C&&(C.type==="object"||C.type==="array"))){let f=C;typeof f=="object"&&"column"in f&&(p[h]=f.column,f.type==="string"&&e.push(f.column))}else if("from"in C&&typeof C.from=="string"&&!("type"in C&&(C.type==="object"||C.type==="array"))){let f=C;typeof f=="object"&&"from"in f&&(p[h]=f.from,f.type==="string"&&e.push(f.from))}else if("type"in C&&(C.type==="object"||C.type==="array")){let f=C,J=s(h),H=i(),E=r(f.structure,H);d.push({id:H,name:h.charAt(0).toUpperCase()+h.slice(1),parentId:c||"root",propertyName:J,originalPropertyName:h,relationshipType:f.type,columns:E.columns}),d.push(...E.nestedEntities.map(y=>({...y,parentId:y.parentId==="root"?H:y.parentId})))}return{columns:p,nestedEntities:d}},o=r(a.structure),l={rootName:"root",rootEntity:{id:"root",name:"Root",columns:o.columns},nestedEntities:o.nestedEntities};return l.typeInfo=a.typeInfo,{jsonMapping:l,typeProtection:{protectedStringFields:e}}}function cs(a){let e=[];return a.typeInfo?(a.typeInfo.interface||e.push("typeInfo.interface is required"),a.typeInfo.importPath||e.push("typeInfo.importPath is required")):e.push("typeInfo is required"),(!a.structure||typeof a.structure!="object")&&e.push("structure is required and must be an object"),e}function li(a){let e={};for(let[t,n]of Object.entries(a))typeof n=="string"?e[t]=n:n&&typeof n=="object"?"column"in n?e[t]=n.column:"from"in n?e[t]=n.from:e[t]=t:e[t]=t;return e}function sy(a){if(!a)throw new Error("Input mapping is required");if(a.rootName&&a.rootEntity&&typeof a.rootEntity.columns=="object"&&!a.typeInfo&&!a.typeProtection&&!a.metadata&&Object.values(a.rootEntity.columns).every(t=>typeof t=="string"))return a;if(a.rootName&&a.rootEntity)return{rootName:a.rootName,rootEntity:{id:a.rootEntity.id||"root",name:a.rootEntity.name||a.rootName,columns:li(a.rootEntity.columns||{})},nestedEntities:(a.nestedEntities||[]).map(e=>({id:e.id,name:e.name,parentId:e.parentId,propertyName:e.propertyName,relationshipType:e.relationshipType,columns:li(e.columns||{})})),resultFormat:a.resultFormat,emptyResult:a.emptyResult};throw new Error("Unsupported mapping format")}function $i(a){return{rootName:a.rootName,rootEntity:{id:a.rootEntity.id,name:a.rootEntity.name,columns:li(a.rootEntity.columns)},nestedEntities:a.nestedEntities.map(e=>({id:e.id,name:e.name,parentId:e.parentId,propertyName:e.propertyName,relationshipType:e.relationshipType,columns:li(e.columns)})),resultFormat:a.resultFormat,emptyResult:a.emptyResult}}function Mi(a){let e=[],t=[],n=[];if(a.typeProtection)return{protectedStringFields:a.typeProtection.protectedStringFields||[],dateFields:a.typeProtection.dateFields,numberFields:a.typeProtection.numberFields,customTransforms:a.typeProtection.customTransforms};for(let[i,s]of Object.entries(a.rootEntity.columns))if(typeof s=="object"&&s.type){let r=s.column;switch(s.type){case"string":e.push(r);break;case"date":t.push(r);break;case"number":n.push(r);break}}for(let i of a.nestedEntities)for(let[s,r]of Object.entries(i.columns))if(typeof r=="object"&&r.type){let o=r.column;switch(r.type){case"string":e.push(o);break;case"date":t.push(o);break;case"number":n.push(o);break}}return{protectedStringFields:e,dateFields:t.length>0?t:void 0,numberFields:n.length>0?n:void 0,customTransforms:void 0}}function bi(a){return a!=null&&typeof a=="object"}var vi=class{detect(e){if(!bi(e))return!1;let t=e;if(!t||typeof t.rootName!="string"||!t.rootEntity||!Array.isArray(t.nestedEntities))return!1;if(t.typeInfo||t.typeProtection||t.metadata)return!0;let n=i=>!i||typeof i!="object"?!1:Object.values(i).some(s=>typeof s=="object"&&s!==null&&"column"in s);return n(t.rootEntity.columns)?!0:t.nestedEntities.some(i=>i&&typeof i=="object"&&n(i.columns))}convert(e){return{format:"enhanced",mapping:$i(e),typeProtection:Mi(e),originalInput:e,metadata:{typeInfo:e.typeInfo,version:e.metadata?.version,description:e.metadata?.description}}}},wi=class{detect(e){if(!bi(e))return!1;let t=e;return t&&t.typeInfo&&t.structure&&typeof t.typeInfo.interface=="string"}convert(e){let t=yi(e);return{format:"model-driven",mapping:t.jsonMapping,typeProtection:t.typeProtection,originalInput:e,metadata:{typeInfo:e.typeInfo}}}},Si=class{detect(e){if(!bi(e))return!1;let t=e;if(!t||typeof t.rootName!="string"||!t.rootEntity||typeof t.rootEntity.columns!="object"||t.typeInfo||t.typeProtection||t.metadata)return!1;let n=i=>!i||typeof i!="object"?!1:Object.values(i).some(s=>typeof s=="object"&&s!==null&&"column"in s);return!(n(t.rootEntity.columns)||t.nestedEntities&&Array.isArray(t.nestedEntities)&&t.nestedEntities.some(s=>s&&typeof s=="object"&&n(s.columns)))}convert(e){return{format:"legacy",mapping:e,typeProtection:{protectedStringFields:[]},originalInput:e}}},Zt=class{constructor(){this.strategies=[new vi,new wi,new Si]}detectFormat(e){for(let t of this.strategies)if(t.detect(e))return t.convert(e).format;throw new Error("Unsupported JSON mapping format")}convert(e){for(let t of this.strategies)if(t.detect(e))return t.convert(e);throw new Error("Unsupported JSON mapping format: Unable to detect a compatible strategy for the provided input")}toLegacyMapping(e){return this.convert(e).mapping}getTypeProtection(e){return this.convert(e).typeProtection}validate(e){let t=[];if(!e||typeof e!="object")return t.push("Input must be an object"),t;(!("rootName"in e)||!e.rootName)&&t.push("rootName is required");try{let n=this.convert(e);if(n.mapping.rootName||t.push("rootName is required"),n.mapping.rootEntity?(n.mapping.rootEntity.id||t.push("rootEntity.id is required"),n.mapping.rootEntity.columns||t.push("rootEntity.columns is required")):t.push("rootEntity is required"),n.mapping.nestedEntities)for(let i of n.mapping.nestedEntities)i.id||t.push(`Nested entity missing id: ${i.propertyName}`),i.parentId||t.push(`Nested entity missing parentId: ${i.id}`),i.propertyName||t.push(`Nested entity missing propertyName: ${i.id}`)}catch(n){t.length===0&&t.push(`Conversion failed: ${n instanceof Error?n.message:String(n)}`)}return t}upgradeToEnhanced(e,t){return{rootName:e.rootName,rootEntity:{id:e.rootEntity.id,name:e.rootEntity.name,columns:e.rootEntity.columns},nestedEntities:e.nestedEntities.map(n=>({id:n.id,name:n.name,parentId:n.parentId,propertyName:n.propertyName,relationshipType:n.relationshipType||"object",columns:n.columns})),resultFormat:e.resultFormat,emptyResult:e.emptyResult,typeInfo:t,metadata:{version:"1.0",description:"Upgraded from legacy format"}}}};function Ei(a){return a.typeInfo&&a.structure?"model-driven":a.rootName&&a.rootEntity?"unified":(a.columns||a.relationships,"legacy")}function ps(a){let e={rootName:a.rootName||"root",rootEntity:{id:"root",name:a.rootName||"Root",columns:a.columns||{}},nestedEntities:[]};if(a.relationships&&typeof a.relationships=="object")for(let[t,n]of Object.entries(a.relationships)){let i=n;e.nestedEntities.push({id:t,name:t.charAt(0).toUpperCase()+t.slice(1),parentId:"root",propertyName:t,relationshipType:i.type==="hasMany"?"array":"object",columns:i.columns||{}})}return e}function ms(a){if(console.warn("\u26A0\uFE0F DEPRECATED: processJsonMapping() is deprecated. Use JsonMappingConverter.convert() instead."),console.warn("Migration guide: https://github.com/mk3008/rawsql-ts/blob/main/docs/migration-guide.md"),(a.columns||a.relationships)&&!a.rootName&&!a.rootEntity)return{format:"legacy",jsonMapping:ps(a),originalInput:a,metadata:{}};let t=new Zt().convert(a),n=t.format;return t.format==="legacy"&&a.rootName&&a.rootEntity&&(n="unified"),{format:n,jsonMapping:t.mapping,originalInput:a,metadata:{typeInfo:t.metadata?.typeInfo,typeProtection:t.typeProtection}}}function ds(a){return console.warn("\u26A0\uFE0F DEPRECATED: unifyJsonMapping() is deprecated. Use JsonMappingConverter.toLegacyMapping() instead."),console.warn("Migration guide: https://github.com/mk3008/rawsql-ts/blob/main/docs/migration-guide.md"),new Zt().toLegacyMapping(a)}function hs(a){return Ei(a)==="model-driven"}function fs(a){return Ei(a)==="unified"}function Cs(a){return Ei(a)==="legacy"}var ui=class{constructor(e={}){this.config={enableValueBasedDetection:!0,strictDateDetection:!1,...e}}transformResult(e){return e==null?e:Array.isArray(e)?e.map(t=>this.transformSingleObject(t)):this.transformSingleObject(e)}transformSingleObject(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.transformSingleObject(n));let t={};for(let[n,i]of Object.entries(e)){if(i==null){t[n]=i;continue}let s=this.config.columnTransformations?.[n];if(s){t[n]=this.applyTransformation(i,s);continue}if(this.config.enableValueBasedDetection){let o=this.detectValueBasedTransformation(i);if(o){t[n]=this.applyTransformation(i,o);continue}}let r=this.config.globalTransformations&&this.getGlobalTransformationForValue(i);if(r){t[n]=this.applyTransformation(i,r);continue}if(typeof i=="object"&&!Array.isArray(i)){t[n]=this.transformSingleObject(i);continue}if(Array.isArray(i)){t[n]=i.map(o=>typeof o=="object"?this.transformSingleObject(o):o);continue}t[n]=i}return t}detectValueBasedTransformation(e){return typeof e=="string"&&this.isDateString(e)?{sourceType:"TIMESTAMP",targetType:"Date",handleNull:!0,validator:t=>typeof t=="string"&&!isNaN(Date.parse(t))}:typeof e=="number"&&!Number.isSafeInteger(e)?{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:t=>{try{return typeof t=="string"||typeof t=="number"||typeof t=="bigint"||typeof t=="boolean"?(BigInt(t),!0):!1}catch{return!1}}}:typeof e=="string"&&/^\d{16,}$/.test(e)?{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:t=>{try{return typeof t=="string"||typeof t=="number"||typeof t=="bigint"||typeof t=="boolean"?(BigInt(t),!0):!1}catch{return!1}}}:null}getGlobalTransformationForValue(e){return this.config.globalTransformations,null}detectAndGetGlobalTransformation(e){return this.detectValueBasedTransformation(e)}isDateString(e){if(this.config.strictDateDetection){if(!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?$/.test(e))return!1}else if(!/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/.test(e))return!1;let t=new Date(e);return!isNaN(t.getTime())}applyTransformation(e,t){if(e==null)return t.handleNull!==!1?e:null;if(t.validator&&!t.validator(e))return console.warn(`TypeTransformationPostProcessor: Value validation failed for ${e}`),e;try{switch(t.targetType){case"Date":return new Date(e);case"bigint":if(typeof e=="number"){let n=Math.trunc(e);return BigInt(n.toString())}return BigInt(e);case"string":return e.toString();case"number":return typeof e=="string"?parseFloat(e):Number(e);case"object":return typeof e=="string"?JSON.parse(e):e;case"custom":if(t.customTransformer&&this.config.customTransformers?.[t.customTransformer])return this.config.customTransformers[t.customTransformer](e);break;default:return e}}catch(n){return console.warn(`TypeTransformationPostProcessor: Transformation failed for ${e}:`,n),e}return e}static createDefaultConfig(){return{enableValueBasedDetection:!0,strictDateDetection:!1,globalTransformations:{DATE:{sourceType:"DATE",targetType:"Date",handleNull:!0,validator:e=>typeof e=="string"&&!isNaN(Date.parse(e))},TIMESTAMP:{sourceType:"TIMESTAMP",targetType:"Date",handleNull:!0,validator:e=>typeof e=="string"&&!isNaN(Date.parse(e))},BIGINT:{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:e=>{try{return typeof e=="string"||typeof e=="number"||typeof e=="bigint"||typeof e=="boolean"?(BigInt(e),!0):!1}catch{return!1}}}}}}static createSafeConfig(e){return{enableValueBasedDetection:!1,strictDateDetection:!0,columnTransformations:e||{},globalTransformations:{DATE:{sourceType:"DATE",targetType:"Date",handleNull:!0,validator:t=>typeof t=="string"&&!isNaN(Date.parse(t))},TIMESTAMP:{sourceType:"TIMESTAMP",targetType:"Date",handleNull:!0,validator:t=>typeof t=="string"&&!isNaN(Date.parse(t))},BIGINT:{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:t=>{try{return typeof t=="string"||typeof t=="number"||typeof t=="bigint"||typeof t=="boolean"?(BigInt(t),!0):!1}catch{return!1}}}}}}};function Cy(a,e){return new ui(e||ui.createDefaultConfig()).transformResult(a)}var gy={toDate:a=>{if(a==null)return null;let e=new Date(a);return isNaN(e.getTime())?null:e},toBigInt:a=>{if(a==null)return null;try{return BigInt(a)}catch{return null}},toObject:a=>{if(a==null)return null;try{return JSON.parse(a)}catch{return null}}};var Mt=class{constructor(e,t,n,i,s){this.id=e;this.label=t;this.type=n;this.shape=i;this.details=s}},Wt=class a extends Mt{constructor(t,n,i){super(t,n,i,i==="subquery"?"hexagon":"cylinder");this.annotations=new Set}addAnnotation(t){this.annotations.add(t)}hasAnnotation(t){return this.annotations.has(t)}getMermaidRepresentation(){return this.shape==="hexagon"?`${this.id}{{${this.label}}}`:`${this.id}[(${this.label})]`}static createTable(t){return new a(`table_${t}`,t,"table")}static createCTE(t){return new a(`cte_${t}`,`CTE:${t}`,"cte")}static createSubquery(t){return new a(`subquery_${t}`,`SubQuery:${t}`,"subquery")}},ci=class a extends Mt{constructor(e,t,n=""){let i=n?`${n}_${t.toLowerCase().replace(/\s+/g,"_")}`:t.toLowerCase().replace(/\s+/g,"_");super(i,t,"process","hexagon")}getMermaidRepresentation(){return`${this.id}{{${this.label}}}`}static createWhere(e){return new a(`${e}_where`,"WHERE",e)}static createGroupBy(e){return new a(`${e}_group_by`,"GROUP BY",e)}static createHaving(e){return new a(`${e}_having`,"HAVING",e)}static createSelect(e){return new a(`${e}_select`,"SELECT",e)}static createOrderBy(e){return new a(`${e}_order_by`,"ORDER BY",e)}static createLimit(e,t=!1){let n=t?"LIMIT/OFFSET":"LIMIT";return new a(`${e}_limit`,n,e)}},Xt=class a extends Mt{constructor(e,t,n="diamond"){super(e,t,"operation",n)}getMermaidRepresentation(){switch(this.shape){case"rounded":return`${this.id}(${this.label})`;case"rectangle":return`${this.id}[${this.label}]`;case"hexagon":return`${this.id}{{${this.label}}}`;case"stadium":return`${this.id}([${this.label}])`;case"diamond":default:return`${this.id}{${this.label}}`}}static createJoin(e,t){let n,i=t.trim().toLowerCase();return i==="join"?n="INNER JOIN":i.endsWith(" join")?n=i.toUpperCase():n=i.toUpperCase()+" JOIN",new a(`join_${e}`,n,"rectangle")}static createUnion(e,t="UNION ALL"){return new a(`${t.toLowerCase().replace(/\s+/g,"_")}_${e}`,t.toUpperCase(),"rectangle")}static createSetOperation(e,t){let n=t.toUpperCase(),i=`${n.toLowerCase().replace(/\s+/g,"_")}_${e}`;return new a(i,n,"rectangle")}},pi=class extends Mt{constructor(e="main"){let t=e==="main"?"Final Result":`${e} Result`;super(`${e}_output`,t,"output","stadium")}getMermaidRepresentation(){return`${this.id}([${this.label}])`}};var mi=class a{constructor(e,t,n){this.from=e;this.to=t;this.label=n}getMermaidRepresentation(){let e=this.label?` -->|${this.label}| `:" --> ";return`${this.from}${e}${this.to}`}static create(e,t,n){return new a(e,t,n)}static createWithNullability(e,t,n){let i=n?"NULLABLE":"NOT NULL";return new a(e,t,i)}},di=class{constructor(){this.edges=[];this.connectionSet=new Set}add(e){let t=`${e.from}->${e.to}`;this.connectionSet.has(t)||(this.edges.push(e),this.connectionSet.add(t))}addConnection(e,t,n){this.add(mi.create(e,t,n))}addJoinConnection(e,t,n){this.add(mi.createWithNullability(e,t,n))}hasConnection(e,t){return this.connectionSet.has(`${e}->${t}`)}getAll(){return[...this.edges]}getMermaidRepresentation(){return this.edges.map(e=>e.getMermaidRepresentation()).join(`
68
- `)}};var en=class{constructor(){this.nodes=new Map;this.edges=new di}addNode(e){this.nodes.set(e.id,e)}addEdge(e){this.edges.add(e)}addConnection(e,t,n){this.edges.addConnection(e,t,n)}hasNode(e){return this.nodes.has(e)}hasConnection(e,t){return this.edges.hasConnection(e,t)}getNode(e){return this.nodes.get(e)}getAllNodes(){return Array.from(this.nodes.values())}getAllEdges(){return this.edges.getAll()}generateMermaid(e="TD",t){let n=`flowchart ${e}
69
- `;t&&(n+=` %% ${t}
70
- `);let i=Array.from(this.nodes.values()).map(r=>` ${r.getMermaidRepresentation()}`).join(`
71
- `);i&&(n+=i+`
72
- `),this.nodes.size>0&&this.edges.getAll().length>0&&(n+=`
73
- `);let s=this.edges.getMermaidRepresentation();return s&&(n+=` ${s}
74
- `),n}getOrCreateTable(e){let t=`table_${e}`,n=this.nodes.get(t);return n||(n=Wt.createTable(e),this.addNode(n)),n}getOrCreateCTE(e){let t=`cte_${e}`,n=this.nodes.get(t);return n||(n=Wt.createCTE(e),this.addNode(n)),n}getOrCreateSubquery(e){let t=`subquery_${e}`,n=this.nodes.get(t);return n||(n=Wt.createSubquery(e),this.addNode(n)),n}createProcessNode(e,t){let n=new ci(t,e);return this.addNode(n),n}createJoinNode(e,t){let n=Xt.createJoin(e,t);return this.addNode(n),n}createSetOperationNode(e,t){let n=Xt.createSetOperation(e,t);return this.addNode(n),n}createOutputNode(e="main"){let t=new pi(e);return this.addNode(t),t}};var tn=class{constructor(e){this.graph=e}processSource(e,t,n){if(e.datasource instanceof O)return this.processTableSource(e.datasource,t);if(e.datasource instanceof M)return this.processSubquerySource(e,t,n);throw new Error("Unsupported source type")}processTableSource(e,t){let n=e.getSourceName();return t.has(n)?this.graph.getOrCreateCTE(n).id:this.graph.getOrCreateTable(n).id}processSubquerySource(e,t,n){let i=e.aliasExpression?.table.name||"subquery",s=this.graph.getOrCreateSubquery(i),r=n(e.datasource.query,`subquery_${i}_internal`,t);return r&&!this.graph.hasConnection(r,s.id)&&this.graph.addConnection(r,s.id),s.id}extractTableNodeIds(e,t){let n=[],i=e.source;if(i.datasource instanceof O){let s=i.datasource.getSourceName();if(t.has(s)){let r=this.graph.getOrCreateCTE(s);n.push(r.id)}else{let r=this.graph.getOrCreateTable(s);n.push(r.id)}}if(e.joins&&e.joins.length>0)for(let s of e.joins){let r=s.source;if(r.datasource instanceof O){let o=r.datasource.getSourceName();if(t.has(o)){let l=this.graph.getOrCreateCTE(o);n.push(l.id)}else{let l=this.graph.getOrCreateTable(o);n.push(l.id)}}}return n}};var nn=class{constructor(e,t){this.graph=e;this.dataSourceHandler=t;this.joinIdCounter=0}resetJoinCounter(){this.joinIdCounter=0}getNextJoinId(){return String(++this.joinIdCounter)}processFromClause(e,t,n){let i=this.dataSourceHandler.processSource(e.source,t,n);return e.joins&&e.joins.length>0?this.processJoins(e.joins,i,t,n):i}processJoins(e,t,n,i){let s=t;for(let r of e){let o=this.dataSourceHandler.processSource(r.source,n,i),l=this.getNextJoinId(),u=this.graph.createJoinNode(l,r.joinType.value),{leftLabel:c,rightLabel:p}=this.getJoinNullabilityLabels(r.joinType.value);s&&!this.graph.hasConnection(s,u.id)&&this.graph.addConnection(s,u.id,c),o&&!this.graph.hasConnection(o,u.id)&&this.graph.addConnection(o,u.id,p),s=u.id}return s}getJoinNullabilityLabels(e){switch(e.toLowerCase()){case"left join":return{leftLabel:"NOT NULL",rightLabel:"NULLABLE"};case"right join":return{leftLabel:"NULLABLE",rightLabel:"NOT NULL"};case"inner join":case"join":return{leftLabel:"NOT NULL",rightLabel:"NOT NULL"};case"full join":case"full outer join":return{leftLabel:"NULLABLE",rightLabel:"NULLABLE"};case"cross join":return{leftLabel:"NOT NULL",rightLabel:"NOT NULL"};default:return{leftLabel:"",rightLabel:""}}}};var sn=class{constructor(e,t){this.graph=e;this.dataSourceHandler=t}processQueryClauses(e,t,n,i,s){return n}};var rn=class{constructor(e){this.graph=e}processCTEs(e,t,n){for(let i=0;i<e.tables.length;i++){let r=e.tables[i].getSourceAliasName(),o=this.graph.getOrCreateCTE(r);t.add(r),e.recursive&&i===0&&o.addAnnotation("recursive")}for(let i=0;i<e.tables.length;i++){let s=e.tables[i],r=s.getSourceAliasName(),o=this.graph.getOrCreateCTE(r),l=n(s.query,`cte_${r}`,t);if(l&&!this.graph.hasConnection(l,o.id)){let c=e.recursive&&i===0?"RECURSIVE":void 0;this.graph.addConnection(l,o.id,c)}}}detectRecursiveReference(e,t){return e.toString().toLowerCase().includes(t.toLowerCase())}};var Wi=class a{constructor(){this.graph=new en,this.dataSourceHandler=new tn(this.graph),this.joinHandler=new nn(this.graph,this.dataSourceHandler),this.processHandler=new sn(this.graph,this.dataSourceHandler),this.cteHandler=new rn(this.graph)}generateMermaidFlow(e,t){this.graph=new en,this.dataSourceHandler=new tn(this.graph),this.joinHandler=new nn(this.graph,this.dataSourceHandler),this.processHandler=new sn(this.graph,this.dataSourceHandler),this.cteHandler=new rn(this.graph),this.joinHandler.resetJoinCounter();let n=typeof e=="string"?A.parse(e):e,i=new Set;return this.processQuery(n,"main",i),this.graph.generateMermaid(t?.direction||"TD",t?.title)}static generate(e){return new a().generateMermaidFlow(e)}processQuery(e,t,n){if(e instanceof g)return this.processSimpleQuery(e,t,n);if(e instanceof Q)return this.processBinaryQuery(e,t,n);throw new Error("Unsupported query type")}processSimpleQuery(e,t,n){e.withClause&&this.cteHandler.processCTEs(e.withClause,n,this.processQuery.bind(this));let i="";return e.fromClause&&(e.fromClause.joins&&e.fromClause.joins.length>0?i=this.joinHandler.processFromClause(e.fromClause,n,this.processQuery.bind(this)):i=this.dataSourceHandler.processSource(e.fromClause.source,n,this.processQuery.bind(this))),i&&(i=this.processHandler.processQueryClauses(e,t,i,n,this.processQuery.bind(this))),this.handleOutputNode(i,t)}processBinaryQuery(e,t,n){let i=this.flattenBinaryChain(e,e.operator.value);return i.length>2?this.processMultiPartOperation(i,e.operator.value,t,n):this.processSimpleBinaryOperation(e,t,n)}processSimpleBinaryOperation(e,t,n){let i=this.processQuery(e.left,`${t}_left`,n),s=this.processQuery(e.right,`${t}_right`,n),r=t==="main"?"main":t.replace(/^cte_/,""),o=this.graph.createSetOperationNode(r,e.operator.value);return i&&!this.graph.hasConnection(i,o.id)&&this.graph.addConnection(i,o.id),s&&!this.graph.hasConnection(s,o.id)&&this.graph.addConnection(s,o.id),o.id}processMultiPartOperation(e,t,n,i){let s=[],r=n==="main"?"main":n.replace(/^cte_/,""),o=this.graph.createSetOperationNode(r,t);for(let l=0;l<e.length;l++){let u=`${n}_part${l+1}`,c=this.processQuery(e[l],u,i);s.push(c)}for(let l of s)l&&!this.graph.hasConnection(l,o.id)&&this.graph.addConnection(l,o.id);return o.id}handleOutputNode(e,t){if(t==="main"){let n=this.graph.createOutputNode(t);return e&&this.graph.addConnection(e,n.id),n.id}return e}flattenBinaryChain(e,t){let n=[],i=s=>{s instanceof Q&&s.operator.value===t?(i(s.left),i(s.right)):n.push(s)};return i(e),n}};var ji=class{static validate(e,t){let n=this.extractStructureFromJsonMapping(e);return this.compareStructures(n,t)}static validateStrict(e,t){let n=this.validate(e,t);if(!n.isValid){let i=["JsonMapping validation failed:",...n.errors].join(`
75
- `);throw new Error(i)}}static extractStructureFromJsonMapping(e){let t={};return e.rootEntity&&e.rootEntity.columns&&Object.keys(e.rootEntity.columns).forEach(n=>{t[n]="primitive"}),e.nestedEntities&&e.nestedEntities.filter(n=>n.parentId===e.rootEntity.id).forEach(n=>{n.propertyName&&n.columns&&(n.relationshipType==="object"?t[n.propertyName]=this.extractNestedEntityStructure(n,e):n.relationshipType==="array"&&(t[n.propertyName]=[this.extractNestedEntityStructure(n,e)]))}),t}static extractNestedEntityStructure(e,t){let n={};return e.columns&&Object.keys(e.columns).forEach(i=>{n[i]="primitive"}),t.nestedEntities&&t.nestedEntities.filter(i=>i.parentId===e.id).forEach(i=>{i.propertyName&&i.columns&&(i.relationshipType==="object"?n[i.propertyName]=this.extractNestedEntityStructure(i,t):i.relationshipType==="array"&&(n[i.propertyName]=[this.extractNestedEntityStructure(i,t)]))}),n}static compareStructures(e,t,n=""){let i=[],s=[],r=[];if(e==="primitive"&&t==="primitive")return{isValid:!0,errors:[],missingProperties:[],extraProperties:[]};if(Array.isArray(t)&&Array.isArray(e)){if(t.length>0&&e.length>0){let u=this.compareStructures(e[0],t[0],`${n}[]`);i.push(...u.errors),s.push(...u.missingProperties),r.push(...u.extraProperties)}return{isValid:i.length===0,errors:i,missingProperties:s,extraProperties:r}}if(typeof e!="object"||typeof t!="object"||Array.isArray(e)||Array.isArray(t)||e===null||t===null)return{isValid:!0,errors:[],missingProperties:[],extraProperties:[]};let o=e,l=t;return Object.keys(l).forEach(u=>{let c=n?`${n}.${u}`:u;if(!(u in o)){s.push(c),i.push(`Missing property: ${c}`);return}let p=o[u],d=l[u],h=this.compareStructures(p,d,c);i.push(...h.errors),s.push(...h.missingProperties),r.push(...h.extraProperties)}),Object.keys(o).forEach(u=>{let c=n?`${n}.${u}`:u;u in l||r.push(c)}),{isValid:i.length===0,errors:i,missingProperties:s,extraProperties:r}}static validateAgainstSample(e,t){let n=this.extractStructureFromSample(t);return this.validate(e,n)}static validateAgainstSampleStrict(e,t){let n=this.validateAgainstSample(e,t);if(!n.isValid){let i=["JsonMapping validation against sample object failed:",...n.errors].join(`
76
- `);throw new Error(i)}}static extractStructureFromSample(e){if(e==null)return"primitive";if(Array.isArray(e))return e.length===0?[]:[this.extractStructureFromSample(e[0])];if(typeof e=="object"){let t={};return Object.keys(e).forEach(n=>{t[n]=this.extractStructureFromSample(e[n])}),t}return"primitive"}};var on=class{constructor(e){this.schemas=e,this.validateSchemas()}validateSchemas(){let e=Object.keys(this.schemas),t=[];if(Object.entries(this.schemas).forEach(([n,i])=>{Object.entries(i.columns).filter(([r,o])=>o.isPrimaryKey).map(([r,o])=>r).length===0&&t.push(`Table '${n}' has no primary key defined`),i.relationships?.forEach(r=>{e.includes(r.table)||t.push(`Table '${n}' references unknown table '${r.table}' in relationship`)})}),t.length>0)throw new Error(`Schema validation failed:\\n${t.join("\\n")}`)}getTableColumns(e){let t=this.schemas[e];return t?Object.keys(t.columns):[]}createTableColumnResolver(){return e=>this.getTableColumns(e)}createJsonMapping(e){let t=this.schemas[e];if(!t)throw new Error(`Table '${e}' not found in schema registry`);let n={};Object.entries(t.columns).forEach(([s,r])=>{n[s]=r.jsonAlias||r.name});let i=[];return t.relationships?.forEach(s=>{let r=this.schemas[s.table];if(!r)throw new Error(`Related table '${s.table}' not found in schema registry`);let o={};Object.entries(r.columns).forEach(([u,c])=>{o[u]=c.jsonAlias||c.name});let l=s.type;i.push({id:s.propertyName,name:r.displayName||s.table,parentId:e,propertyName:s.propertyName,relationshipType:l,columns:o})}),{rootName:e,rootEntity:{id:e,name:t.displayName||e,columns:n},nestedEntities:i,resultFormat:"single"}}getTableNames(){return Object.keys(this.schemas)}getTable(e){return this.schemas[e]}getPrimaryKey(e){let t=this.schemas[e];if(!t)return;let n=Object.entries(t.columns).find(([i,s])=>s.isPrimaryKey);return n?n[0]:void 0}getForeignKeys(e){let t=this.schemas[e];if(!t)return[];let n=[];return Object.entries(t.columns).forEach(([i,s])=>{s.foreignKey&&n.push({column:i,referencedTable:s.foreignKey.table,referencedColumn:s.foreignKey.column})}),n}};function jy(a){return new on(a)}function Dy(a){return new on(a).createTableColumnResolver()}function Uy(a,e){return new on(a).createJsonMapping(e)}var Qe=class{static lineColumnToCharOffset(e,t){if(t.line<1||t.column<1)return-1;let n=e.split(`
77
- `);if(t.line>n.length)return-1;let i=n[t.line-1];if(t.column>i.length+1)return-1;let s=0;for(let r=0;r<t.line-1;r++)s+=n[r].length+1;return s+=t.column-1,s}static charOffsetToLineColumn(e,t){if(t<0||t>e.length)return null;let n=e.split(`
78
- `),i=0;for(let s=0;s<n.length;s++){let r=n[s].length;if(t<i+r)return{line:s+1,column:t-i+1};if(t===i+r&&s<n.length-1)return{line:s+2,column:1};i+=r+1}if(t===e.length){let s=n[n.length-1];return{line:n.length,column:s.length+1}}return null}static isValidPosition(e,t){return this.lineColumnToCharOffset(e,t)!==-1}static getLine(e,t){if(t<1)return null;let n=e.split(`
79
- `);return t>n.length?null:n[t-1]}static getLineCount(e){return e.split(`
80
- `).length}};var jt=class{static{this.joinSuggestionCache=new Map}static{this.commandSuggestionCache=new Map}static{this.initialized=!1}static initialize(){if(this.initialized)return;let e=[["join"],["inner","join"],["cross","join"],["left","join"],["left","outer","join"],["right","join"],["right","outer","join"],["full","join"],["full","outer","join"],["natural","join"],["natural","inner","join"],["natural","left","join"],["natural","left","outer","join"],["natural","right","join"],["natural","right","outer","join"],["natural","full","join"],["natural","full","outer","join"],["lateral","join"],["lateral","inner","join"],["lateral","left","join"],["lateral","left","outer","join"]],t=new Map,n=new Set;e.forEach(i=>{i.length>1&&n.add(i.slice(1).join(" ").toUpperCase())}),e.forEach(i=>{for(let s=0;s<i.length-1;s++){let r=i[s];t.has(r)||t.set(r,new Set),e.forEach(o=>{if(o.length>s+1&&o[s]===r){let l=o.slice(s+1).join(" ").toUpperCase();t.get(r).add(l)}})}}),t.forEach((i,s)=>{this.joinSuggestionCache.set(s.toLowerCase(),Array.from(i))}),this.initializeCommandKeywords(),this.initialized=!0}static getJoinSuggestions(e){return this.initialize(),this.joinSuggestionCache.get(e.toLowerCase())||[]}static isValidJoinKeyword(e){return Jt.parse(e,0)!==null}static getPartialSuggestions(e){this.initialize();let t=e.toLowerCase(),n=[];return this.joinSuggestionCache.forEach((i,s)=>{s.startsWith(t)&&(n.push(s),i.forEach(r=>{n.includes(r)||n.push(r)}))}),n}static getAllJoinKeywords(){this.initialize();let e=new Set;return this.joinSuggestionCache.forEach((t,n)=>{e.add(n),t.forEach(i=>e.add(i))}),Array.from(e)}static initializeCommandKeywords(){let e=this.extractCommandPatternsFromTrie(),t=new Map;e.forEach(n=>{for(let i=0;i<n.length-1;i++){let s=n[i],r=n[i+1];t.has(s)||t.set(s,new Set),t.get(s).add(r)}}),t.forEach((n,i)=>{this.commandSuggestionCache.set(i.toLowerCase(),Array.from(n))})}static extractCommandPatternsFromTrie(){return[["group","by"],["order","by"],["distinct","on"],["not","materialized"],["row","only"],["rows","only"],["percent","with","ties"],["key","share"],["no","key","update"],["union","all"],["intersect","all"],["except","all"],["partition","by"],["within","group"],["with","ordinality"]]}static getCommandSuggestions(e){return this.initialize(),this.commandSuggestionCache.get(e.toLowerCase())||[]}static reset(){this.joinSuggestionCache.clear(),this.commandSuggestionCache.clear(),this.initialized=!1}};var Dt=class{static{this.patternCache=null}static getKeywordPatterns(){if(this.patternCache!==null)return this.patternCache;let e=new Map,t=new Set,n=new Set;return this.extractKeywordPatterns(e,t,n),this.patternCache={requiresKeywords:e,suggestsTables:t,suggestsColumns:n},this.patternCache}static extractKeywordPatterns(e,t,n){let i=["from","join"],s=["select","where","on","having","by"];for(let r of i)this.isKeywordInDictionary(r)&&t.add(r);for(let r of s)this.isKeywordInDictionary(r)&&n.add(r);this.extractRequiresKeywordPatterns(e)}static isKeywordInDictionary(e){return jt.isValidJoinKeyword(e)?!0:["from","join","select","where","on","having","by","group","order"].includes(e)}static extractRequiresKeywordPatterns(e){let t=["inner","left","right","full","cross","natural","outer","group","order"];for(let n of t){let i=this.findPossibleFollowups(n);i.length>0&&e.set(n,i)}}static findPossibleFollowups(e){let t=new Set;return jt.getJoinSuggestions(e.toLowerCase()).forEach(s=>t.add(s.toUpperCase())),jt.getCommandSuggestions(e.toLowerCase()).forEach(s=>t.add(s.toUpperCase())),Array.from(t)}static requiresSpecificKeywords(e){let n=this.getKeywordPatterns().requiresKeywords.get(e);return n?{suggestKeywords:!0,requiredKeywords:n}:null}static analyzeIntelliSense(e,t){try{let n=Ne.getAllLexemesWithPosition(e),i=-1,s;for(let c=0;c<n.length;c++){let p=n[c];if(p.position){if(t>=p.position.startPosition&&t<=p.position.endPosition){s=p,i=c;break}else if(p.position.startPosition>t){i=Math.max(0,c-1),s=i>=0?n[i]:void 0;break}}}i===-1&&n.length>0&&(i=n.length-1,s=n[i]);let r=i>0?n[i-1]:void 0;if(this.isAfterDot(e,t,r))return{suggestTables:!1,suggestColumns:!0,suggestKeywords:!1,tableScope:this.findPrecedingIdentifier(e,t,n),currentToken:s,previousToken:r};if(s){let c=s.value.toLowerCase(),p=this.requiresSpecificKeywords(c);if(p)return{suggestTables:!1,suggestColumns:!1,...p,currentToken:s,previousToken:r}}let l=s?.value.toLowerCase(),u=r?.value.toLowerCase();if(l){let c=this.getKeywordPatterns();if(c.suggestsTables.has(l))return{suggestTables:!0,suggestColumns:!1,suggestKeywords:!1,currentToken:s,previousToken:r};if(c.suggestsColumns.has(l))return{suggestTables:!1,suggestColumns:!0,suggestKeywords:!1,currentToken:s,previousToken:r}}if(u){let c=this.getKeywordPatterns(),p=this.requiresSpecificKeywords(u);if(p&&l!=="join"&&l!=="outer"&&l!=="by")return{suggestTables:!1,suggestColumns:!1,...p,currentToken:s,previousToken:r};if(c.suggestsTables.has(u))return{suggestTables:!0,suggestColumns:!1,suggestKeywords:!1,currentToken:s,previousToken:r};if(c.suggestsColumns.has(u))return{suggestTables:!1,suggestColumns:!0,suggestKeywords:!1,currentToken:s,previousToken:r}}return{suggestTables:!1,suggestColumns:!1,suggestKeywords:!0,currentToken:s,previousToken:r}}catch{return{suggestTables:!1,suggestColumns:!1,suggestKeywords:!1}}}static analyzeIntelliSenseAt(e,t){let n=Qe.lineColumnToCharOffset(e,t);return n===-1?{suggestTables:!1,suggestColumns:!1,suggestKeywords:!1}:this.analyzeIntelliSense(e,n)}static isAfterDot(e,t,n){if(t>0&&e[t-1]==="."||n&&n.value===".")return!0;let i=t-1;for(;i>=0&&/\s/.test(e[i]);)i--;return i>=0&&e[i]==="."}static findPrecedingIdentifier(e,t,n){if(this.isAfterDot(e,t)){let i=t-1;for(;i>=0&&/\s/.test(e[i]);)i--;if(i>=0&&e[i]==="."){let s=i;for(;i>=0&&/\s/.test(e[i]);)i--;for(;i>=0&&/[a-zA-Z0-9_]/.test(e[i]);)i--;let r=i+1;if(r<s)return e.substring(r,s)}for(let s=n.length-1;s>=0;s--)if(n[s].value==="."&&n[s].position&&n[s].position.startPosition<t){if(s>0&&this.isIdentifier(n[s-1]))return n[s-1].value;break}}}static isIdentifier(e){return/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e.value)}};var an=class{static resolve(e,t){return this.createEmptyScope()}static resolveAt(e,t){let n=Qe.lineColumnToCharOffset(e,t);return n===-1?this.createEmptyScope():this.resolve(e,n)}static getColumnsForTable(e,t,n){let i=this.resolve(e,t),s=i.availableTables.find(r=>r.name===n||r.alias===n);return s?i.visibleColumns.filter(r=>r.tableName===s.name||s.alias&&r.tableAlias===s.alias):[]}static analyzeScopeFromQuery(e){let t={availableTables:[],availableCTEs:[],subqueryLevel:0,visibleColumns:[],currentQuery:e,parentQueries:[]};if(e instanceof g)t.availableCTEs=this.collectCTEs(e),t.availableTables=this.collectTablesFromQuery(e),t.visibleColumns=this.collectVisibleColumns(t.availableTables,t.availableCTEs);else if(e instanceof Q){let n=this.analyzeScopeFromQuery(e.left),i=this.analyzeScopeFromQuery(e.right);t.availableTables=[...n.availableTables,...i.availableTables],t.availableCTEs=[...n.availableCTEs,...i.availableCTEs],t.visibleColumns=[...n.visibleColumns,...i.visibleColumns]}return t}static collectCTEs(e){let t=[];if(e.withClause){let i=new X().collect(e);for(let s of i)t.push({name:s.getSourceAliasName(),query:s.query,columns:this.extractCTEColumns(s.query),materialized:s.materialized||!1})}return t}static collectTablesFromQuery(e){let t=[];if(e.fromClause){let n=this.extractTablesFromFromClause(e.fromClause);t.push(...n)}return t}static extractTablesFromFromClause(e){let t=[];if(e.source.datasource instanceof O){let n={name:this.extractTableName(e.source.datasource.qualifiedName),alias:e.source.aliasExpression?.table.name,schema:this.extractSchemaName(e.source.datasource.qualifiedName),fullName:this.getQualifiedNameString(e.source.datasource.qualifiedName),sourceType:"table"};t.push(n)}else if(e.source.datasource instanceof M){let n={name:e.source.aliasExpression?.table.name||"subquery",alias:e.source.aliasExpression?.table.name,fullName:e.source.aliasExpression?.table.name||"subquery",sourceType:"subquery",originalQuery:e.source.datasource.query};t.push(n)}if(e.joins)for(let n of e.joins){let i=this.extractTablesFromJoin(n);t.push(...i)}return t}static extractTablesFromJoin(e){let t=[];if(e.source.datasource instanceof O){let n={name:this.extractTableName(e.source.datasource.qualifiedName),alias:e.source.aliasExpression?.table.name,schema:this.extractSchemaName(e.source.datasource.qualifiedName),fullName:this.getQualifiedNameString(e.source.datasource.qualifiedName),sourceType:"table"};t.push(n)}else if(e.source.datasource instanceof M){let n={name:e.source.aliasExpression?.table.name||"subquery",alias:e.source.aliasExpression?.table.name,fullName:e.source.aliasExpression?.table.name||"subquery",sourceType:"subquery",originalQuery:e.source.datasource.query};t.push(n)}return t}static getQualifiedNameString(e){return e.toString()}static extractTableName(e){let n=this.getQualifiedNameString(e).split(".");return n[n.length-1]}static extractSchemaName(e){let n=this.getQualifiedNameString(e).split(".");return n.length>1?n[n.length-2]:void 0}static extractCTEColumns(e){try{if(e instanceof g&&e.selectClause){let t=[];for(let n of e.selectClause.items)if(n.identifier)t.push(n.identifier.name);else{let i=this.extractColumnNameFromExpression(n.value);i&&t.push(i)}return t}}catch{}}static extractColumnNameFromExpression(e){if(e&&typeof e=="object"&&"value"in e)return e.value}static collectVisibleColumns(e,t){let n=[];for(let i of t)if(i.columns)for(let s of i.columns)n.push({name:s,tableName:i.name,fullReference:`${i.name}.${s}`});for(let i of e)i.sourceType==="table"&&n.push({name:"*",tableName:i.name,tableAlias:i.alias,fullReference:`${i.alias||i.name}.*`});return n}static createEmptyScope(){return{availableTables:[],availableCTEs:[],subqueryLevel:0,visibleColumns:[],parentQueries:[]}}};var hi=class{static parseToPosition(e,t,n={}){let i=typeof t=="number"?t:Qe.lineColumnToCharOffset(e,t);if(i===-1)return{success:!1,error:"Invalid cursor position",stoppedAtCursor:!1};try{let s=this.tryNormalParse(e,i,n);return s.success?s:n.errorRecovery?this.tryErrorRecovery(e,i,n):s}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s),stoppedAtCursor:!1}}}static parseCurrentQuery(e,t,n={}){let i=typeof t=="number"?t:Qe.lineColumnToCharOffset(e,t);if(i===-1)return{success:!1,error:"Invalid cursor position",stoppedAtCursor:!1};let s=this.findQueryBoundaries(e),r=this.findQueryAtPosition(s,i);if(!r)return{success:!1,error:"No query found at cursor position",stoppedAtCursor:!1};let o=i-r.start,l=e.substring(r.start,r.end);return this.parseToPosition(l,o,n)}static tryNormalParse(e,t,n){if(t<0||t>e.length)return{success:!1,error:"Invalid cursor position",stoppedAtCursor:!1};let i=e.trim(),r=[".",",","SELECT","FROM","WHERE","JOIN","ON","GROUP BY","ORDER BY"].some(p=>i.toLowerCase().endsWith(p.toLowerCase())),o=A.analyze(e);if(!o.success||r)return{...o,success:!1};let l=this.getAllTokens(e),u=this.findTokenAtPosition(l,t),c=this.findTokenBeforePosition(l,t);return{...o,parsedTokens:l,tokenBeforeCursor:c,stoppedAtCursor:t<e.length,recoveryAttempts:0}}static tryErrorRecovery(e,t,n){let i=n.maxRecoveryAttempts||5,s=0,r=[()=>this.recoverWithTokenInsertion(e,t,n),()=>this.recoverWithTruncation(e,t,n),()=>this.recoverWithCompletion(e,t,n),()=>this.recoverWithMinimalSQL(e,t,n)];for(let o of r){if(s>=i)break;s++;try{let l=o();if(l.success)return l.recoveryAttempts=s,l}catch{continue}}return{success:!1,error:"All error recovery attempts failed",recoveryAttempts:s,stoppedAtCursor:!1}}static recoverWithTokenInsertion(e,t,n){if(!n.insertMissingTokens)throw new Error("Token insertion disabled");let i=[{pattern:/SELECT\s*$/i,replacement:"SELECT 1 "},{pattern:/FROM\s*$/i,replacement:"FROM dual "},{pattern:/WHERE\s*$/i,replacement:"WHERE 1=1 "},{pattern:/JOIN\s*$/i,replacement:"JOIN dual ON 1=1 "},{pattern:/ON\s*$/i,replacement:"ON 1=1 "},{pattern:/GROUP\s+BY\s*$/i,replacement:"GROUP BY 1 "},{pattern:/ORDER\s+BY\s*$/i,replacement:"ORDER BY 1 "}],s=e;for(let l of i)if(l.pattern.test(e)){s=e.replace(l.pattern,l.replacement);break}if(s===e)throw new Error("No applicable token insertion found");let r=A.analyze(s),o=this.getAllTokens(e);return{...r,parsedTokens:o,tokenBeforeCursor:this.findTokenBeforePosition(o,t),stoppedAtCursor:!0,recoveryAttempts:1}}static recoverWithTruncation(e,t,n){let i=e.substring(0,t),s=[""," 1"," FROM dual"," WHERE 1=1"];for(let r of s)try{let o=i+r,l=A.analyze(o);if(l.success){let u=this.getAllTokens(e);return{...l,parsedTokens:u.filter(c=>c.position&&c.position.startPosition<=t),tokenBeforeCursor:this.findTokenBeforePosition(u,t),stoppedAtCursor:!0,recoveryAttempts:1}}}catch{continue}throw new Error("Truncation recovery failed")}static recoverWithCompletion(e,t,n){let i=e.substring(0,t),s=e.substring(t),r=[{pattern:/\.\s*$/,completion:"id"},{pattern:/\w+\s*$/,completion:""},{pattern:/,\s*$/,completion:"1"},{pattern:/\(\s*$/,completion:"1)"}];for(let o of r)if(o.pattern.test(i)){let l=i+o.completion+s;try{let u=A.analyze(l);if(u.success){let c=this.getAllTokens(e);return{...u,parsedTokens:c,tokenBeforeCursor:this.findTokenBeforePosition(c,t),stoppedAtCursor:!0,recoveryAttempts:1}}}catch{continue}}throw new Error("Completion recovery failed")}static recoverWithMinimalSQL(e,t,n){let i="SELECT 1 FROM dual WHERE 1=1";try{let s=A.analyze(i),r=this.getAllTokens(e);return{success:!0,query:s.query,parsedTokens:r.filter(o=>o.position&&o.position.startPosition<=t),tokenBeforeCursor:this.findTokenBeforePosition(r,t),stoppedAtCursor:!0,partialAST:s.query,recoveryAttempts:1}}catch{throw new Error("Minimal SQL recovery failed")}}static getAllTokens(e){try{return Ne.getAllLexemesWithPosition(e)}catch{return[]}}static findTokenAtPosition(e,t){return e.find(n=>n.position&&t>=n.position.startPosition&&t<n.position.endPosition)}static findTokenBeforePosition(e,t){let n;for(let i of e)if(i.position)if(i.position.endPosition<=t)n=i;else{if(i.position.startPosition<t)break;break}return n}static findQueryBoundaries(e){let t=[],n=0,i=!1,s="",r=!1;for(let o=0;o<e.length;o++){let l=e[o],u=o<e.length-1?e[o+1]:"";if(!r&&(l==="'"||l==='"')){i?l===s&&(i=!1,s=""):(i=!0,s=l);continue}if(!i&&l==="-"&&u==="-"){r=!0,o++;continue}if(r&&l===`
81
- `){r=!1;continue}!i&&!r&&l===";"&&(t.push({start:n,end:o}),n=o+1)}return n<e.length&&t.push({start:n,end:e.length}),t}static findQueryAtPosition(e,t){return e.find(n=>t>=n.start&&t<=n.end)}};var Ut=class{static split(e){let t=[];if(!e||e.trim()==="")return{queries:[],originalText:e,getActive:()=>{},getQuery:()=>{},getNonEmpty:()=>[]};let n=this.splitRespectingQuotesAndComments(e),i=this.mergeTrailingCommentSegments(n,e),s=0;for(let r of i){let o=r.text.trim(),l=this.isEmptyQuery(o),u=o,c=Qe.charOffsetToLineColumn(e,r.start),p=Qe.charOffsetToLineColumn(e,r.end);t.push({sql:u,start:r.start,end:r.end,startLine:c?.line||1,endLine:p?.line||1,index:s++,isEmpty:l})}return{queries:t,originalText:e,getActive:r=>{let o=typeof r=="number"?r:Qe.lineColumnToCharOffset(e,r);if(o!==-1)return t.find(l=>o>=l.start&&o<=l.end)},getQuery:r=>t[r],getNonEmpty:()=>t.filter(r=>!r.isEmpty)}}static splitRespectingQuotesAndComments(e){let t=[],n=0,i=0;for(;i<=e.length;){if(i===e.length||i<e.length&&this.isValidSemicolon(e,i)){let r=e.substring(n,i);(r.length>0||i<e.length)&&t.push({text:r,start:n,end:i}),n=i+1}i++}return t}static isValidSemicolon(e,t){if(e[t]!==";")return!1;let n=!1,i=!1,s=!1,r=!1;for(let o=0;o<t;o++){let l=e[o],u=o+1<e.length?e[o+1]:"";if(!n&&!i&&!r&&l==="-"&&u==="-"){s=!0,o++;continue}if(s&&l===`
82
- `){s=!1;continue}if(!n&&!i&&!s&&l==="/"&&u==="*"){r=!0,o++;continue}if(r&&l==="*"&&u==="/"){r=!1,o++;continue}if(!(s||r)){if(l==="'"&&!i){n&&u==="'"?o++:n=!n;continue}if(l==='"'&&!n){i&&u==='"'?o++:i=!i;continue}}}return!n&&!i&&!s&&!r}static mergeTrailingCommentSegments(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i],r=s.text.trim();if(this.isEmptyQuery(r)&&n.length>0){let l=n[n.length-1].text.trim(),u=r.startsWith("--"),c=!this.isEmptyQuery(l);if(u&&c){let p=n[n.length-1];n[n.length-1]={text:t.substring(p.start,s.end),start:p.start,end:s.end}}else n.push(s)}else n.push(s)}return n}static cleanSqlComments(e){if(!e)return null;let t=e;t=t.split(`
83
- `).map(i=>{let s=i.indexOf("--");return s>=0?i.substring(0,s):i}).join(`
84
- `),t=t.replace(/\/\*[\s\S]*?\*\//g,"");let n=t.trim();return n.length>0?n:null}static isEmptyQuery(e){return e?this.cleanSqlComments(e)===null:!0}},Di=class{static getContextAt(e,t){let i=Ut.split(e).getActive(t);if(!i)return;let s=typeof t=="number"?t:Qe.lineColumnToCharOffset(e,t);if(s===-1)return;let r=s-i.start;return{query:i,relativePosition:r}}static extractQueries(e){return Ut.split(e).getNonEmpty().map(n=>n.sql)}};function Ui(a,e,t={}){return hi.parseToPosition(a,e,t)}function Ki(a,e){return typeof e=="number"?Dt.analyzeIntelliSense(a,e):Dt.analyzeIntelliSenseAt(a,e)}function xi(a,e){return typeof e=="number"?an.resolve(a,e):an.resolveAt(a,e)}function Ji(a){return Ut.split(a)}function gs(a,e,t={}){let n=typeof e=="number"?e:Qe.lineColumnToCharOffset(a,e);if(n===-1)return;let s=Ji(a).getActive(n);if(!s)return;let r=n-s.start,o=s.sql,l=Ki(o,r),u=xi(o,r),c=Ui(o,r,t);return{context:l,scope:u,parseResult:c,currentQuery:o,relativePosition:r}}function ys(a,e){let t=typeof e=="number"?e:Qe.lineColumnToCharOffset(a,e);if(t===-1)return[];let n=Dt.analyzeIntelliSense(a,t),i=xi(a,e),s=[];return n.suggestKeywords&&(n.requiredKeywords?n.requiredKeywords.forEach(r=>{s.push({type:"keyword",value:r,detail:`Required keyword: ${r}`})}):vs(n).forEach(o=>{s.push({type:"keyword",value:o.value,detail:o.detail})})),n.suggestTables&&(i.availableTables.forEach(r=>{s.push({type:"table",value:r.alias||r.name,detail:`Table: ${r.fullName}`,documentation:`Available table${r.alias?` (alias: ${r.alias})`:""}`})}),i.availableCTEs.forEach(r=>{s.push({type:"cte",value:r.name,detail:`CTE: ${r.name}`,documentation:`Common Table Expression${r.columns?` with columns: ${r.columns.join(", ")}`:""}`})})),n.suggestColumns&&(n.tableScope?i.visibleColumns.filter(o=>o.tableName===n.tableScope||o.tableAlias===n.tableScope).forEach(o=>{s.push({type:"column",value:o.name,detail:`Column: ${o.fullReference}`,documentation:`Column from ${o.tableName}${o.type?` (${o.type})`:""}`})}):i.visibleColumns.forEach(r=>{s.push({type:"column",value:r.name==="*"?"*":`${r.tableAlias||r.tableName}.${r.name}`,detail:`Column: ${r.fullReference}`,documentation:`Column from ${r.tableName}`})})),s}function vs(a){let e=a.previousToken?.value?.toLowerCase(),t=a.currentToken?.value?.toLowerCase();return e==="select"||t==="select"?[{value:"DISTINCT",detail:"Remove duplicate rows"},{value:"COUNT",detail:"Aggregate function"},{value:"SUM",detail:"Aggregate function"},{value:"AVG",detail:"Aggregate function"},{value:"MAX",detail:"Aggregate function"},{value:"MIN",detail:"Aggregate function"}]:e==="from"||t==="from"?[{value:"JOIN",detail:"Inner join tables"},{value:"LEFT JOIN",detail:"Left outer join"},{value:"RIGHT JOIN",detail:"Right outer join"},{value:"FULL JOIN",detail:"Full outer join"},{value:"WHERE",detail:"Filter conditions"},{value:"GROUP BY",detail:"Group results"},{value:"ORDER BY",detail:"Sort results"}]:["where","having","on"].includes(e||"")||["where","having","on"].includes(t||"")?[{value:"AND",detail:"Logical AND operator"},{value:"OR",detail:"Logical OR operator"},{value:"NOT",detail:"Logical NOT operator"},{value:"IN",detail:"Match any value in list"},{value:"LIKE",detail:"Pattern matching"},{value:"BETWEEN",detail:"Range comparison"}]:[{value:"SELECT",detail:"Query data"},{value:"FROM",detail:"Specify table"},{value:"WHERE",detail:"Filter conditions"},{value:"JOIN",detail:"Join tables"},{value:"GROUP BY",detail:"Group results"},{value:"ORDER BY",detail:"Sort results"},{value:"LIMIT",detail:"Limit results"}]}export{Xn as AliasRenamer,ye as ArrayExpression,tt as ArrayIndexExpression,ve as ArrayQueryExpression,et as ArraySliceExpression,we as BetweenExpression,S as BinaryExpression,Q as BinarySelectQuery,X as CTECollector,Yn as CTEComposer,ft as CTEDependencyAnalyzer,Lt as CTEDisabler,st as CTENormalizer,Gt as CTENotFoundError,Oi as CTEQueryDecomposer,ht as CTERegionDetector,Zn as CTERenamer,zn as CTETableReferenceCollector,se as CaseExpression,xe as CaseKeyValuePair,ce as CastExpression,b as ColumnReference,Vt as ColumnReferenceCollector,Hn as CommentEditor,Dt as CursorContextAnalyzer,Ht as DuplicateCTEError,vt as DuplicateDetectionMode,Vi as DynamicQueryBuilder,$t as FilterableItem,Bi as FilterableItemCollector,dt as Formatter,U as FunctionCall,I as IdentifierString,ge as InlineQuery,ot as InsertQuery,Qi as InsertQueryParser,Qt as InvalidCTENameError,Zt as JsonMappingConverter,ji as JsonSchemaValidator,Ne as LexemeCursor,Y as LiteralValue,Ut as MultiQuerySplitter,Di as MultiQueryUtils,Fi as OriginalFormatRestorer,L as ParameterExpression,Z as ParenExpression,hi as PositionAwareParser,ii as PostgresJsonQueryBuilder,De as QualifiedName,We as QueryBuilder,Wi as QueryFlowDiagramGenerator,V as RawString,Bt as SchemaCollector,on as SchemaManager,an as ScopeResolver,A as SelectQueryParser,_e as SelectValueCollector,ke as SelectableColumnCollector,g as SimpleSelectQuery,Ri as SmartRenamer,v as SqlComponent,Ti as SqlDialectConfiguration,Be as SqlFormatter,ei as SqlIdentifierRenamer,oi as SqlPaginationInjector,si as SqlParamInjector,Gn as SqlSchemaValidator,ri as SqlSortInjector,je as StringSpecifierExpression,Ee as SwitchCaseArgument,lt as TableSchema,Ge as TableSourceCollector,$ as TokenType,Ie as TupleExpression,ui as TypeTransformationPostProcessor,gy as TypeTransformers,Re as TypeValue,ne as UnaryExpression,Ot as UpstreamSelectQueryFinder,Gu as VALID_PRESETS,D as ValueList,Ce as ValuesQuery,Ii as WindowFrameBound,Et as WindowFrameBoundStatic,xt as WindowFrameBoundaryValue,Ve as WindowFrameExpression,He as WindowFrameSpec,ki as WindowFrameType,Ft as WithClauseParser,li as convertColumnsToLegacy,yi as convertModelDrivenMapping,sy as convertToLegacyJsonMapping,Uy as createJsonMappingFromSchema,jy as createSchemaManager,Dy as createTableColumnResolver,Mi as extractTypeProtection,ys as getCompletionSuggestions,Ki as getCursorContext,gs as getIntelliSenseInfo,Cs as isLegacyFormat,hs as isModelDrivenFormat,fs as isUnifiedFormat,Ui as parseToPosition,ms as processJsonMapping,xi as resolveScope,Ji as splitQueries,$i as toLegacyMapping,Cy as transformDatabaseResult,ds as unifyJsonMapping,cs as validateModelDrivenMapping};
69
+ 3. Entity hierarchy and parentId relationships are correct`)}args.push(new ColumnReference(null,new IdentifierString(mapping.generatedColumnName)))}else childEntity.relationshipType==="array"&&args.push(new ColumnReference(null,new IdentifierString(childEntity.propertyName)))});let jsonObject=new FunctionCall(null,new RawString(jsonBuildFunction),new ValueList(args),null),jsonAggFunction=_PostgresArrayEntityCteBuilder.JSON_FUNCTIONS.AGGREGATE,primaryColumn=Object.values(entity.columns)[0];return{jsonAgg:new FunctionCall(null,new RawString(jsonAggFunction),new ValueList([jsonObject]),null)}}collectArrayEntityColumnsByDepth(mapping,currentDepth){let arrayEntitiesByDepth=new Map,maxDepth=Math.max(currentDepth+3,5);for(let d=currentDepth;d<=maxDepth;d++)arrayEntitiesByDepth.set(d,new Set);return mapping.nestedEntities.filter(entity=>entity.relationshipType==="array").forEach(entity=>{let entityDepth=this.calculateEntityDepth(entity,mapping);arrayEntitiesByDepth.has(entityDepth)||arrayEntitiesByDepth.set(entityDepth,new Set),this.addEntityColumnsToDepthSet(entity,entityDepth,arrayEntitiesByDepth),this.collectDescendantColumns(entity.id,entityDepth,mapping,arrayEntitiesByDepth)}),arrayEntitiesByDepth}calculateEntityDepth(entity,mapping){let entityDepth=0,currentEntity=entity;for(;currentEntity.parentId&&currentEntity.parentId!==mapping.rootEntity.id;)entityDepth++,currentEntity=mapping.nestedEntities.find(e=>e.id===currentEntity.parentId)||currentEntity;return entityDepth}addEntityColumnsToDepthSet(entity,depth,arrayEntitiesByDepth){Object.values(entity.columns).forEach(column=>{let columnName=typeof column=="string"?column:column.column;arrayEntitiesByDepth.get(depth).add(columnName)})}collectDescendantColumns(parentEntityId,targetDepth,mapping,arrayEntitiesByDepth){mapping.nestedEntities.filter(nestedEntity=>nestedEntity.parentId===parentEntityId).forEach(nestedEntity=>{this.addEntityColumnsToDepthSet(nestedEntity,targetDepth,arrayEntitiesByDepth),this.collectDescendantColumns(nestedEntity.id,targetDepth,mapping,arrayEntitiesByDepth)})}processSelectVariablesForGroupBy(prevSelects,arrayColumns,arrayEntitiesByDepth,currentDepth,selectItems,groupByItems,arrayInternalObjectColumns){prevSelects.forEach(sv=>{if(!arrayColumns.has(sv.name)){if(arrayInternalObjectColumns&&arrayInternalObjectColumns.has(sv.name))return;this.shouldIncludeColumnInGroupBy(sv.name,arrayEntitiesByDepth,currentDepth)&&(selectItems.push(new SelectItem(new ColumnReference(null,new IdentifierString(sv.name)),sv.name)),sv.name.endsWith("_json")||groupByItems.push(new ColumnReference(null,new IdentifierString(sv.name))))}})}shouldIncludeColumnInGroupBy(columnName,arrayEntitiesByDepth,currentDepth){let isJsonColumn=columnName.endsWith("_json"),shouldInclude=!0;for(let[entityDepth,columns]of arrayEntitiesByDepth.entries())if(entityDepth>=currentDepth&&columns.has(columnName)){shouldInclude=!1;break}return isJsonColumn&&columnName.startsWith("entity_")&&(shouldInclude=this.shouldIncludeJsonColumn(columnName,currentDepth)),shouldInclude}shouldIncludeJsonColumn(columnName,currentDepth){let entityMatch=columnName.match(/entity_(\d+)_json/);return entityMatch&&currentDepth>0?parseInt(entityMatch[1])<=2:!0}};var PostgresJsonQueryBuilder=class{constructor(){this.selectValueCollector=new SelectValueCollector(null),this.objectEntityCteBuilder=new PostgresObjectEntityCteBuilder,this.arrayEntityCteBuilder=new PostgresArrayEntityCteBuilder}validateMapping(query,mapping){let selectedValues=new SelectValueCollector().collect(query),availableColumns=new Set(selectedValues.map(sv=>sv.name));for(let jsonKey in mapping.rootEntity.columns){let columnDef=mapping.rootEntity.columns[jsonKey],sourceColumn=typeof columnDef=="string"?columnDef:columnDef.column;if(!availableColumns.has(sourceColumn))throw new Error(`Validation Error: Column "${sourceColumn}" for JSON key "${jsonKey}" in root entity "${mapping.rootEntity.name}" not found in the query's select list.`)}let entityIds=new Set([mapping.rootEntity.id]),parentToChildrenMap=new Map;mapping.nestedEntities.forEach(ne=>{entityIds.add(ne.id),parentToChildrenMap.has(ne.parentId)||parentToChildrenMap.set(ne.parentId,[]),parentToChildrenMap.get(ne.parentId).push(ne.id)});for(let entity of mapping.nestedEntities){if(!entityIds.has(entity.parentId))throw new Error(`Validation Error: Parent entity with ID "${entity.parentId}" for nested entity "${entity.name}" (ID: ${entity.id}) not found.`);for(let jsonKey in entity.columns){let columnDef=entity.columns[jsonKey],sourceColumn=typeof columnDef=="string"?columnDef:columnDef.column;if(!availableColumns.has(sourceColumn))throw new Error(`Validation Error: Column "${sourceColumn}" for JSON key "${jsonKey}" in nested entity "${entity.name}" (ID: ${entity.id}) not found in the query's select list.`)}}let allParentIds=new Set([mapping.rootEntity.id,...mapping.nestedEntities.map(ne=>ne.parentId)]);for(let parentId of allParentIds){let directChildren=mapping.nestedEntities.filter(ne=>ne.parentId===parentId);if(directChildren.filter(c=>c.relationshipType==="array").length>1){let parentName=parentId===mapping.rootEntity.id?mapping.rootEntity.name:mapping.nestedEntities.find(ne=>ne.id===parentId)?.name;throw new Error(`Validation Error: Parent entity "${parentName}" (ID: ${parentId}) has multiple direct array children. This is not supported.`)}let propertyNames=new Set;for(let child of directChildren){if(propertyNames.has(child.propertyName)){let parentName=parentId===mapping.rootEntity.id?mapping.rootEntity.name:mapping.nestedEntities.find(ne=>ne.id===parentId)?.name;throw new Error(`Validation Error: Parent entity "${parentName}" (ID: ${parentId}) has duplicate property name "${child.propertyName}" for its children.`)}propertyNames.add(child.propertyName)}}}buildJsonQuery(originalQuery,mapping,options){if(options?.jsonb===!1)throw new Error("JSONB must be enabled for PostgreSQL GROUP BY compatibility. JSON type cannot be used in GROUP BY clauses. Please set jsonb: true or omit the jsonb option (defaults to true).");let simpleQuery=originalQuery instanceof SimpleSelectQuery?originalQuery:QueryBuilder.buildSimpleQuery(originalQuery);return this.buildJsonWithCteStrategy(simpleQuery,mapping)}buildJson(originalQuery,mapping){return console.warn("buildJson is deprecated. Use buildJsonQuery instead."),this.buildJsonQuery(originalQuery,mapping)}buildJsonWithCteStrategy(originalQuery,mapping){this.validateMapping(originalQuery,mapping);let{initialCte,initialCteAlias}=this.createInitialCte(originalQuery),ctesForProcessing=[initialCte],currentAliasToBuildUpon=initialCteAlias,allEntities=new Map;allEntities.set(mapping.rootEntity.id,{...mapping.rootEntity,isRoot:!0,propertyName:mapping.rootName}),mapping.nestedEntities.forEach(ne=>allEntities.set(ne.id,{...ne,isRoot:!1,propertyName:ne.propertyName}));let objectEntityResult=this.objectEntityCteBuilder.buildObjectEntityCtes(initialCte,allEntities,mapping);ctesForProcessing=objectEntityResult.ctes,currentAliasToBuildUpon=objectEntityResult.lastCteAlias;let columnMappings=objectEntityResult.columnMappings,arrayCteBuildResult=this.arrayEntityCteBuilder.buildArrayEntityCtes(ctesForProcessing,currentAliasToBuildUpon,allEntities,mapping,columnMappings);return ctesForProcessing=arrayCteBuildResult.updatedCtes,currentAliasToBuildUpon=arrayCteBuildResult.lastCteAlias,this.buildFinalSelectQuery(ctesForProcessing,currentAliasToBuildUpon,allEntities,mapping,columnMappings)}createInitialCte(originalQuery){let originCteAlias="origin_query";return{initialCte:new CommonTable(originalQuery,new SourceAliasExpression(originCteAlias,null),null),initialCteAlias:originCteAlias}}buildFinalSelectQuery(finalCtesList,lastCteAliasForFromClause,allEntities,mapping,columnMappings){let currentCtes=[...finalCtesList],rootObjectCteAlias=`cte_root_${mapping.rootName.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`,rootEntity=allEntities.get(mapping.rootEntity.id);if(!rootEntity)throw new Error(`Root entity ${mapping.rootEntity.id} not found`);if(mapping.resultFormat==="array"||!mapping.resultFormat){let rootObjectBuilderExpression=this.buildEntityJsonObject(rootEntity,null,mapping.nestedEntities,allEntities,columnMappings),rootObjectSelectItem=new SelectItem(rootObjectBuilderExpression,mapping.rootName),rootObjectCte=new CommonTable(new SimpleSelectQuery({selectClause:new SelectClause([rootObjectSelectItem]),fromClause:new FromClause(new SourceExpression(new TableSource(null,new IdentifierString(lastCteAliasForFromClause)),null),null)}),new SourceAliasExpression(rootObjectCteAlias,null),null);currentCtes.push(rootObjectCte);let aggregationFunc="jsonb_agg",aggregateExpression=new FunctionCall(null,new RawString(aggregationFunc),new ValueList([new ColumnReference(null,new IdentifierString(mapping.rootName))]),null);return new SimpleSelectQuery({withClause:new WithClause(!1,currentCtes),selectClause:new SelectClause([new SelectItem(aggregateExpression,`${mapping.rootName}_array`)]),fromClause:new FromClause(new SourceExpression(new TableSource(null,new IdentifierString(rootObjectCteAlias)),null),null)})}else{let rootObjectBuilderExpression=this.buildEntityJsonObject(rootEntity,null,mapping.nestedEntities,allEntities,columnMappings),rootObjectSelectItem=new SelectItem(rootObjectBuilderExpression,mapping.rootName),rootObjectCte=new CommonTable(new SimpleSelectQuery({selectClause:new SelectClause([rootObjectSelectItem]),fromClause:new FromClause(new SourceExpression(new TableSource(null,new IdentifierString(lastCteAliasForFromClause)),null),null)}),new SourceAliasExpression(rootObjectCteAlias,null),null);return currentCtes.push(rootObjectCte),new SimpleSelectQuery({withClause:new WithClause(!1,currentCtes),selectClause:new SelectClause([new SelectItem(new ColumnReference(null,new IdentifierString(mapping.rootName)),mapping.rootName)]),fromClause:new FromClause(new SourceExpression(new TableSource(null,new IdentifierString(rootObjectCteAlias)),null),null),limitClause:new LimitClause(new LiteralValue(1))})}}buildEntityJsonObject(entity,sourceAlias,nestedEntities,allEntities,columnMappings){let jsonBuildFunction="jsonb_build_object",args=[];return Object.entries(entity.columns).forEach(([jsonKey,columnDef])=>{let sqlColumn=typeof columnDef=="string"?columnDef:columnDef.column;args.push(new LiteralValue(jsonKey,void 0,!0)),args.push(new ColumnReference(null,new IdentifierString(sqlColumn)))}),nestedEntities.filter(ne=>ne.parentId===entity.id).forEach(childEntity=>{let child=allEntities.get(childEntity.id);if(child)if(args.push(new LiteralValue(childEntity.propertyName,void 0,!0)),childEntity.relationshipType==="object"){let mapping=columnMappings.find(m=>m.entityId===child.id);if(!mapping)throw new Error(`Column mapping not found for entity: ${child.id}`);args.push(new ColumnReference(null,new IdentifierString(mapping.generatedColumnName)))}else childEntity.relationshipType==="array"&&args.push(new ColumnReference(null,new IdentifierString(childEntity.propertyName)))}),new FunctionCall(null,new RawString(jsonBuildFunction),new ValueList(args),null)}};var ParameterDetector=class{static extractParameterNames(query){return ParameterCollector.collect(query).map(p=>p.name.value)}static hasParameter(query,parameterName){return this.extractParameterNames(query).includes(parameterName)}static separateFilters(query,filter){let hardcodedParamNames=this.extractParameterNames(query),hardcodedParams={},dynamicFilters={};for(let[key,value]of Object.entries(filter))hardcodedParamNames.includes(key)?hardcodedParams[key]=value:dynamicFilters[key]=value;return{hardcodedParams,dynamicFilters}}};var FilterableItem=class{constructor(name,type,tableName){this.name=name;this.type=type;this.tableName=tableName}},FilterableItemCollector=class{constructor(tableColumnResolver,options){this.tableColumnResolver=tableColumnResolver,this.options={qualified:!1,upstream:!0,...options}}collect(query){let items=[],columnItems=this.collectColumns(query);items.push(...columnItems);let parameterItems=this.collectParameters(query);return items.push(...parameterItems),this.removeDuplicates(items)}collectColumns(query){let items=[];try{let columns=new SelectableColumnCollector(this.tableColumnResolver,!1,"fullName",{upstream:this.options.upstream}).collect(query);for(let column of columns){let tableName,realTableName;if(column.value&&typeof column.value.getNamespace=="function"){let namespace=column.value.getNamespace();namespace&&namespace.trim()!==""&&(tableName=namespace,this.options.qualified&&(realTableName=this.getRealTableName(query,namespace)))}tableName||(tableName=this.inferTableNameFromQuery(query),tableName&&this.options.qualified&&(realTableName=tableName));let columnName=column.name;this.options.qualified&&(realTableName||tableName)&&(columnName=`${realTableName||tableName}.${column.name}`),items.push(new FilterableItem(columnName,"column",tableName))}}catch(error){console.warn("Failed to collect columns with SelectableColumnCollector, using fallback:",error);try{let schemas=new SchemaCollector(this.tableColumnResolver,!0).collect(query);for(let schema of schemas)for(let columnName of schema.columns){let finalColumnName=columnName;this.options.qualified&&(finalColumnName=`${schema.name}.${columnName}`),items.push(new FilterableItem(finalColumnName,"column",schema.name))}}catch(fallbackError){console.warn("Failed to collect columns with both approaches:",error,fallbackError)}}return items}inferTableNameFromQuery(query){if(query instanceof SimpleSelectQuery&&query.fromClause&&query.fromClause.source){let datasource=query.fromClause.source.datasource;if(datasource&&typeof datasource.table=="object"){let table=datasource.table;if(table&&typeof table.name=="string")return table.name}}}getRealTableName(query,aliasOrName){try{let simpleQuery=query.type==="WITH"?query.toSimpleQuery():query;if(simpleQuery instanceof SimpleSelectQuery&&simpleQuery.fromClause){if(simpleQuery.fromClause.source?.datasource){let mainSource=simpleQuery.fromClause.source,realName=this.extractRealTableName(mainSource,aliasOrName);if(realName)return realName}let fromClause=simpleQuery.fromClause;if(fromClause.joinClauses&&Array.isArray(fromClause.joinClauses)){for(let joinClause of fromClause.joinClauses)if(joinClause.source?.datasource){let realName=this.extractRealTableName(joinClause.source,aliasOrName);if(realName)return realName}}}}catch(error){console.warn("Error resolving real table name:",error)}return aliasOrName}extractRealTableName(source,aliasOrName){try{let datasource=source.datasource;if(!datasource)return;let alias=source.alias||source.aliasExpression?.table?.name,realTableName=datasource.table?.name;if(alias===aliasOrName&&realTableName||!alias&&realTableName===aliasOrName)return realTableName}catch{}}collectParameters(query){let items=[];try{let parameterNames=ParameterDetector.extractParameterNames(query);for(let paramName of parameterNames)items.push(new FilterableItem(paramName,"parameter"))}catch(error){console.warn("Failed to collect parameters:",error)}return items}removeDuplicates(items){let seen=new Set,result=[];for(let item of items){let key=`${item.type}:${item.name}:${item.tableName||"none"}`;seen.has(key)||(seen.add(key),result.push(item))}return result.sort((a,b)=>{if(a.type!==b.type)return a.type==="column"?-1:1;if(a.type==="column"){let tableA=a.tableName||"",tableB=b.tableName||"";if(tableA!==tableB)return tableA.localeCompare(tableB)}return a.name.localeCompare(b.name)})}};var SqlParamInjector=class{constructor(optionsOrResolver,options){typeof optionsOrResolver=="function"?(this.tableColumnResolver=optionsOrResolver,this.options=options||{}):(this.tableColumnResolver=void 0,this.options=optionsOrResolver||{})}inject(query,state){typeof query=="string"&&(query=SelectQueryParser.parse(query));let finder=new UpstreamSelectQueryFinder(this.tableColumnResolver,this.options),collector=new SelectableColumnCollector(this.tableColumnResolver,!1,"fullName",{upstream:!0}),normalize=s=>this.options.ignoreCaseAndUnderscore?s.toLowerCase().replace(/_/g,""):s,allowedOps=["min","max","like","ilike","in","any","=","<",">","!=","<>","<=",">=","or","and","column"],stateValues=Object.values(state);if(stateValues.length>0&&stateValues.every(value=>value===void 0)&&!this.options.allowAllUndefined)throw new Error("All parameters are undefined. This would result in fetching all records. Use allowAllUndefined: true option to explicitly allow this behavior.");let qualifiedParams=[],unqualifiedParams=[];for(let[name,stateValue]of Object.entries(state))stateValue!==void 0&&(this.isQualifiedColumnName(name)?qualifiedParams.push([name,stateValue]):unqualifiedParams.push([name,stateValue]));for(let[name,stateValue]of qualifiedParams)this.processStateParameter(name,stateValue,query,finder,collector,normalize,allowedOps,injectOrConditions,injectAndConditions,injectSimpleCondition,injectComplexConditions,validateOperators);let processedQualifiedColumns=new Set;for(let[qualifiedName,_]of qualifiedParams){let parsed=this.parseQualifiedColumnName(qualifiedName);parsed&&processedQualifiedColumns.add(`${parsed.table.toLowerCase()}.${parsed.column.toLowerCase()}`)}for(let[name,stateValue]of unqualifiedParams)this.processUnqualifiedParameter(name,stateValue,query,finder,collector,normalize,allowedOps,injectOrConditions,injectAndConditions,injectSimpleCondition,injectComplexConditions,validateOperators,processedQualifiedColumns);function injectAndConditions(q,baseName,andConditions,normalize2,availableColumns){for(let i=0;i<andConditions.length;i++){let andCondition=andConditions[i],columnName=andCondition.column||baseName,entry=availableColumns.find(item=>normalize2(item.name)===normalize2(columnName));if(!entry)throw new Error(`Column '${columnName}' not found in query for AND condition`);let columnRef=entry.value;if("="in andCondition&&andCondition["="]!==void 0){let paramName=`${baseName}_and_${i}_eq`,paramExpr=new ParameterExpression(paramName,andCondition["="]);q.appendWhere(new BinaryExpression(columnRef,"=",paramExpr))}if("min"in andCondition&&andCondition.min!==void 0){let paramName=`${baseName}_and_${i}_min`,paramExpr=new ParameterExpression(paramName,andCondition.min);q.appendWhere(new BinaryExpression(columnRef,">=",paramExpr))}if("max"in andCondition&&andCondition.max!==void 0){let paramName=`${baseName}_and_${i}_max`,paramExpr=new ParameterExpression(paramName,andCondition.max);q.appendWhere(new BinaryExpression(columnRef,"<=",paramExpr))}if("like"in andCondition&&andCondition.like!==void 0){let paramName=`${baseName}_and_${i}_like`,paramExpr=new ParameterExpression(paramName,andCondition.like);q.appendWhere(new BinaryExpression(columnRef,"like",paramExpr))}if("ilike"in andCondition&&andCondition.ilike!==void 0){let paramName=`${baseName}_and_${i}_ilike`,paramExpr=new ParameterExpression(paramName,andCondition.ilike);q.appendWhere(new BinaryExpression(columnRef,"ilike",paramExpr))}if("in"in andCondition&&andCondition.in!==void 0){let prms=andCondition.in.map((v,j)=>new ParameterExpression(`${baseName}_and_${i}_in_${j}`,v));q.appendWhere(new BinaryExpression(columnRef,"in",new ParenExpression(new ValueList(prms))))}if("any"in andCondition&&andCondition.any!==void 0){let paramName=`${baseName}_and_${i}_any`,paramExpr=new ParameterExpression(paramName,andCondition.any);q.appendWhere(new BinaryExpression(columnRef,"=",new FunctionCall(null,"any",paramExpr,null)))}if("<"in andCondition&&andCondition["<"]!==void 0){let paramName=`${baseName}_and_${i}_lt`,paramExpr=new ParameterExpression(paramName,andCondition["<"]);q.appendWhere(new BinaryExpression(columnRef,"<",paramExpr))}if(">"in andCondition&&andCondition[">"]!==void 0){let paramName=`${baseName}_and_${i}_gt`,paramExpr=new ParameterExpression(paramName,andCondition[">"]);q.appendWhere(new BinaryExpression(columnRef,">",paramExpr))}if("!="in andCondition&&andCondition["!="]!==void 0){let paramName=`${baseName}_and_${i}_neq`,paramExpr=new ParameterExpression(paramName,andCondition["!="]);q.appendWhere(new BinaryExpression(columnRef,"!=",paramExpr))}if("<>"in andCondition&&andCondition["<>"]!==void 0){let paramName=`${baseName}_and_${i}_ne`,paramExpr=new ParameterExpression(paramName,andCondition["<>"]);q.appendWhere(new BinaryExpression(columnRef,"<>",paramExpr))}if("<="in andCondition&&andCondition["<="]!==void 0){let paramName=`${baseName}_and_${i}_le`,paramExpr=new ParameterExpression(paramName,andCondition["<="]);q.appendWhere(new BinaryExpression(columnRef,"<=",paramExpr))}if(">="in andCondition&&andCondition[">="]!==void 0){let paramName=`${baseName}_and_${i}_ge`,paramExpr=new ParameterExpression(paramName,andCondition[">="]);q.appendWhere(new BinaryExpression(columnRef,">=",paramExpr))}}}function injectOrConditions(q,baseName,orConditions,normalize2,availableColumns){let orExpressions=[];for(let i=0;i<orConditions.length;i++){let orCondition=orConditions[i],columnName=orCondition.column||baseName,entry=availableColumns.find(item=>normalize2(item.name)===normalize2(columnName));if(!entry)throw new Error(`Column '${columnName}' not found in query for OR condition`);let columnRef=entry.value,branchConditions=[];if("="in orCondition&&orCondition["="]!==void 0){let paramName=`${baseName}_or_${i}_eq`,paramExpr=new ParameterExpression(paramName,orCondition["="]);branchConditions.push(new BinaryExpression(columnRef,"=",paramExpr))}if("min"in orCondition&&orCondition.min!==void 0){let paramName=`${baseName}_or_${i}_min`,paramExpr=new ParameterExpression(paramName,orCondition.min);branchConditions.push(new BinaryExpression(columnRef,">=",paramExpr))}if("max"in orCondition&&orCondition.max!==void 0){let paramName=`${baseName}_or_${i}_max`,paramExpr=new ParameterExpression(paramName,orCondition.max);branchConditions.push(new BinaryExpression(columnRef,"<=",paramExpr))}if("like"in orCondition&&orCondition.like!==void 0){let paramName=`${baseName}_or_${i}_like`,paramExpr=new ParameterExpression(paramName,orCondition.like);branchConditions.push(new BinaryExpression(columnRef,"like",paramExpr))}if("ilike"in orCondition&&orCondition.ilike!==void 0){let paramName=`${baseName}_or_${i}_ilike`,paramExpr=new ParameterExpression(paramName,orCondition.ilike);branchConditions.push(new BinaryExpression(columnRef,"ilike",paramExpr))}if("in"in orCondition&&orCondition.in!==void 0){let prms=orCondition.in.map((v,j)=>new ParameterExpression(`${baseName}_or_${i}_in_${j}`,v));branchConditions.push(new BinaryExpression(columnRef,"in",new ParenExpression(new ValueList(prms))))}if("any"in orCondition&&orCondition.any!==void 0){let paramName=`${baseName}_or_${i}_any`,paramExpr=new ParameterExpression(paramName,orCondition.any);branchConditions.push(new BinaryExpression(columnRef,"=",new FunctionCall(null,"any",paramExpr,null)))}if("<"in orCondition&&orCondition["<"]!==void 0){let paramName=`${baseName}_or_${i}_lt`,paramExpr=new ParameterExpression(paramName,orCondition["<"]);branchConditions.push(new BinaryExpression(columnRef,"<",paramExpr))}if(">"in orCondition&&orCondition[">"]!==void 0){let paramName=`${baseName}_or_${i}_gt`,paramExpr=new ParameterExpression(paramName,orCondition[">"]);branchConditions.push(new BinaryExpression(columnRef,">",paramExpr))}if("!="in orCondition&&orCondition["!="]!==void 0){let paramName=`${baseName}_or_${i}_neq`,paramExpr=new ParameterExpression(paramName,orCondition["!="]);branchConditions.push(new BinaryExpression(columnRef,"!=",paramExpr))}if("<>"in orCondition&&orCondition["<>"]!==void 0){let paramName=`${baseName}_or_${i}_ne`,paramExpr=new ParameterExpression(paramName,orCondition["<>"]);branchConditions.push(new BinaryExpression(columnRef,"<>",paramExpr))}if("<="in orCondition&&orCondition["<="]!==void 0){let paramName=`${baseName}_or_${i}_le`,paramExpr=new ParameterExpression(paramName,orCondition["<="]);branchConditions.push(new BinaryExpression(columnRef,"<=",paramExpr))}if(">="in orCondition&&orCondition[">="]!==void 0){let paramName=`${baseName}_or_${i}_ge`,paramExpr=new ParameterExpression(paramName,orCondition[">="]);branchConditions.push(new BinaryExpression(columnRef,">=",paramExpr))}if(branchConditions.length>0){let branchExpr=branchConditions[0];for(let j=1;j<branchConditions.length;j++)branchExpr=new BinaryExpression(branchExpr,"and",branchConditions[j]);branchConditions.length>1?orExpressions.push(new ParenExpression(branchExpr)):orExpressions.push(branchExpr)}}if(orExpressions.length>0){let finalOrExpr=orExpressions[0];for(let i=1;i<orExpressions.length;i++)finalOrExpr=new BinaryExpression(finalOrExpr,"or",orExpressions[i]);q.appendWhere(new ParenExpression(finalOrExpr))}}function validateOperators(stateValue,allowedOps2,name){Object.keys(stateValue).forEach(op=>{if(!allowedOps2.includes(op))throw new Error(`Unsupported operator '${op}' for state key '${name}'`)})}function injectSimpleCondition(q,columnRef,name,stateValue){let paramExpr=new ParameterExpression(name,stateValue);q.appendWhere(new BinaryExpression(columnRef,"=",paramExpr))}function injectComplexConditions(q,columnRef,name,stateValue){let conditions=[];if("="in stateValue){let paramEq=new ParameterExpression(name,stateValue["="]);conditions.push(new BinaryExpression(columnRef,"=",paramEq))}if("min"in stateValue){let paramMin=new ParameterExpression(name+"_min",stateValue.min);conditions.push(new BinaryExpression(columnRef,">=",paramMin))}if("max"in stateValue){let paramMax=new ParameterExpression(name+"_max",stateValue.max);conditions.push(new BinaryExpression(columnRef,"<=",paramMax))}if("like"in stateValue){let paramLike=new ParameterExpression(name+"_like",stateValue.like);conditions.push(new BinaryExpression(columnRef,"like",paramLike))}if("ilike"in stateValue){let paramIlike=new ParameterExpression(name+"_ilike",stateValue.ilike);conditions.push(new BinaryExpression(columnRef,"ilike",paramIlike))}if("in"in stateValue){let prms=stateValue.in.map((v,i)=>new ParameterExpression(`${name}_in_${i}`,v));conditions.push(new BinaryExpression(columnRef,"in",new ParenExpression(new ValueList(prms))))}if("any"in stateValue){let paramAny=new ParameterExpression(name+"_any",stateValue.any);conditions.push(new BinaryExpression(columnRef,"=",new FunctionCall(null,"any",paramAny,null)))}if("<"in stateValue){let paramLT=new ParameterExpression(name+"_lt",stateValue["<"]);conditions.push(new BinaryExpression(columnRef,"<",paramLT))}if(">"in stateValue){let paramGT=new ParameterExpression(name+"_gt",stateValue[">"]);conditions.push(new BinaryExpression(columnRef,">",paramGT))}if("!="in stateValue){let paramNEQ=new ParameterExpression(name+"_neq",stateValue["!="]);conditions.push(new BinaryExpression(columnRef,"!=",paramNEQ))}if("<>"in stateValue){let paramNE=new ParameterExpression(name+"_ne",stateValue["<>"]);conditions.push(new BinaryExpression(columnRef,"<>",paramNE))}if("<="in stateValue){let paramLE=new ParameterExpression(name+"_le",stateValue["<="]);conditions.push(new BinaryExpression(columnRef,"<=",paramLE))}if(">="in stateValue){let paramGE=new ParameterExpression(name+"_ge",stateValue[">="]);conditions.push(new BinaryExpression(columnRef,">=",paramGE))}if(conditions.length===1)q.appendWhere(conditions[0]);else if(conditions.length>1){let combinedExpr=conditions[0];for(let i=1;i<conditions.length;i++)combinedExpr=new BinaryExpression(combinedExpr,"and",conditions[i]);q.appendWhere(new ParenExpression(combinedExpr))}}return query}isOrCondition(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&"or"in value}isAndCondition(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&"and"in value}isExplicitColumnMapping(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&"column"in value&&!("or"in value)}isValidatableObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&Object.getPrototypeOf(value)===Object.prototype}parseQualifiedColumnName(qualifiedName){let parts=qualifiedName.split(".");return parts.length===2&&parts[0].trim()&&parts[1].trim()?{table:parts[0].trim(),column:parts[1].trim()}:null}isQualifiedColumnName(name){return name.includes(".")&&this.parseQualifiedColumnName(name)!==null}sanitizeParameterName(name){return name.replace(/\./g,"_")}hasColumnMapping(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&"column"in value}isSimpleValue(value){return value===null||typeof value!="object"||Array.isArray(value)||value instanceof Date}processStateParameter(name,stateValue,query,finder,collector,normalize,allowedOps,injectOrConditions,injectAndConditions,injectSimpleCondition,injectComplexConditions,validateOperators){if(this.isOrCondition(stateValue)){let orConditions=stateValue.or;if(orConditions&&orConditions.length>0){let targetQuery=this.findTargetQueryForLogicalCondition(finder,query,name,orConditions),allColumns=this.getAllAvailableColumns(targetQuery,collector);injectOrConditions(targetQuery,name,orConditions,normalize,allColumns);return}}if(this.isAndCondition(stateValue)){let andConditions=stateValue.and;if(andConditions&&andConditions.length>0){let targetQuery=this.findTargetQueryForLogicalCondition(finder,query,name,andConditions),allColumns=this.getAllAvailableColumns(targetQuery,collector);injectAndConditions(targetQuery,name,andConditions,normalize,allColumns);return}}if(this.isExplicitColumnMapping(stateValue)){let explicitColumnName=stateValue.column;if(explicitColumnName){let queries=finder.find(query,explicitColumnName);if(queries.length===0)throw new Error(`Explicit column '${explicitColumnName}' not found in query`);for(let q of queries){let entry=this.getAllAvailableColumns(q,collector).find(item=>normalize(item.name)===normalize(explicitColumnName));if(!entry)throw new Error(`Explicit column '${explicitColumnName}' not found in query`);this.isValidatableObject(stateValue)&&validateOperators(stateValue,allowedOps,name),injectComplexConditions(q,entry.value,name,stateValue)}return}}this.processRegularColumnCondition(name,stateValue,query,finder,collector,normalize,allowedOps,injectSimpleCondition,injectComplexConditions,validateOperators)}processUnqualifiedParameter(name,stateValue,query,finder,collector,normalize,allowedOps,injectOrConditions,injectAndConditions,injectSimpleCondition,injectComplexConditions,validateOperators,processedQualifiedColumns){if(this.isOrCondition(stateValue)){let orConditions=stateValue.or;if(orConditions&&orConditions.length>0){let targetQuery=this.findTargetQueryForLogicalCondition(finder,query,name,orConditions),allColumns=this.getAllAvailableColumns(targetQuery,collector);injectOrConditions(targetQuery,name,orConditions,normalize,allColumns);return}}if(this.isAndCondition(stateValue)){let andConditions=stateValue.and;if(andConditions&&andConditions.length>0){let targetQuery=this.findTargetQueryForLogicalCondition(finder,query,name,andConditions),allColumns=this.getAllAvailableColumns(targetQuery,collector);injectAndConditions(targetQuery,name,andConditions,normalize,allColumns);return}}if(this.isExplicitColumnMapping(stateValue)){let explicitColumnName=stateValue.column;if(explicitColumnName){let queries2=finder.find(query,explicitColumnName);if(queries2.length===0)throw new Error(`Explicit column '${explicitColumnName}' not found in query`);for(let q of queries2){let entry=this.getAllAvailableColumns(q,collector).find(item=>normalize(item.name)===normalize(explicitColumnName));if(!entry)throw new Error(`Explicit column '${explicitColumnName}' not found in query`);this.isValidatableObject(stateValue)&&validateOperators(stateValue,allowedOps,name),injectComplexConditions(q,entry.value,name,stateValue)}return}}let queries=finder.find(query,name);if(queries.length===0){if(this.options.ignoreNonExistentColumns)return;throw new Error(`Column '${name}' not found in query`)}for(let q of queries){let allColumns=this.getAllAvailableColumns(q,collector),tableMapping=this.buildTableMapping(q),matchingColumns=allColumns.filter(item=>normalize(item.name)===normalize(name));for(let entry of matchingColumns){let skipColumn=!1;if(entry.value&&typeof entry.value.getNamespace=="function"){let namespace=entry.value.getNamespace();if(namespace){let realTableName=tableMapping.aliasToRealTable.get(namespace.toLowerCase());if(realTableName){let qualifiedKey=`${realTableName.toLowerCase()}.${name.toLowerCase()}`;processedQualifiedColumns.has(qualifiedKey)&&(skipColumn=!0)}}}if(skipColumn)continue;let columnRef=entry.value;this.isValidatableObject(stateValue)&&validateOperators(stateValue,allowedOps,name);let targetColumn=columnRef;if(this.hasColumnMapping(stateValue)){let explicitColumnName=stateValue.column;if(explicitColumnName){let explicitEntry=allColumns.find(item=>normalize(item.name)===normalize(explicitColumnName));explicitEntry&&(targetColumn=explicitEntry.value)}}this.isSimpleValue(stateValue)?injectSimpleCondition(q,targetColumn,name,stateValue):injectComplexConditions(q,targetColumn,name,stateValue)}}}processRegularColumnCondition(name,stateValue,query,finder,collector,normalize,allowedOps,injectSimpleCondition,injectComplexConditions,validateOperators){let searchColumnName=name,targetTableName;if(this.isQualifiedColumnName(name)){let parsed=this.parseQualifiedColumnName(name);parsed&&(searchColumnName=parsed.column,targetTableName=parsed.table)}let queries=finder.find(query,searchColumnName);if(queries.length===0){if(this.options.ignoreNonExistentColumns)return;throw new Error(`Column '${searchColumnName}' not found in query`)}for(let q of queries){let allColumns=this.getAllAvailableColumns(q,collector),entry;if(targetTableName){let tableMapping=this.buildTableMapping(q);if(entry=allColumns.find(item=>{if(!(normalize(item.name)===normalize(searchColumnName)))return!1;if(item.value&&typeof item.value.getNamespace=="function"){let namespace=item.value.getNamespace();if(namespace){let normalizedNamespace=normalize(namespace),normalizedTargetTable=normalize(targetTableName),realTableName=tableMapping.aliasToRealTable.get(normalizedNamespace);if(realTableName&&normalize(realTableName)===normalizedTargetTable)return!0}}return!1}),!entry){if(this.options.ignoreNonExistentColumns)continue;let tableMapping2=this.buildTableMapping(q),hasRealTable=Array.from(tableMapping2.realTableToAlias.keys()).some(realTable=>normalize(realTable)===normalize(targetTableName)),hasAliasTable=Array.from(tableMapping2.aliasToRealTable.keys()).some(alias=>normalize(alias)===normalize(targetTableName));throw!hasRealTable&&!hasAliasTable?new Error(`Column '${name}' (qualified as ${name}) not found in query`):hasAliasTable&&!hasRealTable?new Error(`Column '${name}' not found. Only real table names are allowed in qualified column references (e.g., 'users.name'), not aliases (e.g., 'u.name').`):new Error(`Column '${name}' (qualified as ${name}) not found in query`)}}else if(entry=allColumns.find(item=>normalize(item.name)===normalize(searchColumnName)),!entry)throw new Error(`Column '${searchColumnName}' not found in query`);let columnRef=entry.value;this.isValidatableObject(stateValue)&&validateOperators(stateValue,allowedOps,name);let targetColumn=columnRef;if(this.hasColumnMapping(stateValue)){let explicitColumnName=stateValue.column;if(explicitColumnName){let explicitEntry=allColumns.find(item=>normalize(item.name)===normalize(explicitColumnName));explicitEntry&&(targetColumn=explicitEntry.value)}}let parameterName=this.sanitizeParameterName(name);this.isSimpleValue(stateValue)?injectSimpleCondition(q,targetColumn,parameterName,stateValue):injectComplexConditions(q,targetColumn,parameterName,stateValue)}}findTargetQueryForLogicalCondition(finder,query,baseName,conditions){let referencedColumns=conditions.map(cond=>cond.column||baseName).filter((col,index,arr)=>arr.indexOf(col)===index);for(let colName of referencedColumns){let queries=finder.find(query,colName);if(queries.length>0)return queries[0]}let conditionType=conditions===conditions.or?"OR":"AND";throw new Error(`None of the ${conditionType} condition columns [${referencedColumns.join(", ")}] found in query`)}getAllAvailableColumns(query,collector){let columns=collector.collect(query),cteColumns=this.collectCTEColumns(query);return[...columns,...cteColumns]}collectCTEColumns(query){let cteColumns=[];if(query.withClause)for(let cte of query.withClause.tables)try{let columns=this.collectColumnsFromSelectQuery(cte.query);cteColumns.push(...columns)}catch(error){console.warn(`Failed to collect columns from CTE '${cte.getSourceAliasName()}':`,error)}return cteColumns}collectColumnsFromSelectQuery(query){return query instanceof SimpleSelectQuery?new SelectableColumnCollector(this.tableColumnResolver,!1,"fullName",{upstream:!0}).collect(query):query instanceof BinarySelectQuery?this.collectColumnsFromSelectQuery(query.left):[]}buildTableMapping(query){let aliasToRealTable=new Map,realTableToAlias=new Map;try{if(query.fromClause&&(this.processSourceForMapping(query.fromClause.source,aliasToRealTable,realTableToAlias),query.fromClause.joins))for(let join of query.fromClause.joins)this.processSourceForMapping(join.source,aliasToRealTable,realTableToAlias);if(query.withClause)for(let cte of query.withClause.tables){let cteAlias=cte.getSourceAliasName();cteAlias&&(aliasToRealTable.set(cteAlias.toLowerCase(),cteAlias),realTableToAlias.set(cteAlias.toLowerCase(),cteAlias))}}catch(error){console.warn("Failed to build table mapping:",error)}return{aliasToRealTable,realTableToAlias}}processSourceForMapping(source,aliasToRealTable,realTableToAlias){try{if(source.datasource instanceof TableSource){let realTableName=source.datasource.getSourceName(),aliasName=source.aliasExpression?.table?.name||realTableName;realTableName&&aliasName&&(aliasToRealTable.set(aliasName.toLowerCase(),realTableName),realTableToAlias.set(realTableName.toLowerCase(),aliasName),aliasName===realTableName&&aliasToRealTable.set(realTableName.toLowerCase(),realTableName))}}catch(error){console.warn("Failed to process source for mapping:",error)}}};var SqlSortInjector=class{constructor(tableColumnResolver){this.tableColumnResolver=tableColumnResolver}static removeOrderBy(query){if(typeof query=="string"&&(query=SelectQueryParser.parse(query)),!(query instanceof SimpleSelectQuery))throw new Error("Complex queries are not supported for ORDER BY removal");return new SimpleSelectQuery({withClause:query.withClause,selectClause:query.selectClause,fromClause:query.fromClause,whereClause:query.whereClause,groupByClause:query.groupByClause,havingClause:query.havingClause,orderByClause:null,windowClause:query.windowClause,limitClause:query.limitClause,offsetClause:query.offsetClause,fetchClause:query.fetchClause,forClause:query.forClause})}inject(query,sortConditions){if(typeof query=="string"&&(query=SelectQueryParser.parse(query)),!(query instanceof SimpleSelectQuery))throw new Error("Complex queries are not supported for sorting");let availableColumns=new SelectableColumnCollector(this.tableColumnResolver,!1,"fullName",{upstream:!0}).collect(query);for(let columnName of Object.keys(sortConditions))if(!availableColumns.find(item=>item.name===columnName))throw new Error(`Column or alias '${columnName}' not found in current query`);let newOrderByItems=[];for(let[columnName,condition]of Object.entries(sortConditions)){let columnEntry=availableColumns.find(item=>item.name===columnName);if(!columnEntry)continue;let columnRef=columnEntry.value;this.validateSortCondition(columnName,condition);let sortDirection;condition.desc?sortDirection="desc":sortDirection="asc";let nullsPosition=null;condition.nullsFirst?nullsPosition="first":condition.nullsLast&&(nullsPosition="last");let orderByItem=new OrderByItem(columnRef,sortDirection,nullsPosition);newOrderByItems.push(orderByItem)}let finalOrderByItems=[];query.orderByClause?finalOrderByItems=[...query.orderByClause.order,...newOrderByItems]:finalOrderByItems=newOrderByItems;let newOrderByClause=finalOrderByItems.length>0?new OrderByClause(finalOrderByItems):null;return new SimpleSelectQuery({withClause:query.withClause,selectClause:query.selectClause,fromClause:query.fromClause,whereClause:query.whereClause,groupByClause:query.groupByClause,havingClause:query.havingClause,orderByClause:newOrderByClause,windowClause:query.windowClause,limitClause:query.limitClause,offsetClause:query.offsetClause,fetchClause:query.fetchClause,forClause:query.forClause})}validateSortCondition(columnName,condition){if(condition.asc&&condition.desc)throw new Error(`Conflicting sort directions for column '${columnName}': both asc and desc specified`);if(condition.nullsFirst&&condition.nullsLast)throw new Error(`Conflicting nulls positions for column '${columnName}': both nullsFirst and nullsLast specified`);if(!condition.asc&&!condition.desc&&!condition.nullsFirst&&!condition.nullsLast)throw new Error(`Empty sort condition for column '${columnName}': at least one sort option must be specified`)}};var SqlPaginationInjector=class{inject(query,pagination){if(this.validatePaginationOptions(pagination),typeof query=="string"&&(query=SelectQueryParser.parse(query)),!(query instanceof SimpleSelectQuery))throw new Error("Complex queries are not supported for pagination");if(query.limitClause||query.offsetClause)throw new Error("Query already contains LIMIT or OFFSET clause. Use removePagination() first if you want to override existing pagination.");let offset=(pagination.page-1)*pagination.pageSize,limitClause=new LimitClause(new ParameterExpression("paging_limit",pagination.pageSize)),offsetClause=new OffsetClause(new ParameterExpression("paging_offset",offset));return new SimpleSelectQuery({withClause:query.withClause,selectClause:query.selectClause,fromClause:query.fromClause,whereClause:query.whereClause,groupByClause:query.groupByClause,havingClause:query.havingClause,orderByClause:query.orderByClause,windowClause:query.windowClause,limitClause,offsetClause,fetchClause:query.fetchClause,forClause:query.forClause})}static removePagination(query){if(typeof query=="string"&&(query=SelectQueryParser.parse(query)),!(query instanceof SimpleSelectQuery))throw new Error("Complex queries are not supported for pagination removal");return new SimpleSelectQuery({withClause:query.withClause,selectClause:query.selectClause,fromClause:query.fromClause,whereClause:query.whereClause,groupByClause:query.groupByClause,havingClause:query.havingClause,orderByClause:query.orderByClause,windowClause:query.windowClause,limitClause:null,offsetClause:null,fetchClause:query.fetchClause,forClause:query.forClause})}validatePaginationOptions(pagination){if(!pagination)throw new Error("Pagination options are required");if(typeof pagination.page!="number"||pagination.page<1)throw new Error("Page number must be a positive integer (1 or greater)");if(typeof pagination.pageSize!="number"||pagination.pageSize<1)throw new Error("Page size must be a positive integer (1 or greater)");if(pagination.pageSize>1e3)throw new Error("Page size cannot exceed 1000 items")}};var SqlParameterBinder=class{constructor(options={}){this.options={requireAllParameters:!0,...options}}bind(query,parameterValues){let modifiedQuery=query,existingParams=ParameterDetector.extractParameterNames(modifiedQuery);if(this.options.requireAllParameters){let missingParams=existingParams.filter(paramName=>!(paramName in parameterValues)||parameterValues[paramName]===void 0);if(missingParams.length>0)throw new Error(`Missing values for required parameters: ${missingParams.join(", ")}`)}for(let[paramName,value]of Object.entries(parameterValues))if(existingParams.includes(paramName))try{ParameterHelper.set(modifiedQuery,paramName,value)}catch(error){throw new Error(`Failed to bind parameter '${paramName}': ${error instanceof Error?error.message:"Unknown error"}`)}return modifiedQuery}bindToSimpleQuery(query,parameterValues){return this.bind(query,parameterValues)}};var DynamicQueryBuilder=class{constructor(tableColumnResolver){this.tableColumnResolver=tableColumnResolver}buildQuery(sqlContent,options={}){let parsedQuery;try{parsedQuery=SelectQueryParser.parse(sqlContent)}catch(error){throw new Error(`Failed to parse SQL: ${error instanceof Error?error.message:"Unknown error"}`)}let modifiedQuery=parsedQuery;if(options.filter&&Object.keys(options.filter).length>0){let{hardcodedParams,dynamicFilters}=ParameterDetector.separateFilters(modifiedQuery,options.filter);if(Object.keys(hardcodedParams).length>0&&(modifiedQuery=new SqlParameterBinder({requireAllParameters:!1}).bind(modifiedQuery,hardcodedParams)),Object.keys(dynamicFilters).length>0){let paramInjector=new SqlParamInjector(this.tableColumnResolver),simpleQuery=QueryBuilder.buildSimpleQuery(modifiedQuery);modifiedQuery=paramInjector.inject(simpleQuery,dynamicFilters)}}if(options.sort&&Object.keys(options.sort).length>0){let sortInjector=new SqlSortInjector(this.tableColumnResolver),simpleQuery=QueryBuilder.buildSimpleQuery(modifiedQuery);modifiedQuery=sortInjector.inject(simpleQuery,options.sort)}if(options.paging){let{page=1,pageSize}=options.paging;if(pageSize!==void 0){let paginationInjector=new SqlPaginationInjector,paginationOptions={page,pageSize},simpleQuery=QueryBuilder.buildSimpleQuery(modifiedQuery);modifiedQuery=paginationInjector.inject(simpleQuery,paginationOptions)}}if(options.serialize&&typeof options.serialize=="object"){let jsonBuilder=new PostgresJsonQueryBuilder,simpleQuery=QueryBuilder.buildSimpleQuery(modifiedQuery);modifiedQuery=jsonBuilder.buildJsonQuery(simpleQuery,options.serialize)}return modifiedQuery}buildFilteredQuery(sqlContent,filter){return this.buildQuery(sqlContent,{filter})}buildSortedQuery(sqlContent,sort){return this.buildQuery(sqlContent,{sort})}buildPaginatedQuery(sqlContent,paging){return this.buildQuery(sqlContent,{paging})}buildSerializedQuery(sqlContent,serialize){return this.buildQuery(sqlContent,{serialize})}validateSql(sqlContent){try{return SelectQueryParser.parse(sqlContent),!0}catch(error){throw new Error(`Invalid SQL: ${error instanceof Error?error.message:"Unknown error"}`)}}};function convertModelDrivenMapping(modelMapping){let protectedStringFields=[],entityIdCounter=0,propertyNameCounters={},generateEntityId=()=>`entity_${++entityIdCounter}`,generateUniquePropertyName=baseName=>(propertyNameCounters[baseName]||(propertyNameCounters[baseName]=0),propertyNameCounters[baseName]++,propertyNameCounters[baseName]===1?baseName:`${baseName}_${propertyNameCounters[baseName]}`),processStructure=(structure,parentId=null)=>{let columns={},nestedEntities=[];for(let[fieldName,config]of Object.entries(structure))if(typeof config=="string")columns[fieldName]=config;else if("column"in config&&typeof config.column=="string"&&!("type"in config&&(config.type==="object"||config.type==="array"))){let fieldConfig=config;typeof fieldConfig=="object"&&"column"in fieldConfig&&(columns[fieldName]=fieldConfig.column,fieldConfig.type==="string"&&protectedStringFields.push(fieldConfig.column))}else if("from"in config&&typeof config.from=="string"&&!("type"in config&&(config.type==="object"||config.type==="array"))){let fieldConfig=config;typeof fieldConfig=="object"&&"from"in fieldConfig&&(columns[fieldName]=fieldConfig.from,fieldConfig.type==="string"&&protectedStringFields.push(fieldConfig.from))}else if("type"in config&&(config.type==="object"||config.type==="array")){let nestedStructure=config,uniquePropertyName=generateUniquePropertyName(fieldName),entityId=generateEntityId(),processedNested=processStructure(nestedStructure.structure,entityId);nestedEntities.push({id:entityId,name:fieldName.charAt(0).toUpperCase()+fieldName.slice(1),parentId:parentId||"root",propertyName:uniquePropertyName,originalPropertyName:fieldName,relationshipType:nestedStructure.type,columns:processedNested.columns}),nestedEntities.push(...processedNested.nestedEntities.map(entity=>({...entity,parentId:entity.parentId==="root"?entityId:entity.parentId})))}return{columns,nestedEntities}},processed=processStructure(modelMapping.structure),jsonMapping={rootName:"root",rootEntity:{id:"root",name:"Root",columns:processed.columns},nestedEntities:processed.nestedEntities};return jsonMapping.typeInfo=modelMapping.typeInfo,{jsonMapping,typeProtection:{protectedStringFields}}}function validateModelDrivenMapping(mapping){let errors=[];return mapping.typeInfo?(mapping.typeInfo.interface||errors.push("typeInfo.interface is required"),mapping.typeInfo.importPath||errors.push("typeInfo.importPath is required")):errors.push("typeInfo is required"),(!mapping.structure||typeof mapping.structure!="object")&&errors.push("structure is required and must be an object"),errors}function convertColumnsToLegacy(columns){let result={};for(let[key,config]of Object.entries(columns))typeof config=="string"?result[key]=config:config&&typeof config=="object"?"column"in config?result[key]=config.column:"from"in config?result[key]=config.from:result[key]=key:result[key]=key;return result}function convertToLegacyJsonMapping(input){if(!input)throw new Error("Input mapping is required");if(input.rootName&&input.rootEntity&&typeof input.rootEntity.columns=="object"&&!input.typeInfo&&!input.typeProtection&&!input.metadata&&Object.values(input.rootEntity.columns).every(col=>typeof col=="string"))return input;if(input.rootName&&input.rootEntity)return{rootName:input.rootName,rootEntity:{id:input.rootEntity.id||"root",name:input.rootEntity.name||input.rootName,columns:convertColumnsToLegacy(input.rootEntity.columns||{})},nestedEntities:(input.nestedEntities||[]).map(entity=>({id:entity.id,name:entity.name,parentId:entity.parentId,propertyName:entity.propertyName,relationshipType:entity.relationshipType,columns:convertColumnsToLegacy(entity.columns||{})})),resultFormat:input.resultFormat,emptyResult:input.emptyResult};throw new Error("Unsupported mapping format")}function toLegacyMapping(enhanced){return{rootName:enhanced.rootName,rootEntity:{id:enhanced.rootEntity.id,name:enhanced.rootEntity.name,columns:convertColumnsToLegacy(enhanced.rootEntity.columns)},nestedEntities:enhanced.nestedEntities.map(entity=>({id:entity.id,name:entity.name,parentId:entity.parentId,propertyName:entity.propertyName,relationshipType:entity.relationshipType,columns:convertColumnsToLegacy(entity.columns)})),resultFormat:enhanced.resultFormat,emptyResult:enhanced.emptyResult}}function extractTypeProtection(enhanced){let protectedStringFields=[],dateFields=[],numberFields=[];if(enhanced.typeProtection)return{protectedStringFields:enhanced.typeProtection.protectedStringFields||[],dateFields:enhanced.typeProtection.dateFields,numberFields:enhanced.typeProtection.numberFields,customTransforms:enhanced.typeProtection.customTransforms};for(let[key,config]of Object.entries(enhanced.rootEntity.columns))if(typeof config=="object"&&config.type){let columnName=config.column;switch(config.type){case"string":protectedStringFields.push(columnName);break;case"date":dateFields.push(columnName);break;case"number":numberFields.push(columnName);break}}for(let entity of enhanced.nestedEntities)for(let[key,config]of Object.entries(entity.columns))if(typeof config=="object"&&config.type){let columnName=config.column;switch(config.type){case"string":protectedStringFields.push(columnName);break;case"date":dateFields.push(columnName);break;case"number":numberFields.push(columnName);break}}return{protectedStringFields,dateFields:dateFields.length>0?dateFields:void 0,numberFields:numberFields.length>0?numberFields:void 0,customTransforms:void 0}}function isValidMappingInput(input){return input!=null&&typeof input=="object"}var EnhancedFormatStrategy=class{detect(input){if(!isValidMappingInput(input))return!1;let candidate=input;if(!candidate||typeof candidate.rootName!="string"||!candidate.rootEntity||!Array.isArray(candidate.nestedEntities))return!1;if(candidate.typeInfo||candidate.typeProtection||candidate.metadata)return!0;let hasEnhancedColumns=columns=>!columns||typeof columns!="object"?!1:Object.values(columns).some(col=>typeof col=="object"&&col!==null&&"column"in col);return hasEnhancedColumns(candidate.rootEntity.columns)?!0:candidate.nestedEntities.some(entity=>entity&&typeof entity=="object"&&hasEnhancedColumns(entity.columns))}convert(input){return{format:"enhanced",mapping:toLegacyMapping(input),typeProtection:extractTypeProtection(input),originalInput:input,metadata:{typeInfo:input.typeInfo,version:input.metadata?.version,description:input.metadata?.description}}}},ModelDrivenFormatStrategy=class{detect(input){if(!isValidMappingInput(input))return!1;let candidate=input;return candidate&&candidate.typeInfo&&candidate.structure&&typeof candidate.typeInfo.interface=="string"}convert(input){let converted=convertModelDrivenMapping(input);return{format:"model-driven",mapping:converted.jsonMapping,typeProtection:converted.typeProtection,originalInput:input,metadata:{typeInfo:input.typeInfo}}}},LegacyFormatStrategy=class{detect(input){if(!isValidMappingInput(input))return!1;let candidate=input;if(!candidate||typeof candidate.rootName!="string"||!candidate.rootEntity||typeof candidate.rootEntity.columns!="object"||candidate.typeInfo||candidate.typeProtection||candidate.metadata)return!1;let hasEnhancedColumns=columns=>!columns||typeof columns!="object"?!1:Object.values(columns).some(col=>typeof col=="object"&&col!==null&&"column"in col);return!(hasEnhancedColumns(candidate.rootEntity.columns)||candidate.nestedEntities&&Array.isArray(candidate.nestedEntities)&&candidate.nestedEntities.some(entity=>entity&&typeof entity=="object"&&hasEnhancedColumns(entity.columns)))}convert(input){return{format:"legacy",mapping:input,typeProtection:{protectedStringFields:[]},originalInput:input}}},JsonMappingConverter=class{constructor(){this.strategies=[new EnhancedFormatStrategy,new ModelDrivenFormatStrategy,new LegacyFormatStrategy]}detectFormat(input){for(let strategy of this.strategies)if(strategy.detect(input))return strategy.convert(input).format;throw new Error("Unsupported JSON mapping format")}convert(input){for(let strategy of this.strategies)if(strategy.detect(input))return strategy.convert(input);throw new Error("Unsupported JSON mapping format: Unable to detect a compatible strategy for the provided input")}toLegacyMapping(input){return this.convert(input).mapping}getTypeProtection(input){return this.convert(input).typeProtection}validate(input){let errors=[];if(!input||typeof input!="object")return errors.push("Input must be an object"),errors;(!("rootName"in input)||!input.rootName)&&errors.push("rootName is required");try{let result=this.convert(input);if(result.mapping.rootName||errors.push("rootName is required"),result.mapping.rootEntity?(result.mapping.rootEntity.id||errors.push("rootEntity.id is required"),result.mapping.rootEntity.columns||errors.push("rootEntity.columns is required")):errors.push("rootEntity is required"),result.mapping.nestedEntities)for(let entity of result.mapping.nestedEntities)entity.id||errors.push(`Nested entity missing id: ${entity.propertyName}`),entity.parentId||errors.push(`Nested entity missing parentId: ${entity.id}`),entity.propertyName||errors.push(`Nested entity missing propertyName: ${entity.id}`)}catch(error){errors.length===0&&errors.push(`Conversion failed: ${error instanceof Error?error.message:String(error)}`)}return errors}upgradeToEnhanced(legacy,typeInfo){return{rootName:legacy.rootName,rootEntity:{id:legacy.rootEntity.id,name:legacy.rootEntity.name,columns:legacy.rootEntity.columns},nestedEntities:legacy.nestedEntities.map(entity=>({id:entity.id,name:entity.name,parentId:entity.parentId,propertyName:entity.propertyName,relationshipType:entity.relationshipType||"object",columns:entity.columns})),resultFormat:legacy.resultFormat,emptyResult:legacy.emptyResult,typeInfo,metadata:{version:"1.0",description:"Upgraded from legacy format"}}}};function detectMappingFormat(input){return input.typeInfo&&input.structure?"model-driven":input.rootName&&input.rootEntity?"unified":(input.columns||input.relationships,"legacy")}function convertLegacyFormat(input){let result={rootName:input.rootName||"root",rootEntity:{id:"root",name:input.rootName||"Root",columns:input.columns||{}},nestedEntities:[]};if(input.relationships&&typeof input.relationships=="object")for(let[propertyName,relationship]of Object.entries(input.relationships)){let rel=relationship;result.nestedEntities.push({id:propertyName,name:propertyName.charAt(0).toUpperCase()+propertyName.slice(1),parentId:"root",propertyName,relationshipType:rel.type==="hasMany"?"array":"object",columns:rel.columns||{}})}return result}function processJsonMapping(input){if(console.warn("\u26A0\uFE0F DEPRECATED: processJsonMapping() is deprecated. Use JsonMappingConverter.convert() instead."),console.warn("Migration guide: https://github.com/mk3008/rawsql-ts/blob/main/docs/migration-guide.md"),(input.columns||input.relationships)&&!input.rootName&&!input.rootEntity)return{format:"legacy",jsonMapping:convertLegacyFormat(input),originalInput:input,metadata:{}};let result=new JsonMappingConverter().convert(input),format=result.format;return result.format==="legacy"&&input.rootName&&input.rootEntity&&(format="unified"),{format,jsonMapping:result.mapping,originalInput:input,metadata:{typeInfo:result.metadata?.typeInfo,typeProtection:result.typeProtection}}}function unifyJsonMapping(input){return console.warn("\u26A0\uFE0F DEPRECATED: unifyJsonMapping() is deprecated. Use JsonMappingConverter.toLegacyMapping() instead."),console.warn("Migration guide: https://github.com/mk3008/rawsql-ts/blob/main/docs/migration-guide.md"),new JsonMappingConverter().toLegacyMapping(input)}function isModelDrivenFormat(input){return detectMappingFormat(input)==="model-driven"}function isUnifiedFormat(input){return detectMappingFormat(input)==="unified"}function isLegacyFormat(input){return detectMappingFormat(input)==="legacy"}var TypeTransformationPostProcessor=class{constructor(config={}){this.config={enableValueBasedDetection:!0,strictDateDetection:!1,...config}}transformResult(result){return result==null?result:Array.isArray(result)?result.map(item=>this.transformSingleObject(item)):this.transformSingleObject(result)}transformSingleObject(obj){if(obj==null||typeof obj!="object")return obj;if(Array.isArray(obj))return obj.map(item=>this.transformSingleObject(item));let transformed={};for(let[key,value]of Object.entries(obj)){if(value==null){transformed[key]=value;continue}let columnTransform=this.config.columnTransformations?.[key];if(columnTransform){transformed[key]=this.applyTransformation(value,columnTransform);continue}if(this.config.enableValueBasedDetection){let detectedTransform=this.detectValueBasedTransformation(value);if(detectedTransform){transformed[key]=this.applyTransformation(value,detectedTransform);continue}}let globalTransform=this.config.globalTransformations&&this.getGlobalTransformationForValue(value);if(globalTransform){transformed[key]=this.applyTransformation(value,globalTransform);continue}if(typeof value=="object"&&!Array.isArray(value)){transformed[key]=this.transformSingleObject(value);continue}if(Array.isArray(value)){transformed[key]=value.map(item=>typeof item=="object"?this.transformSingleObject(item):item);continue}transformed[key]=value}return transformed}detectValueBasedTransformation(value){return typeof value=="string"&&this.isDateString(value)?{sourceType:"TIMESTAMP",targetType:"Date",handleNull:!0,validator:v=>typeof v=="string"&&!isNaN(Date.parse(v))}:typeof value=="number"&&!Number.isSafeInteger(value)?{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:v=>{try{return typeof v=="string"||typeof v=="number"||typeof v=="bigint"||typeof v=="boolean"?(BigInt(v),!0):!1}catch{return!1}}}:typeof value=="string"&&/^\d{16,}$/.test(value)?{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:v=>{try{return typeof v=="string"||typeof v=="number"||typeof v=="bigint"||typeof v=="boolean"?(BigInt(v),!0):!1}catch{return!1}}}:null}getGlobalTransformationForValue(value){return this.config.globalTransformations,null}detectAndGetGlobalTransformation(value){return this.detectValueBasedTransformation(value)}isDateString(value){if(this.config.strictDateDetection){if(!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?$/.test(value))return!1}else if(!/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/.test(value))return!1;let date=new Date(value);return!isNaN(date.getTime())}applyTransformation(value,transformation){if(value==null)return transformation.handleNull!==!1?value:null;if(transformation.validator&&!transformation.validator(value))return console.warn(`TypeTransformationPostProcessor: Value validation failed for ${value}`),value;try{switch(transformation.targetType){case"Date":return new Date(value);case"bigint":if(typeof value=="number"){let integerValue=Math.trunc(value);return BigInt(integerValue.toString())}return BigInt(value);case"string":return value.toString();case"number":return typeof value=="string"?parseFloat(value):Number(value);case"object":return typeof value=="string"?JSON.parse(value):value;case"custom":if(transformation.customTransformer&&this.config.customTransformers?.[transformation.customTransformer])return this.config.customTransformers[transformation.customTransformer](value);break;default:return value}}catch(error){return console.warn(`TypeTransformationPostProcessor: Transformation failed for ${value}:`,error),value}return value}static createDefaultConfig(){return{enableValueBasedDetection:!0,strictDateDetection:!1,globalTransformations:{DATE:{sourceType:"DATE",targetType:"Date",handleNull:!0,validator:value=>typeof value=="string"&&!isNaN(Date.parse(value))},TIMESTAMP:{sourceType:"TIMESTAMP",targetType:"Date",handleNull:!0,validator:value=>typeof value=="string"&&!isNaN(Date.parse(value))},BIGINT:{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:value=>{try{return typeof value=="string"||typeof value=="number"||typeof value=="bigint"||typeof value=="boolean"?(BigInt(value),!0):!1}catch{return!1}}}}}}static createSafeConfig(columnMappings){return{enableValueBasedDetection:!1,strictDateDetection:!0,columnTransformations:columnMappings||{},globalTransformations:{DATE:{sourceType:"DATE",targetType:"Date",handleNull:!0,validator:value=>typeof value=="string"&&!isNaN(Date.parse(value))},TIMESTAMP:{sourceType:"TIMESTAMP",targetType:"Date",handleNull:!0,validator:value=>typeof value=="string"&&!isNaN(Date.parse(value))},BIGINT:{sourceType:"BIGINT",targetType:"bigint",handleNull:!0,validator:value=>{try{return typeof value=="string"||typeof value=="number"||typeof value=="bigint"||typeof value=="boolean"?(BigInt(value),!0):!1}catch{return!1}}}}}}};function transformDatabaseResult(result,config){return new TypeTransformationPostProcessor(config||TypeTransformationPostProcessor.createDefaultConfig()).transformResult(result)}var TypeTransformers={toDate:value=>{if(value==null)return null;let date=new Date(value);return isNaN(date.getTime())?null:date},toBigInt:value=>{if(value==null)return null;try{return BigInt(value)}catch{return null}},toObject:value=>{if(value==null)return null;try{return JSON.parse(value)}catch{return null}}};var BaseDataFlowNode=class{constructor(id,label,type,shape,details){this.id=id;this.label=label;this.type=type;this.shape=shape;this.details=details}},DataSourceNode=class _DataSourceNode extends BaseDataFlowNode{constructor(id,label,type){super(id,label,type,type==="subquery"?"hexagon":"cylinder");this.annotations=new Set}addAnnotation(annotation){this.annotations.add(annotation)}hasAnnotation(annotation){return this.annotations.has(annotation)}getMermaidRepresentation(){return this.shape==="hexagon"?`${this.id}{{${this.label}}}`:`${this.id}[(${this.label})]`}static createTable(tableName){return new _DataSourceNode(`table_${tableName}`,tableName,"table")}static createCTE(cteName){return new _DataSourceNode(`cte_${cteName}`,`CTE:${cteName}`,"cte")}static createSubquery(alias){return new _DataSourceNode(`subquery_${alias}`,`SubQuery:${alias}`,"subquery")}},ProcessNode=class _ProcessNode extends BaseDataFlowNode{constructor(id,operation,context=""){let nodeId=context?`${context}_${operation.toLowerCase().replace(/\s+/g,"_")}`:operation.toLowerCase().replace(/\s+/g,"_");super(nodeId,operation,"process","hexagon")}getMermaidRepresentation(){return`${this.id}{{${this.label}}}`}static createWhere(context){return new _ProcessNode(`${context}_where`,"WHERE",context)}static createGroupBy(context){return new _ProcessNode(`${context}_group_by`,"GROUP BY",context)}static createHaving(context){return new _ProcessNode(`${context}_having`,"HAVING",context)}static createSelect(context){return new _ProcessNode(`${context}_select`,"SELECT",context)}static createOrderBy(context){return new _ProcessNode(`${context}_order_by`,"ORDER BY",context)}static createLimit(context,hasOffset=!1){let label=hasOffset?"LIMIT/OFFSET":"LIMIT";return new _ProcessNode(`${context}_limit`,label,context)}},OperationNode=class _OperationNode extends BaseDataFlowNode{constructor(id,operation,shape="diamond"){super(id,operation,"operation",shape)}getMermaidRepresentation(){switch(this.shape){case"rounded":return`${this.id}(${this.label})`;case"rectangle":return`${this.id}[${this.label}]`;case"hexagon":return`${this.id}{{${this.label}}}`;case"stadium":return`${this.id}([${this.label}])`;case"diamond":default:return`${this.id}{${this.label}}`}}static createJoin(joinId,joinType){let label,normalizedType=joinType.trim().toLowerCase();return normalizedType==="join"?label="INNER JOIN":normalizedType.endsWith(" join")?label=normalizedType.toUpperCase():label=normalizedType.toUpperCase()+" JOIN",new _OperationNode(`join_${joinId}`,label,"rectangle")}static createUnion(unionId,unionType="UNION ALL"){return new _OperationNode(`${unionType.toLowerCase().replace(/\s+/g,"_")}_${unionId}`,unionType.toUpperCase(),"rectangle")}static createSetOperation(operationId,operation){let normalizedOp=operation.toUpperCase(),id=`${normalizedOp.toLowerCase().replace(/\s+/g,"_")}_${operationId}`;return new _OperationNode(id,normalizedOp,"rectangle")}},OutputNode=class extends BaseDataFlowNode{constructor(context="main"){let label=context==="main"?"Final Result":`${context} Result`;super(`${context}_output`,label,"output","stadium")}getMermaidRepresentation(){return`${this.id}([${this.label}])`}};var DataFlowConnection=class _DataFlowConnection{constructor(from,to,label){this.from=from;this.to=to;this.label=label}getMermaidRepresentation(){let arrow=this.label?` -->|${this.label}| `:" --> ";return`${this.from}${arrow}${this.to}`}static create(from,to,label){return new _DataFlowConnection(from,to,label)}static createWithNullability(from,to,isNullable){let label=isNullable?"NULLABLE":"NOT NULL";return new _DataFlowConnection(from,to,label)}},DataFlowEdgeCollection=class{constructor(){this.edges=[];this.connectionSet=new Set}add(edge){let key=`${edge.from}->${edge.to}`;this.connectionSet.has(key)||(this.edges.push(edge),this.connectionSet.add(key))}addConnection(from,to,label){this.add(DataFlowConnection.create(from,to,label))}addJoinConnection(from,to,isNullable){this.add(DataFlowConnection.createWithNullability(from,to,isNullable))}hasConnection(from,to){return this.connectionSet.has(`${from}->${to}`)}getAll(){return[...this.edges]}getMermaidRepresentation(){return this.edges.map(edge=>edge.getMermaidRepresentation()).join(`
70
+ `)}};var DataFlowGraph=class{constructor(){this.nodes=new Map;this.edges=new DataFlowEdgeCollection}addNode(node){this.nodes.set(node.id,node)}addEdge(edge){this.edges.add(edge)}addConnection(from,to,label){this.edges.addConnection(from,to,label)}hasNode(nodeId){return this.nodes.has(nodeId)}hasConnection(from,to){return this.edges.hasConnection(from,to)}getNode(nodeId){return this.nodes.get(nodeId)}getAllNodes(){return Array.from(this.nodes.values())}getAllEdges(){return this.edges.getAll()}generateMermaid(direction="TD",title){let mermaid=`flowchart ${direction}
71
+ `;title&&(mermaid+=` %% ${title}
72
+ `);let nodeLines=Array.from(this.nodes.values()).map(node=>` ${node.getMermaidRepresentation()}`).join(`
73
+ `);nodeLines&&(mermaid+=nodeLines+`
74
+ `),this.nodes.size>0&&this.edges.getAll().length>0&&(mermaid+=`
75
+ `);let edgeRepresentation=this.edges.getMermaidRepresentation();return edgeRepresentation&&(mermaid+=` ${edgeRepresentation}
76
+ `),mermaid}getOrCreateTable(tableName){let nodeId=`table_${tableName}`,node=this.nodes.get(nodeId);return node||(node=DataSourceNode.createTable(tableName),this.addNode(node)),node}getOrCreateCTE(cteName){let nodeId=`cte_${cteName}`,node=this.nodes.get(nodeId);return node||(node=DataSourceNode.createCTE(cteName),this.addNode(node)),node}getOrCreateSubquery(alias){let nodeId=`subquery_${alias}`,node=this.nodes.get(nodeId);return node||(node=DataSourceNode.createSubquery(alias),this.addNode(node)),node}createProcessNode(type,context){let node=new ProcessNode(context,type);return this.addNode(node),node}createJoinNode(joinId,joinType){let node=OperationNode.createJoin(joinId,joinType);return this.addNode(node),node}createSetOperationNode(operationId,operation){let node=OperationNode.createSetOperation(operationId,operation);return this.addNode(node),node}createOutputNode(context="main"){let node=new OutputNode(context);return this.addNode(node),node}};var DataSourceHandler=class{constructor(graph){this.graph=graph}processSource(sourceExpr,cteNames,queryProcessor){if(sourceExpr.datasource instanceof TableSource)return this.processTableSource(sourceExpr.datasource,cteNames);if(sourceExpr.datasource instanceof SubQuerySource)return this.processSubquerySource(sourceExpr,cteNames,queryProcessor);throw new Error("Unsupported source type")}processTableSource(tableSource,cteNames){let tableName=tableSource.getSourceName();return cteNames.has(tableName)?this.graph.getOrCreateCTE(tableName).id:this.graph.getOrCreateTable(tableName).id}processSubquerySource(sourceExpr,cteNames,queryProcessor){let alias=sourceExpr.aliasExpression?.table.name||"subquery",subqueryNode=this.graph.getOrCreateSubquery(alias),subqueryResultId=queryProcessor(sourceExpr.datasource.query,`subquery_${alias}_internal`,cteNames);return subqueryResultId&&!this.graph.hasConnection(subqueryResultId,subqueryNode.id)&&this.graph.addConnection(subqueryResultId,subqueryNode.id),subqueryNode.id}extractTableNodeIds(fromClause,cteNames){let tableNodeIds=[],sourceExpr=fromClause.source;if(sourceExpr.datasource instanceof TableSource){let tableName=sourceExpr.datasource.getSourceName();if(cteNames.has(tableName)){let cteNode=this.graph.getOrCreateCTE(tableName);tableNodeIds.push(cteNode.id)}else{let tableNode=this.graph.getOrCreateTable(tableName);tableNodeIds.push(tableNode.id)}}if(fromClause.joins&&fromClause.joins.length>0)for(let join of fromClause.joins){let joinSourceExpr=join.source;if(joinSourceExpr.datasource instanceof TableSource){let tableName=joinSourceExpr.datasource.getSourceName();if(cteNames.has(tableName)){let cteNode=this.graph.getOrCreateCTE(tableName);tableNodeIds.push(cteNode.id)}else{let tableNode=this.graph.getOrCreateTable(tableName);tableNodeIds.push(tableNode.id)}}}return tableNodeIds}};var JoinHandler=class{constructor(graph,dataSourceHandler){this.graph=graph;this.dataSourceHandler=dataSourceHandler;this.joinIdCounter=0}resetJoinCounter(){this.joinIdCounter=0}getNextJoinId(){return String(++this.joinIdCounter)}processFromClause(fromClause,cteNames,queryProcessor){let mainSourceId=this.dataSourceHandler.processSource(fromClause.source,cteNames,queryProcessor);return fromClause.joins&&fromClause.joins.length>0?this.processJoins(fromClause.joins,mainSourceId,cteNames,queryProcessor):mainSourceId}processJoins(joins,currentNodeId,cteNames,queryProcessor){let resultNodeId=currentNodeId;for(let join of joins){let joinNodeId=this.dataSourceHandler.processSource(join.source,cteNames,queryProcessor),joinOpId=this.getNextJoinId(),joinNode=this.graph.createJoinNode(joinOpId,join.joinType.value),{leftLabel,rightLabel}=this.getJoinNullabilityLabels(join.joinType.value);resultNodeId&&!this.graph.hasConnection(resultNodeId,joinNode.id)&&this.graph.addConnection(resultNodeId,joinNode.id,leftLabel),joinNodeId&&!this.graph.hasConnection(joinNodeId,joinNode.id)&&this.graph.addConnection(joinNodeId,joinNode.id,rightLabel),resultNodeId=joinNode.id}return resultNodeId}getJoinNullabilityLabels(joinType){switch(joinType.toLowerCase()){case"left join":return{leftLabel:"NOT NULL",rightLabel:"NULLABLE"};case"right join":return{leftLabel:"NULLABLE",rightLabel:"NOT NULL"};case"inner join":case"join":return{leftLabel:"NOT NULL",rightLabel:"NOT NULL"};case"full join":case"full outer join":return{leftLabel:"NULLABLE",rightLabel:"NULLABLE"};case"cross join":return{leftLabel:"NOT NULL",rightLabel:"NOT NULL"};default:return{leftLabel:"",rightLabel:""}}}};var ProcessHandler=class{constructor(graph,dataSourceHandler){this.graph=graph;this.dataSourceHandler=dataSourceHandler}processQueryClauses(query,context,currentNodeId,cteNames,queryProcessor){return currentNodeId}};var CTEHandler=class{constructor(graph){this.graph=graph}processCTEs(withClause,cteNames,queryProcessor){for(let i=0;i<withClause.tables.length;i++){let cteName=withClause.tables[i].getSourceAliasName(),cteNode=this.graph.getOrCreateCTE(cteName);cteNames.add(cteName),withClause.recursive&&i===0&&cteNode.addAnnotation("recursive")}for(let i=0;i<withClause.tables.length;i++){let cte=withClause.tables[i],cteName=cte.getSourceAliasName(),cteNode=this.graph.getOrCreateCTE(cteName),cteResultId=queryProcessor(cte.query,`cte_${cteName}`,cteNames);if(cteResultId&&!this.graph.hasConnection(cteResultId,cteNode.id)){let label=withClause.recursive&&i===0?"RECURSIVE":void 0;this.graph.addConnection(cteResultId,cteNode.id,label)}}}detectRecursiveReference(query,cteName){return query.toString().toLowerCase().includes(cteName.toLowerCase())}};var QueryFlowDiagramGenerator=class _QueryFlowDiagramGenerator{constructor(){this.graph=new DataFlowGraph,this.dataSourceHandler=new DataSourceHandler(this.graph),this.joinHandler=new JoinHandler(this.graph,this.dataSourceHandler),this.processHandler=new ProcessHandler(this.graph,this.dataSourceHandler),this.cteHandler=new CTEHandler(this.graph)}generateMermaidFlow(query,options){this.graph=new DataFlowGraph,this.dataSourceHandler=new DataSourceHandler(this.graph),this.joinHandler=new JoinHandler(this.graph,this.dataSourceHandler),this.processHandler=new ProcessHandler(this.graph,this.dataSourceHandler),this.cteHandler=new CTEHandler(this.graph),this.joinHandler.resetJoinCounter();let parsedQuery=typeof query=="string"?SelectQueryParser.parse(query):query,cteNames=new Set;return this.processQuery(parsedQuery,"main",cteNames),this.graph.generateMermaid(options?.direction||"TD",options?.title)}static generate(sql){return new _QueryFlowDiagramGenerator().generateMermaidFlow(sql)}processQuery(query,context,cteNames){if(query instanceof SimpleSelectQuery)return this.processSimpleQuery(query,context,cteNames);if(query instanceof BinarySelectQuery)return this.processBinaryQuery(query,context,cteNames);throw new Error("Unsupported query type")}processSimpleQuery(query,context,cteNames){query.withClause&&this.cteHandler.processCTEs(query.withClause,cteNames,this.processQuery.bind(this));let currentNodeId="";return query.fromClause&&(query.fromClause.joins&&query.fromClause.joins.length>0?currentNodeId=this.joinHandler.processFromClause(query.fromClause,cteNames,this.processQuery.bind(this)):currentNodeId=this.dataSourceHandler.processSource(query.fromClause.source,cteNames,this.processQuery.bind(this))),currentNodeId&&(currentNodeId=this.processHandler.processQueryClauses(query,context,currentNodeId,cteNames,this.processQuery.bind(this))),this.handleOutputNode(currentNodeId,context)}processBinaryQuery(query,context,cteNames){let parts=this.flattenBinaryChain(query,query.operator.value);return parts.length>2?this.processMultiPartOperation(parts,query.operator.value,context,cteNames):this.processSimpleBinaryOperation(query,context,cteNames)}processSimpleBinaryOperation(query,context,cteNames){let leftNodeId=this.processQuery(query.left,`${context}_left`,cteNames),rightNodeId=this.processQuery(query.right,`${context}_right`,cteNames),operationId=context==="main"?"main":context.replace(/^cte_/,""),operationNode=this.graph.createSetOperationNode(operationId,query.operator.value);return leftNodeId&&!this.graph.hasConnection(leftNodeId,operationNode.id)&&this.graph.addConnection(leftNodeId,operationNode.id),rightNodeId&&!this.graph.hasConnection(rightNodeId,operationNode.id)&&this.graph.addConnection(rightNodeId,operationNode.id),operationNode.id}processMultiPartOperation(parts,operator,context,cteNames){let partNodes=[],operationId=context==="main"?"main":context.replace(/^cte_/,""),operationNode=this.graph.createSetOperationNode(operationId,operator);for(let i=0;i<parts.length;i++){let partContext=`${context}_part${i+1}`,partNodeId=this.processQuery(parts[i],partContext,cteNames);partNodes.push(partNodeId)}for(let partNodeId of partNodes)partNodeId&&!this.graph.hasConnection(partNodeId,operationNode.id)&&this.graph.addConnection(partNodeId,operationNode.id);return operationNode.id}handleOutputNode(currentNodeId,context){if(context==="main"){let outputNode=this.graph.createOutputNode(context);return currentNodeId&&this.graph.addConnection(currentNodeId,outputNode.id),outputNode.id}return currentNodeId}flattenBinaryChain(query,operator){let parts=[],collectParts=q=>{q instanceof BinarySelectQuery&&q.operator.value===operator?(collectParts(q.left),collectParts(q.right)):parts.push(q)};return collectParts(query),parts}};var JsonSchemaValidator=class{static validate(jsonMapping,expectedStructure){let extractedStructure=this.extractStructureFromJsonMapping(jsonMapping);return this.compareStructures(extractedStructure,expectedStructure)}static validateStrict(jsonMapping,expectedStructure){let result=this.validate(jsonMapping,expectedStructure);if(!result.isValid){let errorMessage=["JsonMapping validation failed:",...result.errors].join(`
77
+ `);throw new Error(errorMessage)}}static extractStructureFromJsonMapping(jsonMapping){let structure={};return jsonMapping.rootEntity&&jsonMapping.rootEntity.columns&&Object.keys(jsonMapping.rootEntity.columns).forEach(propertyName=>{structure[propertyName]="primitive"}),jsonMapping.nestedEntities&&jsonMapping.nestedEntities.filter(entity=>entity.parentId===jsonMapping.rootEntity.id).forEach(entity=>{entity.propertyName&&entity.columns&&(entity.relationshipType==="object"?structure[entity.propertyName]=this.extractNestedEntityStructure(entity,jsonMapping):entity.relationshipType==="array"&&(structure[entity.propertyName]=[this.extractNestedEntityStructure(entity,jsonMapping)]))}),structure}static extractNestedEntityStructure(entity,jsonMapping){let entityStructure={};return entity.columns&&Object.keys(entity.columns).forEach(propName=>{entityStructure[propName]="primitive"}),jsonMapping.nestedEntities&&jsonMapping.nestedEntities.filter(childEntity=>childEntity.parentId===entity.id).forEach(childEntity=>{childEntity.propertyName&&childEntity.columns&&(childEntity.relationshipType==="object"?entityStructure[childEntity.propertyName]=this.extractNestedEntityStructure(childEntity,jsonMapping):childEntity.relationshipType==="array"&&(entityStructure[childEntity.propertyName]=[this.extractNestedEntityStructure(childEntity,jsonMapping)]))}),entityStructure}static compareStructures(extracted,expected,path=""){let errors=[],missingProperties=[],extraProperties=[];if(extracted==="primitive"&&expected==="primitive")return{isValid:!0,errors:[],missingProperties:[],extraProperties:[]};if(Array.isArray(expected)&&Array.isArray(extracted)){if(expected.length>0&&extracted.length>0){let nestedResult=this.compareStructures(extracted[0],expected[0],`${path}[]`);errors.push(...nestedResult.errors),missingProperties.push(...nestedResult.missingProperties),extraProperties.push(...nestedResult.extraProperties)}return{isValid:errors.length===0,errors,missingProperties,extraProperties}}if(typeof extracted!="object"||typeof expected!="object"||Array.isArray(extracted)||Array.isArray(expected)||extracted===null||expected===null)return{isValid:!0,errors:[],missingProperties:[],extraProperties:[]};let extractedObj=extracted,expectedObj=expected;return Object.keys(expectedObj).forEach(key=>{let currentPath=path?`${path}.${key}`:key;if(!(key in extractedObj)){missingProperties.push(currentPath),errors.push(`Missing property: ${currentPath}`);return}let extractedValue=extractedObj[key],expectedValue=expectedObj[key],nestedResult=this.compareStructures(extractedValue,expectedValue,currentPath);errors.push(...nestedResult.errors),missingProperties.push(...nestedResult.missingProperties),extraProperties.push(...nestedResult.extraProperties)}),Object.keys(extractedObj).forEach(key=>{let currentPath=path?`${path}.${key}`:key;key in expectedObj||extraProperties.push(currentPath)}),{isValid:errors.length===0,errors,missingProperties,extraProperties}}static validateAgainstSample(jsonMapping,sampleObject){let expectedStructure=this.extractStructureFromSample(sampleObject);return this.validate(jsonMapping,expectedStructure)}static validateAgainstSampleStrict(jsonMapping,sampleObject){let result=this.validateAgainstSample(jsonMapping,sampleObject);if(!result.isValid){let errorMessage=["JsonMapping validation against sample object failed:",...result.errors].join(`
78
+ `);throw new Error(errorMessage)}}static extractStructureFromSample(sampleObject){if(sampleObject==null)return"primitive";if(Array.isArray(sampleObject))return sampleObject.length===0?[]:[this.extractStructureFromSample(sampleObject[0])];if(typeof sampleObject=="object"){let structure={};return Object.keys(sampleObject).forEach(key=>{structure[key]=this.extractStructureFromSample(sampleObject[key])}),structure}return"primitive"}};var SchemaManager=class{constructor(schemas){this.schemas=schemas,this.validateSchemas()}validateSchemas(){let tableNames=Object.keys(this.schemas),errors=[];if(Object.entries(this.schemas).forEach(([tableName,table])=>{Object.entries(table.columns).filter(([_,col])=>col.isPrimaryKey).map(([name,_])=>name).length===0&&errors.push(`Table '${tableName}' has no primary key defined`),table.relationships?.forEach(rel=>{tableNames.includes(rel.table)||errors.push(`Table '${tableName}' references unknown table '${rel.table}' in relationship`)})}),errors.length>0)throw new Error(`Schema validation failed:\\n${errors.join("\\n")}`)}getTableColumns(tableName){let table=this.schemas[tableName];return table?Object.keys(table.columns):[]}createTableColumnResolver(){return tableName=>this.getTableColumns(tableName)}createJsonMapping(rootTableName){let rootTable=this.schemas[rootTableName];if(!rootTable)throw new Error(`Table '${rootTableName}' not found in schema registry`);let rootColumns={};Object.entries(rootTable.columns).forEach(([columnName,column])=>{rootColumns[columnName]=column.jsonAlias||column.name});let nestedEntities=[];return rootTable.relationships?.forEach(rel=>{let relatedTable=this.schemas[rel.table];if(!relatedTable)throw new Error(`Related table '${rel.table}' not found in schema registry`);let relatedColumns={};Object.entries(relatedTable.columns).forEach(([columnName,column])=>{relatedColumns[columnName]=column.jsonAlias||column.name});let relationshipType=rel.type;nestedEntities.push({id:rel.propertyName,name:relatedTable.displayName||rel.table,parentId:rootTableName,propertyName:rel.propertyName,relationshipType,columns:relatedColumns})}),{rootName:rootTableName,rootEntity:{id:rootTableName,name:rootTable.displayName||rootTableName,columns:rootColumns},nestedEntities,resultFormat:"single"}}getTableNames(){return Object.keys(this.schemas)}getTable(tableName){return this.schemas[tableName]}getPrimaryKey(tableName){let table=this.schemas[tableName];if(!table)return;let primaryKeyEntry=Object.entries(table.columns).find(([_,col])=>col.isPrimaryKey);return primaryKeyEntry?primaryKeyEntry[0]:void 0}getForeignKeys(tableName){let table=this.schemas[tableName];if(!table)return[];let foreignKeys=[];return Object.entries(table.columns).forEach(([columnName,column])=>{column.foreignKey&&foreignKeys.push({column:columnName,referencedTable:column.foreignKey.table,referencedColumn:column.foreignKey.column})}),foreignKeys}};function createSchemaManager(schemas){return new SchemaManager(schemas)}function createTableColumnResolver(schemas){return new SchemaManager(schemas).createTableColumnResolver()}function createJsonMappingFromSchema(schemas,rootTableName){return new SchemaManager(schemas).createJsonMapping(rootTableName)}var TextPositionUtils=class{static lineColumnToCharOffset(text,position){if(position.line<1||position.column<1)return-1;let lines=text.split(`
79
+ `);if(position.line>lines.length)return-1;let targetLine=lines[position.line-1];if(position.column>targetLine.length+1)return-1;let offset=0;for(let i=0;i<position.line-1;i++)offset+=lines[i].length+1;return offset+=position.column-1,offset}static charOffsetToLineColumn(text,charOffset){if(charOffset<0||charOffset>text.length)return null;let lines=text.split(`
80
+ `),currentOffset=0;for(let lineIndex=0;lineIndex<lines.length;lineIndex++){let lineLength=lines[lineIndex].length;if(charOffset<currentOffset+lineLength)return{line:lineIndex+1,column:charOffset-currentOffset+1};if(charOffset===currentOffset+lineLength&&lineIndex<lines.length-1)return{line:lineIndex+2,column:1};currentOffset+=lineLength+1}if(charOffset===text.length){let lastLine=lines[lines.length-1];return{line:lines.length,column:lastLine.length+1}}return null}static isValidPosition(text,position){return this.lineColumnToCharOffset(text,position)!==-1}static getLine(text,lineNumber){if(lineNumber<1)return null;let lines=text.split(`
81
+ `);return lineNumber>lines.length?null:lines[lineNumber-1]}static getLineCount(text){return text.split(`
82
+ `).length}};var KeywordCache=class{static{this.joinSuggestionCache=new Map}static{this.commandSuggestionCache=new Map}static{this.initialized=!1}static initialize(){if(this.initialized)return;let joinPatterns=[["join"],["inner","join"],["cross","join"],["left","join"],["left","outer","join"],["right","join"],["right","outer","join"],["full","join"],["full","outer","join"],["natural","join"],["natural","inner","join"],["natural","left","join"],["natural","left","outer","join"],["natural","right","join"],["natural","right","outer","join"],["natural","full","join"],["natural","full","outer","join"],["lateral","join"],["lateral","inner","join"],["lateral","left","join"],["lateral","left","outer","join"]],suggestionMap=new Map,completePhrases=new Set;joinPatterns.forEach(pattern=>{pattern.length>1&&completePhrases.add(pattern.slice(1).join(" ").toUpperCase())}),joinPatterns.forEach(pattern=>{for(let i=0;i<pattern.length-1;i++){let prefix=pattern[i];suggestionMap.has(prefix)||suggestionMap.set(prefix,new Set),joinPatterns.forEach(candidatePattern=>{if(candidatePattern.length>i+1&&candidatePattern[i]===prefix){let completePhrase=candidatePattern.slice(i+1).join(" ").toUpperCase();suggestionMap.get(prefix).add(completePhrase)}})}}),suggestionMap.forEach((suggestions,keyword)=>{this.joinSuggestionCache.set(keyword.toLowerCase(),Array.from(suggestions))}),this.initializeCommandKeywords(),this.initialized=!0}static getJoinSuggestions(keyword){return this.initialize(),this.joinSuggestionCache.get(keyword.toLowerCase())||[]}static isValidJoinKeyword(keyword){return joinkeywordParser.parse(keyword,0)!==null}static getPartialSuggestions(partialKeyword){this.initialize();let partial=partialKeyword.toLowerCase(),suggestions=[];return this.joinSuggestionCache.forEach((values,key)=>{key.startsWith(partial)&&(suggestions.push(key),values.forEach(value=>{suggestions.includes(value)||suggestions.push(value)}))}),suggestions}static getAllJoinKeywords(){this.initialize();let allKeywords=new Set;return this.joinSuggestionCache.forEach((values,key)=>{allKeywords.add(key),values.forEach(value=>allKeywords.add(value))}),Array.from(allKeywords)}static initializeCommandKeywords(){let commandPatterns=this.extractCommandPatternsFromTrie(),suggestionMap=new Map;commandPatterns.forEach(pattern=>{for(let i=0;i<pattern.length-1;i++){let prefix=pattern[i],nextWord=pattern[i+1];suggestionMap.has(prefix)||suggestionMap.set(prefix,new Set),suggestionMap.get(prefix).add(nextWord)}}),suggestionMap.forEach((suggestions,keyword)=>{this.commandSuggestionCache.set(keyword.toLowerCase(),Array.from(suggestions))})}static extractCommandPatternsFromTrie(){return[["group","by"],["order","by"],["distinct","on"],["not","materialized"],["row","only"],["rows","only"],["percent","with","ties"],["key","share"],["no","key","update"],["union","all"],["intersect","all"],["except","all"],["partition","by"],["within","group"],["with","ordinality"]]}static getCommandSuggestions(keyword){return this.initialize(),this.commandSuggestionCache.get(keyword.toLowerCase())||[]}static reset(){this.joinSuggestionCache.clear(),this.commandSuggestionCache.clear(),this.initialized=!1}};var CursorContextAnalyzer=class{static{this.patternCache=null}static getKeywordPatterns(){if(this.patternCache!==null)return this.patternCache;let requiresKeywords=new Map,suggestsTables=new Set,suggestsColumns=new Set;return this.extractKeywordPatterns(requiresKeywords,suggestsTables,suggestsColumns),this.patternCache={requiresKeywords,suggestsTables,suggestsColumns},this.patternCache}static extractKeywordPatterns(requiresKeywords,suggestsTables,suggestsColumns){let tableContexts=["from","join"],columnContexts=["select","where","on","having","by"];for(let keyword of tableContexts)this.isKeywordInDictionary(keyword)&&suggestsTables.add(keyword);for(let keyword of columnContexts)this.isKeywordInDictionary(keyword)&&suggestsColumns.add(keyword);this.extractRequiresKeywordPatterns(requiresKeywords)}static isKeywordInDictionary(keyword){return KeywordCache.isValidJoinKeyword(keyword)?!0:["from","join","select","where","on","having","by","group","order"].includes(keyword)}static extractRequiresKeywordPatterns(requiresKeywords){let potentialFirstWords=["inner","left","right","full","cross","natural","outer","group","order"];for(let word of potentialFirstWords){let possibleFollowups=this.findPossibleFollowups(word);possibleFollowups.length>0&&requiresKeywords.set(word,possibleFollowups)}}static findPossibleFollowups(word){let followups=new Set;return KeywordCache.getJoinSuggestions(word.toLowerCase()).forEach(s=>followups.add(s.toUpperCase())),KeywordCache.getCommandSuggestions(word.toLowerCase()).forEach(s=>followups.add(s.toUpperCase())),Array.from(followups)}static requiresSpecificKeywords(tokenValue){let requiredKeywords=this.getKeywordPatterns().requiresKeywords.get(tokenValue);return requiredKeywords?{suggestKeywords:!0,requiredKeywords}:null}static analyzeIntelliSense(sql,cursorPosition){try{let allLexemes=LexemeCursor.getAllLexemesWithPosition(sql),actualTokenIndex=-1,actualCurrentToken;for(let i=0;i<allLexemes.length;i++){let lexeme=allLexemes[i];if(lexeme.position){if(cursorPosition>=lexeme.position.startPosition&&cursorPosition<=lexeme.position.endPosition){actualCurrentToken=lexeme,actualTokenIndex=i;break}else if(lexeme.position.startPosition>cursorPosition){actualTokenIndex=Math.max(0,i-1),actualCurrentToken=actualTokenIndex>=0?allLexemes[actualTokenIndex]:void 0;break}}}actualTokenIndex===-1&&allLexemes.length>0&&(actualTokenIndex=allLexemes.length-1,actualCurrentToken=allLexemes[actualTokenIndex]);let previousToken=actualTokenIndex>0?allLexemes[actualTokenIndex-1]:void 0;if(this.isAfterDot(sql,cursorPosition,previousToken))return{suggestTables:!1,suggestColumns:!0,suggestKeywords:!1,tableScope:this.findPrecedingIdentifier(sql,cursorPosition,allLexemes),currentToken:actualCurrentToken,previousToken};if(actualCurrentToken){let currentValue=actualCurrentToken.value.toLowerCase(),keywordRequirement=this.requiresSpecificKeywords(currentValue);if(keywordRequirement)return{suggestTables:!1,suggestColumns:!1,...keywordRequirement,currentToken:actualCurrentToken,previousToken}}let tokenValue=actualCurrentToken?.value.toLowerCase(),prevValue=previousToken?.value.toLowerCase();if(tokenValue){let patterns=this.getKeywordPatterns();if(patterns.suggestsTables.has(tokenValue))return{suggestTables:!0,suggestColumns:!1,suggestKeywords:!1,currentToken:actualCurrentToken,previousToken};if(patterns.suggestsColumns.has(tokenValue))return{suggestTables:!1,suggestColumns:!0,suggestKeywords:!1,currentToken:actualCurrentToken,previousToken}}if(prevValue){let patterns=this.getKeywordPatterns(),keywordRequirement=this.requiresSpecificKeywords(prevValue);if(keywordRequirement&&tokenValue!=="join"&&tokenValue!=="outer"&&tokenValue!=="by")return{suggestTables:!1,suggestColumns:!1,...keywordRequirement,currentToken:actualCurrentToken,previousToken};if(patterns.suggestsTables.has(prevValue))return{suggestTables:!0,suggestColumns:!1,suggestKeywords:!1,currentToken:actualCurrentToken,previousToken};if(patterns.suggestsColumns.has(prevValue))return{suggestTables:!1,suggestColumns:!0,suggestKeywords:!1,currentToken:actualCurrentToken,previousToken}}return{suggestTables:!1,suggestColumns:!1,suggestKeywords:!0,currentToken:actualCurrentToken,previousToken}}catch{return{suggestTables:!1,suggestColumns:!1,suggestKeywords:!1}}}static analyzeIntelliSenseAt(sql,position){let charOffset=TextPositionUtils.lineColumnToCharOffset(sql,position);return charOffset===-1?{suggestTables:!1,suggestColumns:!1,suggestKeywords:!1}:this.analyzeIntelliSense(sql,charOffset)}static isAfterDot(sql,cursorPosition,previousToken){if(cursorPosition>0&&sql[cursorPosition-1]==="."||previousToken&&previousToken.value===".")return!0;let pos=cursorPosition-1;for(;pos>=0&&/\s/.test(sql[pos]);)pos--;return pos>=0&&sql[pos]==="."}static findPrecedingIdentifier(sql,cursorPosition,lexemes){if(this.isAfterDot(sql,cursorPosition)){let pos=cursorPosition-1;for(;pos>=0&&/\s/.test(sql[pos]);)pos--;if(pos>=0&&sql[pos]==="."){let identifierEnd=pos;for(;pos>=0&&/\s/.test(sql[pos]);)pos--;for(;pos>=0&&/[a-zA-Z0-9_]/.test(sql[pos]);)pos--;let identifierStart=pos+1;if(identifierStart<identifierEnd)return sql.substring(identifierStart,identifierEnd)}for(let i=lexemes.length-1;i>=0;i--)if(lexemes[i].value==="."&&lexemes[i].position&&lexemes[i].position.startPosition<cursorPosition){if(i>0&&this.isIdentifier(lexemes[i-1]))return lexemes[i-1].value;break}}}static isIdentifier(lexeme){return/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(lexeme.value)}};var ScopeResolver=class{static resolve(sql,cursorPosition){return this.createEmptyScope()}static resolveAt(sql,position){let charOffset=TextPositionUtils.lineColumnToCharOffset(sql,position);return charOffset===-1?this.createEmptyScope():this.resolve(sql,charOffset)}static getColumnsForTable(sql,cursorPosition,tableOrAlias){let scope=this.resolve(sql,cursorPosition),table=scope.availableTables.find(t=>t.name===tableOrAlias||t.alias===tableOrAlias);return table?scope.visibleColumns.filter(col=>col.tableName===table.name||table.alias&&col.tableAlias===table.alias):[]}static analyzeScopeFromQuery(query){let scope={availableTables:[],availableCTEs:[],subqueryLevel:0,visibleColumns:[],currentQuery:query,parentQueries:[]};if(query instanceof SimpleSelectQuery)scope.availableCTEs=this.collectCTEs(query),scope.availableTables=this.collectTablesFromQuery(query),scope.visibleColumns=this.collectVisibleColumns(scope.availableTables,scope.availableCTEs);else if(query instanceof BinarySelectQuery){let leftScope=this.analyzeScopeFromQuery(query.left),rightScope=this.analyzeScopeFromQuery(query.right);scope.availableTables=[...leftScope.availableTables,...rightScope.availableTables],scope.availableCTEs=[...leftScope.availableCTEs,...rightScope.availableCTEs],scope.visibleColumns=[...leftScope.visibleColumns,...rightScope.visibleColumns]}return scope}static collectCTEs(query){let ctes=[];if(query.withClause){let collectedCTEs=new CTECollector().collect(query);for(let cte of collectedCTEs)ctes.push({name:cte.getSourceAliasName(),query:cte.query,columns:this.extractCTEColumns(cte.query),materialized:cte.materialized||!1})}return ctes}static collectTablesFromQuery(query){let tables=[];if(query.fromClause){let fromTables=this.extractTablesFromFromClause(query.fromClause);tables.push(...fromTables)}return tables}static extractTablesFromFromClause(fromClause){let tables=[];if(fromClause.source.datasource instanceof TableSource){let table={name:this.extractTableName(fromClause.source.datasource.qualifiedName),alias:fromClause.source.aliasExpression?.table.name,schema:this.extractSchemaName(fromClause.source.datasource.qualifiedName),fullName:this.getQualifiedNameString(fromClause.source.datasource.qualifiedName),sourceType:"table"};tables.push(table)}else if(fromClause.source.datasource instanceof SubQuerySource){let table={name:fromClause.source.aliasExpression?.table.name||"subquery",alias:fromClause.source.aliasExpression?.table.name,fullName:fromClause.source.aliasExpression?.table.name||"subquery",sourceType:"subquery",originalQuery:fromClause.source.datasource.query};tables.push(table)}if(fromClause.joins)for(let join of fromClause.joins){let joinTables=this.extractTablesFromJoin(join);tables.push(...joinTables)}return tables}static extractTablesFromJoin(join){let tables=[];if(join.source.datasource instanceof TableSource){let table={name:this.extractTableName(join.source.datasource.qualifiedName),alias:join.source.aliasExpression?.table.name,schema:this.extractSchemaName(join.source.datasource.qualifiedName),fullName:this.getQualifiedNameString(join.source.datasource.qualifiedName),sourceType:"table"};tables.push(table)}else if(join.source.datasource instanceof SubQuerySource){let table={name:join.source.aliasExpression?.table.name||"subquery",alias:join.source.aliasExpression?.table.name,fullName:join.source.aliasExpression?.table.name||"subquery",sourceType:"subquery",originalQuery:join.source.datasource.query};tables.push(table)}return tables}static getQualifiedNameString(qualifiedName){return qualifiedName.toString()}static extractTableName(qualifiedName){let parts=this.getQualifiedNameString(qualifiedName).split(".");return parts[parts.length-1]}static extractSchemaName(qualifiedName){let parts=this.getQualifiedNameString(qualifiedName).split(".");return parts.length>1?parts[parts.length-2]:void 0}static extractCTEColumns(query){try{if(query instanceof SimpleSelectQuery&&query.selectClause){let columns=[];for(let item of query.selectClause.items)if(item.identifier)columns.push(item.identifier.name);else{let columnName=this.extractColumnNameFromExpression(item.value);columnName&&columns.push(columnName)}return columns}}catch{}}static extractColumnNameFromExpression(expression){if(expression&&typeof expression=="object"&&"value"in expression)return expression.value}static collectVisibleColumns(tables,ctes){let columns=[];for(let cte of ctes)if(cte.columns)for(let columnName of cte.columns)columns.push({name:columnName,tableName:cte.name,fullReference:`${cte.name}.${columnName}`});for(let table of tables)table.sourceType==="table"&&columns.push({name:"*",tableName:table.name,tableAlias:table.alias,fullReference:`${table.alias||table.name}.*`});return columns}static createEmptyScope(){return{availableTables:[],availableCTEs:[],subqueryLevel:0,visibleColumns:[],parentQueries:[]}}};var PositionAwareParser=class{static parseToPosition(sql,cursorPosition,options={}){let charPosition=typeof cursorPosition=="number"?cursorPosition:TextPositionUtils.lineColumnToCharOffset(sql,cursorPosition);if(charPosition===-1)return{success:!1,error:"Invalid cursor position",stoppedAtCursor:!1};try{let normalResult=this.tryNormalParse(sql,charPosition,options);return normalResult.success?normalResult:options.errorRecovery?this.tryErrorRecovery(sql,charPosition,options):normalResult}catch(error){return{success:!1,error:error instanceof Error?error.message:String(error),stoppedAtCursor:!1}}}static parseCurrentQuery(sql,cursorPosition,options={}){let charPosition=typeof cursorPosition=="number"?cursorPosition:TextPositionUtils.lineColumnToCharOffset(sql,cursorPosition);if(charPosition===-1)return{success:!1,error:"Invalid cursor position",stoppedAtCursor:!1};let queryBoundaries=this.findQueryBoundaries(sql),currentQuery=this.findQueryAtPosition(queryBoundaries,charPosition);if(!currentQuery)return{success:!1,error:"No query found at cursor position",stoppedAtCursor:!1};let relativePosition=charPosition-currentQuery.start,querySQL=sql.substring(currentQuery.start,currentQuery.end);return this.parseToPosition(querySQL,relativePosition,options)}static tryNormalParse(sql,cursorPosition,options){if(cursorPosition<0||cursorPosition>sql.length)return{success:!1,error:"Invalid cursor position",stoppedAtCursor:!1};let trimmedSql=sql.trim(),appearsIncomplete=[".",",","SELECT","FROM","WHERE","JOIN","ON","GROUP BY","ORDER BY"].some(pattern=>trimmedSql.toLowerCase().endsWith(pattern.toLowerCase())),analysisResult=SelectQueryParser.analyze(sql);if(!analysisResult.success||appearsIncomplete)return{...analysisResult,success:!1};let allTokens=this.getAllTokens(sql),cursorToken=this.findTokenAtPosition(allTokens,cursorPosition),beforeCursor=this.findTokenBeforePosition(allTokens,cursorPosition);return{...analysisResult,parsedTokens:allTokens,tokenBeforeCursor:beforeCursor,stoppedAtCursor:cursorPosition<sql.length,recoveryAttempts:0}}static tryErrorRecovery(sql,cursorPosition,options){let maxAttempts=options.maxRecoveryAttempts||5,attempts=0,strategies=[()=>this.recoverWithTokenInsertion(sql,cursorPosition,options),()=>this.recoverWithTruncation(sql,cursorPosition,options),()=>this.recoverWithCompletion(sql,cursorPosition,options),()=>this.recoverWithMinimalSQL(sql,cursorPosition,options)];for(let strategy of strategies){if(attempts>=maxAttempts)break;attempts++;try{let result=strategy();if(result.success)return result.recoveryAttempts=attempts,result}catch{continue}}return{success:!1,error:"All error recovery attempts failed",recoveryAttempts:attempts,stoppedAtCursor:!1}}static recoverWithTokenInsertion(sql,cursorPosition,options){if(!options.insertMissingTokens)throw new Error("Token insertion disabled");let fixes=[{pattern:/SELECT\s*$/i,replacement:"SELECT 1 "},{pattern:/FROM\s*$/i,replacement:"FROM dual "},{pattern:/WHERE\s*$/i,replacement:"WHERE 1=1 "},{pattern:/JOIN\s*$/i,replacement:"JOIN dual ON 1=1 "},{pattern:/ON\s*$/i,replacement:"ON 1=1 "},{pattern:/GROUP\s+BY\s*$/i,replacement:"GROUP BY 1 "},{pattern:/ORDER\s+BY\s*$/i,replacement:"ORDER BY 1 "}],fixedSQL=sql;for(let fix of fixes)if(fix.pattern.test(sql)){fixedSQL=sql.replace(fix.pattern,fix.replacement);break}if(fixedSQL===sql)throw new Error("No applicable token insertion found");let result=SelectQueryParser.analyze(fixedSQL),tokens=this.getAllTokens(sql);return{...result,parsedTokens:tokens,tokenBeforeCursor:this.findTokenBeforePosition(tokens,cursorPosition),stoppedAtCursor:!0,recoveryAttempts:1}}static recoverWithTruncation(sql,cursorPosition,options){let truncated=sql.substring(0,cursorPosition),completions=[""," 1"," FROM dual"," WHERE 1=1"];for(let completion of completions)try{let testSQL=truncated+completion,result=SelectQueryParser.analyze(testSQL);if(result.success){let tokens=this.getAllTokens(sql);return{...result,parsedTokens:tokens.filter(t=>t.position&&t.position.startPosition<=cursorPosition),tokenBeforeCursor:this.findTokenBeforePosition(tokens,cursorPosition),stoppedAtCursor:!0,recoveryAttempts:1}}}catch{continue}throw new Error("Truncation recovery failed")}static recoverWithCompletion(sql,cursorPosition,options){let beforeCursor=sql.substring(0,cursorPosition),afterCursor=sql.substring(cursorPosition),completions=[{pattern:/\.\s*$/,completion:"id"},{pattern:/\w+\s*$/,completion:""},{pattern:/,\s*$/,completion:"1"},{pattern:/\(\s*$/,completion:"1)"}];for(let comp of completions)if(comp.pattern.test(beforeCursor)){let testSQL=beforeCursor+comp.completion+afterCursor;try{let result=SelectQueryParser.analyze(testSQL);if(result.success){let tokens=this.getAllTokens(sql);return{...result,parsedTokens:tokens,tokenBeforeCursor:this.findTokenBeforePosition(tokens,cursorPosition),stoppedAtCursor:!0,recoveryAttempts:1}}}catch{continue}}throw new Error("Completion recovery failed")}static recoverWithMinimalSQL(sql,cursorPosition,options){let minimalSQL="SELECT 1 FROM dual WHERE 1=1";try{let result=SelectQueryParser.analyze(minimalSQL),tokens=this.getAllTokens(sql);return{success:!0,query:result.query,parsedTokens:tokens.filter(t=>t.position&&t.position.startPosition<=cursorPosition),tokenBeforeCursor:this.findTokenBeforePosition(tokens,cursorPosition),stoppedAtCursor:!0,partialAST:result.query,recoveryAttempts:1}}catch{throw new Error("Minimal SQL recovery failed")}}static getAllTokens(sql){try{return LexemeCursor.getAllLexemesWithPosition(sql)}catch{return[]}}static findTokenAtPosition(tokens,position){return tokens.find(token=>token.position&&position>=token.position.startPosition&&position<token.position.endPosition)}static findTokenBeforePosition(tokens,position){let beforeToken;for(let token of tokens)if(token.position)if(token.position.endPosition<=position)beforeToken=token;else{if(token.position.startPosition<position)break;break}return beforeToken}static findQueryBoundaries(sql){let boundaries=[],currentStart=0,inString=!1,stringChar="",inComment=!1;for(let i=0;i<sql.length;i++){let char=sql[i],nextChar=i<sql.length-1?sql[i+1]:"";if(!inComment&&(char==="'"||char==='"')){inString?char===stringChar&&(inString=!1,stringChar=""):(inString=!0,stringChar=char);continue}if(!inString&&char==="-"&&nextChar==="-"){inComment=!0,i++;continue}if(inComment&&char===`
83
+ `){inComment=!1;continue}!inString&&!inComment&&char===";"&&(boundaries.push({start:currentStart,end:i}),currentStart=i+1)}return currentStart<sql.length&&boundaries.push({start:currentStart,end:sql.length}),boundaries}static findQueryAtPosition(boundaries,position){return boundaries.find(boundary=>position>=boundary.start&&position<=boundary.end)}};var MultiQuerySplitter=class{static split(text){let queries=[];if(!text||text.trim()==="")return{queries:[],originalText:text,getActive:()=>{},getQuery:()=>{},getNonEmpty:()=>[]};let rawBoundaries=this.splitRespectingQuotesAndComments(text),boundaries=this.mergeTrailingCommentSegments(rawBoundaries,text),queryIndex=0;for(let boundary of boundaries){let rawSql=boundary.text.trim(),isEmpty=this.isEmptyQuery(rawSql),sql=rawSql,startLineCol=TextPositionUtils.charOffsetToLineColumn(text,boundary.start),endLineCol=TextPositionUtils.charOffsetToLineColumn(text,boundary.end);queries.push({sql,start:boundary.start,end:boundary.end,startLine:startLineCol?.line||1,endLine:endLineCol?.line||1,index:queryIndex++,isEmpty})}return{queries,originalText:text,getActive:cursorPosition=>{let charPos=typeof cursorPosition=="number"?cursorPosition:TextPositionUtils.lineColumnToCharOffset(text,cursorPosition);if(charPos!==-1)return queries.find(query=>charPos>=query.start&&charPos<=query.end)},getQuery:index=>queries[index],getNonEmpty:()=>queries.filter(q=>!q.isEmpty)}}static splitRespectingQuotesAndComments(text){let segments=[],currentStart=0,i=0;for(;i<=text.length;){if(i===text.length||i<text.length&&this.isValidSemicolon(text,i)){let segmentText=text.substring(currentStart,i);(segmentText.length>0||i<text.length)&&segments.push({text:segmentText,start:currentStart,end:i}),currentStart=i+1}i++}return segments}static isValidSemicolon(text,pos){if(text[pos]!==";")return!1;let inSingleQuote=!1,inDoubleQuote=!1,inLineComment=!1,inBlockComment=!1;for(let i=0;i<pos;i++){let char=text[i],nextChar=i+1<text.length?text[i+1]:"";if(!inSingleQuote&&!inDoubleQuote&&!inBlockComment&&char==="-"&&nextChar==="-"){inLineComment=!0,i++;continue}if(inLineComment&&char===`
84
+ `){inLineComment=!1;continue}if(!inSingleQuote&&!inDoubleQuote&&!inLineComment&&char==="/"&&nextChar==="*"){inBlockComment=!0,i++;continue}if(inBlockComment&&char==="*"&&nextChar==="/"){inBlockComment=!1,i++;continue}if(!(inLineComment||inBlockComment)){if(char==="'"&&!inDoubleQuote){inSingleQuote&&nextChar==="'"?i++:inSingleQuote=!inSingleQuote;continue}if(char==='"'&&!inSingleQuote){inDoubleQuote&&nextChar==='"'?i++:inDoubleQuote=!inDoubleQuote;continue}}}return!inSingleQuote&&!inDoubleQuote&&!inLineComment&&!inBlockComment}static mergeTrailingCommentSegments(segments,fullText){let merged=[];for(let i=0;i<segments.length;i++){let segment=segments[i],segmentText=segment.text.trim();if(this.isEmptyQuery(segmentText)&&merged.length>0){let lastSegmentText=merged[merged.length-1].text.trim(),isTrailingLineComment=segmentText.startsWith("--"),previousHasSQL=!this.isEmptyQuery(lastSegmentText);if(isTrailingLineComment&&previousHasSQL){let lastSegment=merged[merged.length-1];merged[merged.length-1]={text:fullText.substring(lastSegment.start,segment.end),start:lastSegment.start,end:segment.end}}else merged.push(segment)}else merged.push(segment)}return merged}static cleanSqlComments(sql){if(!sql)return null;let cleaned=sql;cleaned=cleaned.split(`
85
+ `).map(line=>{let commentStart=line.indexOf("--");return commentStart>=0?line.substring(0,commentStart):line}).join(`
86
+ `),cleaned=cleaned.replace(/\/\*[\s\S]*?\*\//g,"");let result=cleaned.trim();return result.length>0?result:null}static isEmptyQuery(sql){return sql?this.cleanSqlComments(sql)===null:!0}},MultiQueryUtils=class{static getContextAt(text,cursorPosition){let activeQuery=MultiQuerySplitter.split(text).getActive(cursorPosition);if(!activeQuery)return;let charPos=typeof cursorPosition=="number"?cursorPosition:TextPositionUtils.lineColumnToCharOffset(text,cursorPosition);if(charPos===-1)return;let relativePosition=charPos-activeQuery.start;return{query:activeQuery,relativePosition}}static extractQueries(text){return MultiQuerySplitter.split(text).getNonEmpty().map(q=>q.sql)}};function parseToPosition(sql,cursorPosition,options={}){return PositionAwareParser.parseToPosition(sql,cursorPosition,options)}function getCursorContext(sql,cursorPosition){return typeof cursorPosition=="number"?CursorContextAnalyzer.analyzeIntelliSense(sql,cursorPosition):CursorContextAnalyzer.analyzeIntelliSenseAt(sql,cursorPosition)}function resolveScope(sql,cursorPosition){return typeof cursorPosition=="number"?ScopeResolver.resolve(sql,cursorPosition):ScopeResolver.resolveAt(sql,cursorPosition)}function splitQueries(sql){return MultiQuerySplitter.split(sql)}function getIntelliSenseInfo(sql,cursorPosition,options={}){let charPos=typeof cursorPosition=="number"?cursorPosition:TextPositionUtils.lineColumnToCharOffset(sql,cursorPosition);if(charPos===-1)return;let activeQuery=splitQueries(sql).getActive(charPos);if(!activeQuery)return;let relativePosition=charPos-activeQuery.start,querySQL=activeQuery.sql,context=getCursorContext(querySQL,relativePosition),scope=resolveScope(querySQL,relativePosition),parseResult=parseToPosition(querySQL,relativePosition,options);return{context,scope,parseResult,currentQuery:querySQL,relativePosition}}function getCompletionSuggestions(sql,cursorPosition){let charPos=typeof cursorPosition=="number"?cursorPosition:TextPositionUtils.lineColumnToCharOffset(sql,cursorPosition);if(charPos===-1)return[];let intelliSenseContext=CursorContextAnalyzer.analyzeIntelliSense(sql,charPos),scope=resolveScope(sql,cursorPosition),suggestions=[];return intelliSenseContext.suggestKeywords&&(intelliSenseContext.requiredKeywords?intelliSenseContext.requiredKeywords.forEach(keyword=>{suggestions.push({type:"keyword",value:keyword,detail:`Required keyword: ${keyword}`})}):getGeneralKeywords(intelliSenseContext).forEach(keyword=>{suggestions.push({type:"keyword",value:keyword.value,detail:keyword.detail})})),intelliSenseContext.suggestTables&&(scope.availableTables.forEach(table=>{suggestions.push({type:"table",value:table.alias||table.name,detail:`Table: ${table.fullName}`,documentation:`Available table${table.alias?` (alias: ${table.alias})`:""}`})}),scope.availableCTEs.forEach(cte=>{suggestions.push({type:"cte",value:cte.name,detail:`CTE: ${cte.name}`,documentation:`Common Table Expression${cte.columns?` with columns: ${cte.columns.join(", ")}`:""}`})})),intelliSenseContext.suggestColumns&&(intelliSenseContext.tableScope?scope.visibleColumns.filter(col=>col.tableName===intelliSenseContext.tableScope||col.tableAlias===intelliSenseContext.tableScope).forEach(col=>{suggestions.push({type:"column",value:col.name,detail:`Column: ${col.fullReference}`,documentation:`Column from ${col.tableName}${col.type?` (${col.type})`:""}`})}):scope.visibleColumns.forEach(col=>{suggestions.push({type:"column",value:col.name==="*"?"*":`${col.tableAlias||col.tableName}.${col.name}`,detail:`Column: ${col.fullReference}`,documentation:`Column from ${col.tableName}`})})),suggestions}function getGeneralKeywords(context){let prevToken=context.previousToken?.value?.toLowerCase(),currentToken=context.currentToken?.value?.toLowerCase();return prevToken==="select"||currentToken==="select"?[{value:"DISTINCT",detail:"Remove duplicate rows"},{value:"COUNT",detail:"Aggregate function"},{value:"SUM",detail:"Aggregate function"},{value:"AVG",detail:"Aggregate function"},{value:"MAX",detail:"Aggregate function"},{value:"MIN",detail:"Aggregate function"}]:prevToken==="from"||currentToken==="from"?[{value:"JOIN",detail:"Inner join tables"},{value:"LEFT JOIN",detail:"Left outer join"},{value:"RIGHT JOIN",detail:"Right outer join"},{value:"FULL JOIN",detail:"Full outer join"},{value:"WHERE",detail:"Filter conditions"},{value:"GROUP BY",detail:"Group results"},{value:"ORDER BY",detail:"Sort results"}]:["where","having","on"].includes(prevToken||"")||["where","having","on"].includes(currentToken||"")?[{value:"AND",detail:"Logical AND operator"},{value:"OR",detail:"Logical OR operator"},{value:"NOT",detail:"Logical NOT operator"},{value:"IN",detail:"Match any value in list"},{value:"LIKE",detail:"Pattern matching"},{value:"BETWEEN",detail:"Range comparison"}]:[{value:"SELECT",detail:"Query data"},{value:"FROM",detail:"Specify table"},{value:"WHERE",detail:"Filter conditions"},{value:"JOIN",detail:"Join tables"},{value:"GROUP BY",detail:"Group results"},{value:"ORDER BY",detail:"Sort results"},{value:"LIMIT",detail:"Limit results"}]}export{AliasRenamer,ArrayExpression,ArrayIndexExpression,ArrayQueryExpression,ArraySliceExpression,BetweenExpression,BinaryExpression,BinarySelectQuery,CTECollector,CTEComposer,CTEDependencyAnalyzer,CTEDisabler,CTENormalizer,CTENotFoundError,CTEQueryDecomposer,CTERegionDetector,CTERenamer,CTETableReferenceCollector,CaseExpression,CaseKeyValuePair,CastExpression,ColumnReference,ColumnReferenceCollector,CommentEditor,CursorContextAnalyzer,DuplicateCTEError,DuplicateDetectionMode,DynamicQueryBuilder,FilterableItem,FilterableItemCollector,Formatter,FunctionCall,IdentifierString,InlineQuery,InsertQuery,InsertQueryParser,InvalidCTENameError,JsonMappingConverter,JsonSchemaValidator,LexemeCursor,LiteralValue,MultiQuerySplitter,MultiQueryUtils,OriginalFormatRestorer,ParameterExpression,ParenExpression,PositionAwareParser,PostgresJsonQueryBuilder,QualifiedName,QueryBuilder,QueryFlowDiagramGenerator,RawString,SchemaCollector,SchemaManager,ScopeResolver,SelectQueryParser,SelectValueCollector,SelectableColumnCollector,SimpleSelectQuery,SmartRenamer,SqlComponent,SqlDialectConfiguration,SqlFormatter,SqlIdentifierRenamer,SqlPaginationInjector,SqlParamInjector,SqlSchemaValidator,SqlSortInjector,StringSpecifierExpression,SwitchCaseArgument,TableSchema,TableSourceCollector,TokenType,TupleExpression,TypeTransformationPostProcessor,TypeTransformers,TypeValue,UnaryExpression,UpstreamSelectQueryFinder,VALID_PRESETS,ValueList,ValuesQuery,WindowFrameBound,WindowFrameBoundStatic,WindowFrameBoundaryValue,WindowFrameExpression,WindowFrameSpec,WindowFrameType,WithClauseParser,convertColumnsToLegacy,convertModelDrivenMapping,convertToLegacyJsonMapping,createJsonMappingFromSchema,createSchemaManager,createTableColumnResolver,extractTypeProtection,getCompletionSuggestions,getCursorContext,getIntelliSenseInfo,isLegacyFormat,isModelDrivenFormat,isUnifiedFormat,parseToPosition,processJsonMapping,resolveScope,splitQueries,toLegacyMapping,transformDatabaseResult,unifyJsonMapping,validateModelDrivenMapping};
85
87
  //# sourceMappingURL=index.min.js.map