rawsql-ts 0.11.42-beta → 0.11.44-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 (278) hide show
  1. package/README.md +12 -13
  2. package/dist/esm/index.js +18 -0
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/index.min.js +23 -18
  5. package/dist/esm/index.min.js.map +4 -4
  6. package/dist/esm/src/index.d.ts +18 -0
  7. package/dist/esm/src/index.js +18 -0
  8. package/dist/esm/src/index.js.map +1 -1
  9. package/dist/esm/src/models/BinarySelectQuery.d.ts +25 -1
  10. package/dist/esm/src/models/BinarySelectQuery.js +28 -0
  11. package/dist/esm/src/models/BinarySelectQuery.js.map +1 -1
  12. package/dist/esm/src/models/Clause.d.ts +14 -2
  13. package/dist/esm/src/models/Clause.js +26 -1
  14. package/dist/esm/src/models/Clause.js.map +1 -1
  15. package/dist/esm/src/models/CreateTableQuery.d.ts +99 -5
  16. package/dist/esm/src/models/CreateTableQuery.js +85 -10
  17. package/dist/esm/src/models/CreateTableQuery.js.map +1 -1
  18. package/dist/esm/src/models/DDLStatements.d.ts +157 -0
  19. package/dist/esm/src/models/DDLStatements.js +141 -0
  20. package/dist/esm/src/models/DDLStatements.js.map +1 -0
  21. package/dist/esm/src/models/DeleteQuery.d.ts +17 -0
  22. package/dist/esm/src/models/DeleteQuery.js +16 -0
  23. package/dist/esm/src/models/DeleteQuery.js.map +1 -0
  24. package/dist/esm/src/models/InsertQuery.d.ts +7 -1
  25. package/dist/esm/src/models/InsertQuery.js +6 -2
  26. package/dist/esm/src/models/InsertQuery.js.map +1 -1
  27. package/dist/esm/src/models/MergeQuery.d.ts +63 -0
  28. package/dist/esm/src/models/MergeQuery.js +94 -0
  29. package/dist/esm/src/models/MergeQuery.js.map +1 -0
  30. package/dist/esm/src/models/SelectQuery.d.ts +37 -1
  31. package/dist/esm/src/models/SelectQuery.js +4 -1
  32. package/dist/esm/src/models/SelectQuery.js.map +1 -1
  33. package/dist/esm/src/models/SimpleSelectQuery.d.ts +29 -1
  34. package/dist/esm/src/models/SimpleSelectQuery.js +32 -0
  35. package/dist/esm/src/models/SimpleSelectQuery.js.map +1 -1
  36. package/dist/esm/src/models/SqlComponent.d.ts +2 -1
  37. package/dist/esm/src/models/SqlComponent.js +1 -1
  38. package/dist/esm/src/models/SqlComponent.js.map +1 -1
  39. package/dist/esm/src/models/SqlPrintToken.d.ts +33 -0
  40. package/dist/esm/src/models/SqlPrintToken.js +32 -0
  41. package/dist/esm/src/models/SqlPrintToken.js.map +1 -1
  42. package/dist/esm/src/models/ValuesQuery.d.ts +25 -1
  43. package/dist/esm/src/models/ValuesQuery.js +28 -0
  44. package/dist/esm/src/models/ValuesQuery.js.map +1 -1
  45. package/dist/esm/src/parsers/AlterTableParser.d.ts +25 -0
  46. package/dist/esm/src/parsers/AlterTableParser.js +428 -0
  47. package/dist/esm/src/parsers/AlterTableParser.js.map +1 -0
  48. package/dist/esm/src/parsers/CreateIndexParser.d.ts +16 -0
  49. package/dist/esm/src/parsers/CreateIndexParser.js +237 -0
  50. package/dist/esm/src/parsers/CreateIndexParser.js.map +1 -0
  51. package/dist/esm/src/parsers/CreateTableParser.d.ts +41 -0
  52. package/dist/esm/src/parsers/CreateTableParser.js +734 -0
  53. package/dist/esm/src/parsers/CreateTableParser.js.map +1 -0
  54. package/dist/esm/src/parsers/DeleteClauseParser.d.ts +11 -0
  55. package/dist/esm/src/parsers/DeleteClauseParser.js +33 -0
  56. package/dist/esm/src/parsers/DeleteClauseParser.js.map +1 -0
  57. package/dist/esm/src/parsers/DeleteQueryParser.d.ts +16 -0
  58. package/dist/esm/src/parsers/DeleteQueryParser.js +73 -0
  59. package/dist/esm/src/parsers/DeleteQueryParser.js.map +1 -0
  60. package/dist/esm/src/parsers/DropConstraintParser.d.ts +12 -0
  61. package/dist/esm/src/parsers/DropConstraintParser.js +47 -0
  62. package/dist/esm/src/parsers/DropConstraintParser.js.map +1 -0
  63. package/dist/esm/src/parsers/DropIndexParser.d.ts +12 -0
  64. package/dist/esm/src/parsers/DropIndexParser.js +69 -0
  65. package/dist/esm/src/parsers/DropIndexParser.js.map +1 -0
  66. package/dist/esm/src/parsers/DropTableParser.d.ts +12 -0
  67. package/dist/esm/src/parsers/DropTableParser.js +59 -0
  68. package/dist/esm/src/parsers/DropTableParser.js.map +1 -0
  69. package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +4 -0
  70. package/dist/esm/src/parsers/FunctionExpressionParser.js +25 -8
  71. package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
  72. package/dist/esm/src/parsers/InsertQueryParser.js +103 -31
  73. package/dist/esm/src/parsers/InsertQueryParser.js.map +1 -1
  74. package/dist/esm/src/parsers/MergeQueryParser.d.ts +26 -0
  75. package/dist/esm/src/parsers/MergeQueryParser.js +479 -0
  76. package/dist/esm/src/parsers/MergeQueryParser.js.map +1 -0
  77. package/dist/esm/src/parsers/ReturningClauseParser.js +50 -7
  78. package/dist/esm/src/parsers/ReturningClauseParser.js.map +1 -1
  79. package/dist/esm/src/parsers/SelectClauseParser.js +3 -3
  80. package/dist/esm/src/parsers/SelectClauseParser.js.map +1 -1
  81. package/dist/esm/src/parsers/SelectQueryParser.d.ts +4 -0
  82. package/dist/esm/src/parsers/SelectQueryParser.js +4 -0
  83. package/dist/esm/src/parsers/SelectQueryParser.js.map +1 -1
  84. package/dist/esm/src/parsers/SetClauseParser.js +97 -15
  85. package/dist/esm/src/parsers/SetClauseParser.js.map +1 -1
  86. package/dist/esm/src/parsers/SqlParser.d.ts +38 -0
  87. package/dist/esm/src/parsers/SqlParser.js +344 -0
  88. package/dist/esm/src/parsers/SqlParser.js.map +1 -0
  89. package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +68 -21
  90. package/dist/esm/src/parsers/SqlPrintTokenParser.js +1145 -254
  91. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  92. package/dist/esm/src/parsers/SqlTokenizer.d.ts +24 -2
  93. package/dist/esm/src/parsers/SqlTokenizer.js +135 -74
  94. package/dist/esm/src/parsers/SqlTokenizer.js.map +1 -1
  95. package/dist/esm/src/parsers/UpdateQueryParser.js +11 -1
  96. package/dist/esm/src/parsers/UpdateQueryParser.js.map +1 -1
  97. package/dist/esm/src/parsers/UsingClauseParser.d.ts +11 -0
  98. package/dist/esm/src/parsers/UsingClauseParser.js +29 -0
  99. package/dist/esm/src/parsers/UsingClauseParser.js.map +1 -0
  100. package/dist/esm/src/parsers/ValueParser.js +5 -1
  101. package/dist/esm/src/parsers/ValueParser.js.map +1 -1
  102. package/dist/esm/src/parsers/ValuesQueryParser.d.ts +0 -2
  103. package/dist/esm/src/parsers/ValuesQueryParser.js +5 -45
  104. package/dist/esm/src/parsers/ValuesQueryParser.js.map +1 -1
  105. package/dist/esm/src/parsers/utils/LexemeCommentUtils.d.ts +6 -0
  106. package/dist/esm/src/parsers/utils/LexemeCommentUtils.js +26 -0
  107. package/dist/esm/src/parsers/utils/LexemeCommentUtils.js.map +1 -0
  108. package/dist/esm/src/tokenReaders/CommandTokenReader.js +49 -2
  109. package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
  110. package/dist/esm/src/tokenReaders/LiteralTokenReader.js +8 -5
  111. package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  112. package/dist/esm/src/tokenReaders/OperatorTokenReader.js +10 -1
  113. package/dist/esm/src/tokenReaders/OperatorTokenReader.js.map +1 -1
  114. package/dist/esm/src/tokenReaders/TypeTokenReader.js +11 -1
  115. package/dist/esm/src/tokenReaders/TypeTokenReader.js.map +1 -1
  116. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.d.ts +18 -0
  117. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js +118 -0
  118. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
  119. package/dist/esm/src/transformers/LinePrinter.d.ts +2 -0
  120. package/dist/esm/src/transformers/LinePrinter.js +34 -1
  121. package/dist/esm/src/transformers/LinePrinter.js.map +1 -1
  122. package/dist/esm/src/transformers/OnelineFormattingHelper.d.ts +29 -0
  123. package/dist/esm/src/transformers/OnelineFormattingHelper.js +88 -0
  124. package/dist/esm/src/transformers/OnelineFormattingHelper.js.map +1 -0
  125. package/dist/esm/src/transformers/QueryBuilder.d.ts +47 -13
  126. package/dist/esm/src/transformers/QueryBuilder.js +424 -62
  127. package/dist/esm/src/transformers/QueryBuilder.js.map +1 -1
  128. package/dist/esm/src/transformers/SqlFormatter.d.ts +13 -3
  129. package/dist/esm/src/transformers/SqlFormatter.js +13 -4
  130. package/dist/esm/src/transformers/SqlFormatter.js.map +1 -1
  131. package/dist/esm/src/transformers/SqlPrinter.d.ts +63 -10
  132. package/dist/esm/src/transformers/SqlPrinter.js +954 -64
  133. package/dist/esm/src/transformers/SqlPrinter.js.map +1 -1
  134. package/dist/esm/src/types/Formatting.d.ts +8 -0
  135. package/dist/esm/src/types/Formatting.js +2 -0
  136. package/dist/esm/src/types/Formatting.js.map +1 -0
  137. package/dist/esm/src/utils/ParserStringUtils.d.ts +6 -0
  138. package/dist/esm/src/utils/ParserStringUtils.js +28 -0
  139. package/dist/esm/src/utils/ParserStringUtils.js.map +1 -0
  140. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  141. package/dist/index.min.js +22 -17
  142. package/dist/index.min.js.map +4 -4
  143. package/dist/src/index.d.ts +18 -0
  144. package/dist/src/index.js +18 -0
  145. package/dist/src/index.js.map +1 -1
  146. package/dist/src/models/BinarySelectQuery.d.ts +25 -1
  147. package/dist/src/models/BinarySelectQuery.js +28 -0
  148. package/dist/src/models/BinarySelectQuery.js.map +1 -1
  149. package/dist/src/models/Clause.d.ts +14 -2
  150. package/dist/src/models/Clause.js +29 -2
  151. package/dist/src/models/Clause.js.map +1 -1
  152. package/dist/src/models/CreateTableQuery.d.ts +99 -5
  153. package/dist/src/models/CreateTableQuery.js +90 -11
  154. package/dist/src/models/CreateTableQuery.js.map +1 -1
  155. package/dist/src/models/DDLStatements.d.ts +157 -0
  156. package/dist/src/models/DDLStatements.js +153 -0
  157. package/dist/src/models/DDLStatements.js.map +1 -0
  158. package/dist/src/models/DeleteQuery.d.ts +17 -0
  159. package/dist/src/models/DeleteQuery.js +20 -0
  160. package/dist/src/models/DeleteQuery.js.map +1 -0
  161. package/dist/src/models/InsertQuery.d.ts +7 -1
  162. package/dist/src/models/InsertQuery.js +6 -2
  163. package/dist/src/models/InsertQuery.js.map +1 -1
  164. package/dist/src/models/MergeQuery.d.ts +63 -0
  165. package/dist/src/models/MergeQuery.js +104 -0
  166. package/dist/src/models/MergeQuery.js.map +1 -0
  167. package/dist/src/models/SelectQuery.d.ts +37 -1
  168. package/dist/src/models/SelectQuery.js +7 -1
  169. package/dist/src/models/SelectQuery.js.map +1 -1
  170. package/dist/src/models/SimpleSelectQuery.d.ts +29 -1
  171. package/dist/src/models/SimpleSelectQuery.js +32 -0
  172. package/dist/src/models/SimpleSelectQuery.js.map +1 -1
  173. package/dist/src/models/SqlComponent.d.ts +2 -1
  174. package/dist/src/models/SqlComponent.js +1 -1
  175. package/dist/src/models/SqlComponent.js.map +1 -1
  176. package/dist/src/models/SqlPrintToken.d.ts +33 -0
  177. package/dist/src/models/SqlPrintToken.js +32 -0
  178. package/dist/src/models/SqlPrintToken.js.map +1 -1
  179. package/dist/src/models/ValuesQuery.d.ts +25 -1
  180. package/dist/src/models/ValuesQuery.js +28 -0
  181. package/dist/src/models/ValuesQuery.js.map +1 -1
  182. package/dist/src/parsers/AlterTableParser.d.ts +25 -0
  183. package/dist/src/parsers/AlterTableParser.js +432 -0
  184. package/dist/src/parsers/AlterTableParser.js.map +1 -0
  185. package/dist/src/parsers/CreateIndexParser.d.ts +16 -0
  186. package/dist/src/parsers/CreateIndexParser.js +241 -0
  187. package/dist/src/parsers/CreateIndexParser.js.map +1 -0
  188. package/dist/src/parsers/CreateTableParser.d.ts +41 -0
  189. package/dist/src/parsers/CreateTableParser.js +738 -0
  190. package/dist/src/parsers/CreateTableParser.js.map +1 -0
  191. package/dist/src/parsers/DeleteClauseParser.d.ts +11 -0
  192. package/dist/src/parsers/DeleteClauseParser.js +37 -0
  193. package/dist/src/parsers/DeleteClauseParser.js.map +1 -0
  194. package/dist/src/parsers/DeleteQueryParser.d.ts +16 -0
  195. package/dist/src/parsers/DeleteQueryParser.js +77 -0
  196. package/dist/src/parsers/DeleteQueryParser.js.map +1 -0
  197. package/dist/src/parsers/DropConstraintParser.d.ts +12 -0
  198. package/dist/src/parsers/DropConstraintParser.js +51 -0
  199. package/dist/src/parsers/DropConstraintParser.js.map +1 -0
  200. package/dist/src/parsers/DropIndexParser.d.ts +12 -0
  201. package/dist/src/parsers/DropIndexParser.js +73 -0
  202. package/dist/src/parsers/DropIndexParser.js.map +1 -0
  203. package/dist/src/parsers/DropTableParser.d.ts +12 -0
  204. package/dist/src/parsers/DropTableParser.js +63 -0
  205. package/dist/src/parsers/DropTableParser.js.map +1 -0
  206. package/dist/src/parsers/FunctionExpressionParser.d.ts +4 -0
  207. package/dist/src/parsers/FunctionExpressionParser.js +25 -8
  208. package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
  209. package/dist/src/parsers/InsertQueryParser.js +103 -31
  210. package/dist/src/parsers/InsertQueryParser.js.map +1 -1
  211. package/dist/src/parsers/MergeQueryParser.d.ts +26 -0
  212. package/dist/src/parsers/MergeQueryParser.js +483 -0
  213. package/dist/src/parsers/MergeQueryParser.js.map +1 -0
  214. package/dist/src/parsers/ReturningClauseParser.js +50 -7
  215. package/dist/src/parsers/ReturningClauseParser.js.map +1 -1
  216. package/dist/src/parsers/SelectClauseParser.js +2 -2
  217. package/dist/src/parsers/SelectClauseParser.js.map +1 -1
  218. package/dist/src/parsers/SelectQueryParser.d.ts +4 -0
  219. package/dist/src/parsers/SelectQueryParser.js +4 -0
  220. package/dist/src/parsers/SelectQueryParser.js.map +1 -1
  221. package/dist/src/parsers/SetClauseParser.js +97 -15
  222. package/dist/src/parsers/SetClauseParser.js.map +1 -1
  223. package/dist/src/parsers/SqlParser.d.ts +38 -0
  224. package/dist/src/parsers/SqlParser.js +353 -0
  225. package/dist/src/parsers/SqlParser.js.map +1 -0
  226. package/dist/src/parsers/SqlPrintTokenParser.d.ts +68 -21
  227. package/dist/src/parsers/SqlPrintTokenParser.js +1143 -252
  228. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  229. package/dist/src/parsers/SqlTokenizer.d.ts +24 -2
  230. package/dist/src/parsers/SqlTokenizer.js +139 -74
  231. package/dist/src/parsers/SqlTokenizer.js.map +1 -1
  232. package/dist/src/parsers/UpdateQueryParser.js +11 -1
  233. package/dist/src/parsers/UpdateQueryParser.js.map +1 -1
  234. package/dist/src/parsers/UsingClauseParser.d.ts +11 -0
  235. package/dist/src/parsers/UsingClauseParser.js +33 -0
  236. package/dist/src/parsers/UsingClauseParser.js.map +1 -0
  237. package/dist/src/parsers/ValueParser.js +5 -1
  238. package/dist/src/parsers/ValueParser.js.map +1 -1
  239. package/dist/src/parsers/ValuesQueryParser.d.ts +0 -2
  240. package/dist/src/parsers/ValuesQueryParser.js +5 -45
  241. package/dist/src/parsers/ValuesQueryParser.js.map +1 -1
  242. package/dist/src/parsers/utils/LexemeCommentUtils.d.ts +6 -0
  243. package/dist/src/parsers/utils/LexemeCommentUtils.js +29 -0
  244. package/dist/src/parsers/utils/LexemeCommentUtils.js.map +1 -0
  245. package/dist/src/tokenReaders/CommandTokenReader.js +49 -2
  246. package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
  247. package/dist/src/tokenReaders/LiteralTokenReader.js +8 -5
  248. package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  249. package/dist/src/tokenReaders/OperatorTokenReader.js +10 -1
  250. package/dist/src/tokenReaders/OperatorTokenReader.js.map +1 -1
  251. package/dist/src/tokenReaders/TypeTokenReader.js +11 -1
  252. package/dist/src/tokenReaders/TypeTokenReader.js.map +1 -1
  253. package/dist/src/transformers/InsertQuerySelectValuesConverter.d.ts +18 -0
  254. package/dist/src/transformers/InsertQuerySelectValuesConverter.js +122 -0
  255. package/dist/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
  256. package/dist/src/transformers/LinePrinter.d.ts +2 -0
  257. package/dist/src/transformers/LinePrinter.js +34 -1
  258. package/dist/src/transformers/LinePrinter.js.map +1 -1
  259. package/dist/src/transformers/OnelineFormattingHelper.d.ts +29 -0
  260. package/dist/src/transformers/OnelineFormattingHelper.js +92 -0
  261. package/dist/src/transformers/OnelineFormattingHelper.js.map +1 -0
  262. package/dist/src/transformers/QueryBuilder.d.ts +47 -13
  263. package/dist/src/transformers/QueryBuilder.js +433 -60
  264. package/dist/src/transformers/QueryBuilder.js.map +1 -1
  265. package/dist/src/transformers/SqlFormatter.d.ts +13 -3
  266. package/dist/src/transformers/SqlFormatter.js +20 -6
  267. package/dist/src/transformers/SqlFormatter.js.map +1 -1
  268. package/dist/src/transformers/SqlPrinter.d.ts +63 -10
  269. package/dist/src/transformers/SqlPrinter.js +954 -64
  270. package/dist/src/transformers/SqlPrinter.js.map +1 -1
  271. package/dist/src/types/Formatting.d.ts +8 -0
  272. package/dist/src/types/Formatting.js +3 -0
  273. package/dist/src/types/Formatting.js.map +1 -0
  274. package/dist/src/utils/ParserStringUtils.d.ts +6 -0
  275. package/dist/src/utils/ParserStringUtils.js +31 -0
  276. package/dist/src/utils/ParserStringUtils.js.map +1 -0
  277. package/dist/tsconfig.tsbuildinfo +1 -1
  278. package/package.json +1 -1
@@ -0,0 +1,479 @@
1
+ import { MergeQuery, MergeWhenClause, MergeUpdateAction, MergeDeleteAction, MergeInsertAction, MergeDoNothingAction } from "../models/MergeQuery";
2
+ import { SetClause, SetClauseItem } from "../models/Clause";
3
+ import { IdentifierString, ValueList } from "../models/ValueComponent";
4
+ import { TokenType } from "../models/Lexeme";
5
+ import { SqlTokenizer } from "./SqlTokenizer";
6
+ import { WithClauseParser } from "./WithClauseParser";
7
+ import { SourceExpressionParser } from "./SourceExpressionParser";
8
+ import { ValueParser } from "./ValueParser";
9
+ import { WhereClauseParser } from "./WhereClauseParser";
10
+ import { FullNameParser } from "./FullNameParser";
11
+ import { extractLexemeComments } from "./utils/LexemeCommentUtils";
12
+ export class MergeQueryParser {
13
+ /**
14
+ * Parse SQL string to MergeQuery AST.
15
+ * @param query SQL string
16
+ */
17
+ static parse(query) {
18
+ const tokenizer = new SqlTokenizer(query);
19
+ const lexemes = tokenizer.readLexemes();
20
+ const result = this.parseFromLexeme(lexemes, 0);
21
+ if (result.newIndex < lexemes.length) {
22
+ throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The MERGE statement is complete but there are additional tokens.`);
23
+ }
24
+ return result.value;
25
+ }
26
+ /**
27
+ * Parse from lexeme array (for internal use and tests).
28
+ */
29
+ static parseFromLexeme(lexemes, index) {
30
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
31
+ let idx = index;
32
+ // Parse optional WITH clause wrapping the MERGE statement for CTE support.
33
+ let withClause = null;
34
+ if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) === "with") {
35
+ const withResult = WithClauseParser.parseFromLexeme(lexemes, idx);
36
+ withClause = withResult.value;
37
+ idx = withResult.newIndex;
38
+ }
39
+ // Ensure the statement begins with MERGE INTO.
40
+ const mergeKeywordLexeme = lexemes[idx];
41
+ const mergeKeywordComments = extractLexemeComments(mergeKeywordLexeme);
42
+ if ((mergeKeywordLexeme === null || mergeKeywordLexeme === void 0 ? void 0 : mergeKeywordLexeme.value) !== "merge into") {
43
+ const actual = (_c = (_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : "end of input";
44
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected 'MERGE INTO' but found '${actual}'.`);
45
+ }
46
+ idx++;
47
+ // Parse target source expression (table or alias assignment).
48
+ const targetResult = SourceExpressionParser.parseFromLexeme(lexemes, idx);
49
+ const target = targetResult.value;
50
+ idx = targetResult.newIndex;
51
+ // Attach inline comments following MERGE INTO to the target source.
52
+ this.addUniquePositionedComments(target.datasource, "before", mergeKeywordComments.after);
53
+ // Consume USING clause introducing the source relation.
54
+ if (((_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value) !== "using") {
55
+ const actual = (_f = (_e = lexemes[idx]) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : "end of input";
56
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected 'USING' but found '${actual}'.`);
57
+ }
58
+ idx++;
59
+ // Parse source expression providing the dataset to merge with target.
60
+ const sourceResult = SourceExpressionParser.parseFromLexeme(lexemes, idx);
61
+ const source = sourceResult.value;
62
+ idx = sourceResult.newIndex;
63
+ // Require ON clause defining the match predicate.
64
+ if (((_g = lexemes[idx]) === null || _g === void 0 ? void 0 : _g.value) !== "on") {
65
+ const actual = (_j = (_h = lexemes[idx]) === null || _h === void 0 ? void 0 : _h.value) !== null && _j !== void 0 ? _j : "end of input";
66
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected 'ON' but found '${actual}'.`);
67
+ }
68
+ idx++;
69
+ // Parse ON condition allowing any valid boolean expression.
70
+ const onConditionResult = ValueParser.parseFromLexeme(lexemes, idx);
71
+ const onCondition = onConditionResult.value;
72
+ idx = onConditionResult.newIndex;
73
+ // Accumulate WHEN clauses that describe matched and unmatched behaviors.
74
+ const whenResult = this.parseWhenClauses(lexemes, idx);
75
+ if (whenResult.clauses.length === 0) {
76
+ throw new Error("[MergeQueryParser] MERGE statement must contain at least one WHEN clause.");
77
+ }
78
+ const mergeQuery = new MergeQuery({
79
+ withClause,
80
+ target,
81
+ source,
82
+ onCondition,
83
+ whenClauses: whenResult.clauses
84
+ });
85
+ // Preserve leading comments that precede the MERGE keyword.
86
+ this.addUniquePositionedComments(mergeQuery, "before", mergeKeywordComments.before);
87
+ return {
88
+ value: mergeQuery,
89
+ newIndex: whenResult.newIndex
90
+ };
91
+ }
92
+ static parseWhenClauses(lexemes, index) {
93
+ var _a, _b;
94
+ const clauses = [];
95
+ let idx = index;
96
+ // Iterate until no further WHEN keyword is found.
97
+ while (this.getLowerValue(lexemes[idx]) === "when") {
98
+ idx++;
99
+ // Determine the match type (matched, not matched, not matched by ...)
100
+ const { matchType, newIndex: matchIndex } = this.parseMatchType(lexemes, idx);
101
+ idx = matchIndex;
102
+ // Parse optional AND condition that narrows the clause applicability.
103
+ let additionalCondition = null;
104
+ if (this.getLowerValue(lexemes[idx]) === "and") {
105
+ idx++;
106
+ const conditionResult = ValueParser.parseFromLexeme(lexemes, idx);
107
+ additionalCondition = conditionResult.value;
108
+ idx = conditionResult.newIndex;
109
+ }
110
+ // Expect THEN before capturing the action body.
111
+ const thenLexeme = lexemes[idx];
112
+ if (this.getLowerValue(thenLexeme) !== "then") {
113
+ const actual = (_a = thenLexeme === null || thenLexeme === void 0 ? void 0 : thenLexeme.value) !== null && _a !== void 0 ? _a : "end of input";
114
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected 'THEN' but found '${actual}'.`);
115
+ }
116
+ const thenComments = extractLexemeComments(thenLexeme);
117
+ const commentsBeforeThen = [];
118
+ const precedingLexeme = lexemes[idx - 1];
119
+ if (precedingLexeme) {
120
+ const precedingComments = extractLexemeComments(precedingLexeme);
121
+ this.mergeUnique(commentsBeforeThen, precedingComments.after);
122
+ }
123
+ this.mergeUnique(commentsBeforeThen, thenComments.before);
124
+ idx++;
125
+ // Dispatch to clause-specific action parser with comments that follow THEN.
126
+ const actionResult = this.parseAction(lexemes, idx, (_b = thenComments.after) !== null && _b !== void 0 ? _b : []);
127
+ idx = actionResult.newIndex;
128
+ const whenClause = new MergeWhenClause(matchType, actionResult.action, additionalCondition);
129
+ whenClause.addThenLeadingComments(commentsBeforeThen);
130
+ clauses.push(whenClause);
131
+ }
132
+ return { clauses, newIndex: idx };
133
+ }
134
+ static parseMatchType(lexemes, index) {
135
+ var _a, _b;
136
+ let idx = index;
137
+ const value = this.getLowerValue(lexemes[idx]);
138
+ // Handle WHEN MATCHED scenario directly.
139
+ if (value === "matched") {
140
+ idx++;
141
+ return { matchType: "matched", newIndex: idx };
142
+ }
143
+ // Handle the different NOT MATCHED variants (tokenized as atomic commands).
144
+ if (value === "not matched") {
145
+ idx++;
146
+ let matchType = "not_matched";
147
+ return { matchType, newIndex: idx };
148
+ }
149
+ if (value === "not matched by source") {
150
+ idx++;
151
+ return { matchType: "not_matched_by_source", newIndex: idx };
152
+ }
153
+ if (value === "not matched by target") {
154
+ idx++;
155
+ return { matchType: "not_matched_by_target", newIndex: idx };
156
+ }
157
+ const actual = (_b = (_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : "end of input";
158
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected 'MATCHED' or 'NOT MATCHED' but found '${actual}'.`);
159
+ }
160
+ static parseAction(lexemes, index, leadingComments = []) {
161
+ var _a;
162
+ let idx = index;
163
+ const token = lexemes[idx];
164
+ if (!token) {
165
+ throw new Error("[MergeQueryParser] Unexpected end of input while parsing WHEN clause action.");
166
+ }
167
+ const tokenValue = token.value.toLowerCase();
168
+ const tokenComments = extractLexemeComments(token);
169
+ const actionLeadingComments = [];
170
+ this.mergeUnique(actionLeadingComments, leadingComments);
171
+ this.mergeUnique(actionLeadingComments, tokenComments.before);
172
+ // Handle UPDATE branches (accepting 'update' or 'update set').
173
+ if (tokenValue === "update" || tokenValue === "update set") {
174
+ const expectSetKeyword = tokenValue === "update";
175
+ idx++;
176
+ const pendingSetClauseComments = tokenComments.after;
177
+ const setResult = this.parseSetClause(lexemes, idx, expectSetKeyword, pendingSetClauseComments);
178
+ idx = setResult.newIndex;
179
+ // Allow optional WHERE predicate to further limit updated rows.
180
+ let whereClause = null;
181
+ if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) === "where") {
182
+ const whereResult = WhereClauseParser.parseFromLexeme(lexemes, idx);
183
+ whereClause = whereResult.value;
184
+ idx = whereResult.newIndex;
185
+ }
186
+ const action = new MergeUpdateAction(setResult.setClause, whereClause);
187
+ this.addUniquePositionedComments(action, "before", actionLeadingComments);
188
+ return {
189
+ action,
190
+ newIndex: idx
191
+ };
192
+ }
193
+ // Handle DELETE (optional WHERE clause mirrors UPDATE behavior).
194
+ if (tokenValue === "delete") {
195
+ idx++;
196
+ let whereClause = null;
197
+ if (this.getLowerValue(lexemes[idx]) === "where") {
198
+ const whereResult = WhereClauseParser.parseFromLexeme(lexemes, idx);
199
+ whereClause = whereResult.value;
200
+ idx = whereResult.newIndex;
201
+ }
202
+ const action = new MergeDeleteAction(whereClause);
203
+ this.addUniquePositionedComments(action, "before", actionLeadingComments);
204
+ this.addUniquePositionedComments(action, "after", tokenComments.after);
205
+ return {
206
+ action,
207
+ newIndex: idx
208
+ };
209
+ }
210
+ // Interpret DO NOTHING keyword sequence.
211
+ if (tokenValue === "do nothing") {
212
+ idx++;
213
+ const action = new MergeDoNothingAction();
214
+ this.addUniquePositionedComments(action, "before", actionLeadingComments);
215
+ this.addUniquePositionedComments(action, "after", tokenComments.after);
216
+ return { action, newIndex: idx };
217
+ }
218
+ if (tokenValue === "insert default values") {
219
+ idx++;
220
+ const columnResult = this.parseInsertColumnProjection(lexemes, idx, tokenComments.after);
221
+ idx = columnResult.newIndex;
222
+ const action = new MergeInsertAction({
223
+ columns: columnResult.columns,
224
+ defaultValues: true
225
+ });
226
+ this.addUniquePositionedComments(action, "before", actionLeadingComments);
227
+ this.addUniquePositionedComments(action, "after", columnResult.trailingComments);
228
+ return {
229
+ action,
230
+ newIndex: idx
231
+ };
232
+ }
233
+ // Parse INSERT clauses including column projection and VALUES/default values.
234
+ if (tokenValue === "insert") {
235
+ idx++;
236
+ const insertResult = this.parseInsertAction(lexemes, idx, {
237
+ pendingCommentsAfterInsert: tokenComments.after
238
+ });
239
+ this.addUniquePositionedComments(insertResult.action, "before", actionLeadingComments);
240
+ return insertResult;
241
+ }
242
+ const actual = token.value;
243
+ throw new Error(`[MergeQueryParser] Unsupported action '${actual}'. Only UPDATE, DELETE, INSERT, and DO NOTHING are supported within MERGE WHEN clauses.`);
244
+ }
245
+ static parseSetClause(lexemes, index, expectSetKeyword, pendingCommentsAfterUpdate = []) {
246
+ var _a, _b, _c, _d, _e, _f;
247
+ let idx = index;
248
+ // Capture comments that accompany the SET keyword so they can be reapplied later.
249
+ let setKeywordComments = extractLexemeComments(lexemes[idx]);
250
+ if (expectSetKeyword) {
251
+ if (this.getLowerValue(lexemes[idx]) !== "set") {
252
+ const actual = (_b = (_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : "end of input";
253
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected 'SET' but found '${actual}'.`);
254
+ }
255
+ idx++;
256
+ }
257
+ else if (this.getLowerValue(lexemes[idx]) === "set") {
258
+ setKeywordComments = extractLexemeComments(lexemes[idx]);
259
+ idx++;
260
+ }
261
+ else {
262
+ setKeywordComments = { before: [], after: [] };
263
+ }
264
+ const items = [];
265
+ let pendingBeforeForNext = [];
266
+ // Comments trailing UPDATE or SET precede the first assignment.
267
+ this.mergeUnique(pendingBeforeForNext, pendingCommentsAfterUpdate);
268
+ this.mergeUnique(pendingBeforeForNext, setKeywordComments.after);
269
+ // Parse comma-separated column assignments.
270
+ while (idx < lexemes.length) {
271
+ const currentLexeme = lexemes[idx];
272
+ if (!currentLexeme) {
273
+ break;
274
+ }
275
+ // Stop when we encounter tokens that belong to the next clause (e.g., WHERE or WHEN).
276
+ if (this.isSetClauseTerminator(currentLexeme)) {
277
+ break;
278
+ }
279
+ if (!(currentLexeme.type & (TokenType.Identifier | TokenType.Function | TokenType.Type | TokenType.OpenBracket))) {
280
+ break;
281
+ }
282
+ const columnComments = extractLexemeComments(currentLexeme);
283
+ const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, idx);
284
+ idx = newIndex;
285
+ if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) !== TokenType.Operator || lexemes[idx].value !== "=") {
286
+ const actual = (_e = (_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : "end of input";
287
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected '=' in SET clause but found '${actual}'.`);
288
+ }
289
+ const equalsLexeme = lexemes[idx];
290
+ const equalsComments = extractLexemeComments(equalsLexeme);
291
+ idx++;
292
+ const valueResult = ValueParser.parseFromLexeme(lexemes, idx);
293
+ idx = valueResult.newIndex;
294
+ const setItem = new SetClauseItem({ namespaces, column: name }, valueResult.value);
295
+ // Move buffered comments to the column identifier before processing the assignment.
296
+ const beforeComments = [];
297
+ this.mergeUnique(beforeComments, pendingBeforeForNext);
298
+ this.mergeUnique(beforeComments, columnComments.before);
299
+ this.addUniquePositionedComments(name, "before", beforeComments);
300
+ pendingBeforeForNext = [];
301
+ // Keep trailing identifier comments attached to the column token.
302
+ this.addUniquePositionedComments(name, "after", columnComments.after);
303
+ // Preserve comments embedded around the '=' operator.
304
+ this.addUniquePositionedComments(setItem, "after", equalsComments.before);
305
+ this.addUniquePositionedComments(valueResult.value, "before", equalsComments.after);
306
+ items.push(setItem);
307
+ if (((_f = lexemes[idx]) === null || _f === void 0 ? void 0 : _f.type) === TokenType.Comma) {
308
+ const commaLexeme = lexemes[idx];
309
+ const commaComments = extractLexemeComments(commaLexeme);
310
+ idx++;
311
+ // Comments before the comma belong to the current assignment.
312
+ this.addUniquePositionedComments(setItem, "after", commaComments.before);
313
+ // Comments after the comma should precede the following assignment.
314
+ pendingBeforeForNext = [];
315
+ this.mergeUnique(pendingBeforeForNext, commaComments.after);
316
+ continue;
317
+ }
318
+ break;
319
+ }
320
+ if (pendingBeforeForNext.length > 0 && items.length > 0) {
321
+ this.addUniquePositionedComments(items[items.length - 1], "after", pendingBeforeForNext);
322
+ }
323
+ if (items.length === 0) {
324
+ throw new Error("[MergeQueryParser] SET clause must contain at least one column assignment.");
325
+ }
326
+ const setClause = new SetClause(items);
327
+ // Any comments before SET belong in front of the entire clause.
328
+ this.addUniquePositionedComments(setClause, "before", setKeywordComments.before);
329
+ return { setClause, newIndex: idx };
330
+ }
331
+ static parseInsertAction(lexemes, index, options) {
332
+ var _a, _b, _c;
333
+ let idx = index;
334
+ const pendingAfterInsert = (_a = options === null || options === void 0 ? void 0 : options.pendingCommentsAfterInsert) !== null && _a !== void 0 ? _a : [];
335
+ // Parse column projection and capture any comments that should precede VALUES.
336
+ const columnResult = this.parseInsertColumnProjection(lexemes, idx, pendingAfterInsert);
337
+ let columns = columnResult.columns;
338
+ idx = columnResult.newIndex;
339
+ let pendingBeforeValues = columnResult.trailingComments;
340
+ // Parse VALUES (...) payload referencing source columns.
341
+ if (this.getLowerValue(lexemes[idx]) === "values") {
342
+ const valuesLexeme = lexemes[idx];
343
+ const valuesComments = extractLexemeComments(valuesLexeme);
344
+ idx++;
345
+ // Comments carried forward should appear before the tuple list.
346
+ const beforeValuesComments = [];
347
+ this.mergeUnique(beforeValuesComments, pendingBeforeValues);
348
+ this.mergeUnique(beforeValuesComments, valuesComments.before);
349
+ const valuesResult = ValueParser.parseArgument(TokenType.OpenParen, TokenType.CloseParen, lexemes, idx);
350
+ idx = valuesResult.newIndex;
351
+ if (!(valuesResult.value instanceof ValueList)) {
352
+ throw new Error("[MergeQueryParser] Unexpected VALUES payload. Expected a parenthesized value list.");
353
+ }
354
+ const valueList = valuesResult.value;
355
+ const closingParenComments = extractLexemeComments(lexemes[idx - 1]);
356
+ this.addUniquePositionedComments(valueList, "after", closingParenComments.after);
357
+ this.addUniquePositionedComments(valueList, "after", valuesComments.after);
358
+ const action = new MergeInsertAction({
359
+ columns,
360
+ values: valueList
361
+ });
362
+ action.addValuesLeadingComments(beforeValuesComments);
363
+ return {
364
+ action,
365
+ newIndex: idx
366
+ };
367
+ }
368
+ const actual = (_c = (_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : "end of input";
369
+ throw new Error(`[MergeQueryParser] Unsupported INSERT payload '${actual}'. Use VALUES (...) or DEFAULT VALUES.`);
370
+ }
371
+ static parseInsertColumnProjection(lexemes, index, pendingBeforeFirstColumn) {
372
+ var _a, _b, _c, _d, _e;
373
+ let idx = index;
374
+ // Without parentheses there is no column projection, so pass comments forward to VALUES.
375
+ if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== TokenType.OpenParen) {
376
+ return {
377
+ columns: null,
378
+ newIndex: idx,
379
+ trailingComments: [...pendingBeforeFirstColumn]
380
+ };
381
+ }
382
+ const openParenLexeme = lexemes[idx];
383
+ const parenComments = extractLexemeComments(openParenLexeme);
384
+ idx++;
385
+ const columns = [];
386
+ let pendingBeforeForNext = [];
387
+ // Seed the first identifier with comments that trail INSERT or the opening parenthesis.
388
+ this.mergeUnique(pendingBeforeForNext, pendingBeforeFirstColumn);
389
+ this.mergeUnique(pendingBeforeForNext, parenComments.before);
390
+ this.mergeUnique(pendingBeforeForNext, parenComments.after);
391
+ while (idx < lexemes.length && (lexemes[idx].type & TokenType.Identifier)) {
392
+ const columnLexeme = lexemes[idx];
393
+ const columnComments = extractLexemeComments(columnLexeme);
394
+ const column = new IdentifierString(columnLexeme.value);
395
+ // Move buffered comments so they precede the current identifier.
396
+ const beforeComments = [];
397
+ this.mergeUnique(beforeComments, pendingBeforeForNext);
398
+ this.mergeUnique(beforeComments, columnComments.before);
399
+ this.addUniquePositionedComments(column, "before", beforeComments);
400
+ pendingBeforeForNext = [];
401
+ // Preserve comments that trail the identifier itself.
402
+ this.addUniquePositionedComments(column, "after", columnComments.after);
403
+ columns.push(column);
404
+ idx++;
405
+ if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === TokenType.Comma) {
406
+ const commaLexeme = lexemes[idx];
407
+ const commaComments = extractLexemeComments(commaLexeme);
408
+ idx++;
409
+ // Attach comma-leading comments to the current column.
410
+ this.addUniquePositionedComments(column, "after", commaComments.before);
411
+ // Comments after the comma prepare the next identifier.
412
+ pendingBeforeForNext = [];
413
+ this.mergeUnique(pendingBeforeForNext, commaComments.after);
414
+ continue;
415
+ }
416
+ break;
417
+ }
418
+ if (pendingBeforeForNext.length > 0 && columns.length > 0) {
419
+ this.addUniquePositionedComments(columns[columns.length - 1], "after", pendingBeforeForNext);
420
+ pendingBeforeForNext = [];
421
+ }
422
+ if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) !== TokenType.CloseParen) {
423
+ const actual = (_e = (_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : "end of input";
424
+ throw new Error(`[MergeQueryParser] Syntax error at position ${idx}: expected ')' after column list but found '${actual}'.`);
425
+ }
426
+ const closeParenLexeme = lexemes[idx];
427
+ const closeParenComments = extractLexemeComments(closeParenLexeme);
428
+ idx++;
429
+ if (closeParenComments.before.length > 0 && columns.length > 0) {
430
+ this.addUniquePositionedComments(columns[columns.length - 1], "after", closeParenComments.before);
431
+ }
432
+ const trailingComments = [];
433
+ this.mergeUnique(trailingComments, closeParenComments.after);
434
+ this.mergeUnique(trailingComments, pendingBeforeForNext);
435
+ return {
436
+ columns: columns.length > 0 ? columns : [],
437
+ newIndex: idx,
438
+ trailingComments
439
+ };
440
+ }
441
+ static isSetClauseTerminator(lexeme) {
442
+ if (!lexeme) {
443
+ return false;
444
+ }
445
+ // Normalize to lowercase so we can compare mixed-case keywords safely.
446
+ const value = this.getLowerValue(lexeme);
447
+ if (!value) {
448
+ return false;
449
+ }
450
+ return value === "where" || value === "from" || value === "returning" || value === "when";
451
+ }
452
+ static mergeUnique(target, source) {
453
+ if (!source || source.length === 0) {
454
+ return;
455
+ }
456
+ for (const comment of source) {
457
+ if (!target.includes(comment)) {
458
+ target.push(comment);
459
+ }
460
+ }
461
+ }
462
+ static addUniquePositionedComments(component, position, comments) {
463
+ if (!component || !comments || comments.length === 0) {
464
+ return;
465
+ }
466
+ const existing = component.getPositionedComments(position);
467
+ const newOnes = comments.filter(comment => !existing.includes(comment));
468
+ if (newOnes.length > 0) {
469
+ component.addPositionedComments(position, newOnes);
470
+ }
471
+ }
472
+ static getLowerValue(lexeme) {
473
+ if (!lexeme) {
474
+ return null;
475
+ }
476
+ return typeof lexeme.value === "string" ? lexeme.value.toLowerCase() : null;
477
+ }
478
+ }
479
+ //# sourceMappingURL=MergeQueryParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MergeQueryParser.js","sourceRoot":"","sources":["../../../../src/parsers/MergeQueryParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAkB,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAClK,OAAO,EAAE,SAAS,EAAE,aAAa,EAA6C,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAkB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,OAAO,gBAAgB;IACzB;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,oEAAoE,CAAC,CAAC;QAC3L,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,2EAA2E;QAC3E,IAAI,UAAU,GAAsB,IAAI,CAAC;QACzC,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,MAAK,MAAM,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;YAC9B,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;QAC9B,CAAC;QAED,+CAA+C;QAC/C,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QACvE,IAAI,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,KAAK,MAAK,YAAY,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,sCAAsC,MAAM,IAAI,CAAC,CAAC;QACxH,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,8DAA8D;QAC9D,MAAM,YAAY,GAAG,sBAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QAClC,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;QAE5B,oEAAoE;QACpE,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAE1F,wDAAwD;QACxD,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,MAAK,OAAO,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,iCAAiC,MAAM,IAAI,CAAC,CAAC;QACnH,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,sEAAsE;QACtE,MAAM,YAAY,GAAG,sBAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QAClC,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;QAE5B,kDAAkD;QAClD,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,MAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,8BAA8B,MAAM,IAAI,CAAC,CAAC;QAChH,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC;QAC5C,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC;QAEjC,yEAAyE;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;YAC9B,UAAU;YACV,MAAM;YACN,MAAM;YACN,WAAW;YACX,WAAW,EAAE,UAAU,CAAC,OAAO;SAClC,CAAC,CAAC;QAEH,4DAA4D;QAC5D,IAAI,CAAC,2BAA2B,CAAC,UAAU,EAAE,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAEpF,OAAO;YACH,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAChC,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,OAAiB,EAAE,KAAa;;QAC5D,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,kDAAkD;QAClD,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACjD,GAAG,EAAE,CAAC;YAEN,sEAAsE;YACtE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9E,GAAG,GAAG,UAAU,CAAC;YAEjB,sEAAsE;YACtE,IAAI,mBAAmB,GAA0B,IAAI,CAAC;YACtD,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC7C,GAAG,EAAE,CAAC;gBACN,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAClE,mBAAmB,GAAG,eAAe,CAAC,KAAK,CAAC;gBAC5C,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC;YACnC,CAAC;YAED,gDAAgD;YAChD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,mCAAI,cAAc,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,gCAAgC,MAAM,IAAI,CAAC,CAAC;YAClH,CAAC;YACD,MAAM,YAAY,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,kBAAkB,GAAa,EAAE,CAAC;YACxC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,eAAe,EAAE,CAAC;gBAClB,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBACjE,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1D,GAAG,EAAE,CAAC;YAEN,4EAA4E;YAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAA,YAAY,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC;YAC9E,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;YAE5B,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC5F,UAAU,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IACtC,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/C,yCAAyC;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACnD,CAAC;QAED,4EAA4E;QAC5E,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC1B,GAAG,EAAE,CAAC;YACN,IAAI,SAAS,GAAmB,aAAa,CAAC;YAE9C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,KAAK,uBAAuB,EAAE,CAAC;YACpC,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACjE,CAAC;QAED,IAAI,KAAK,KAAK,uBAAuB,EAAE,CAAC;YACpC,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,oDAAoD,MAAM,IAAI,CAAC,CAAC;IACtI,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,OAAiB,EAAE,KAAa,EAAE,kBAA4B,EAAE;;QACvF,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,qBAAqB,GAAa,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAE9D,+DAA+D;QAC/D,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YACzD,MAAM,gBAAgB,GAAG,UAAU,KAAK,QAAQ,CAAC;YACjD,GAAG,EAAE,CAAC;YACN,MAAM,wBAAwB,GAAG,aAAa,CAAC,KAAK,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;YAChG,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;YAEzB,gEAAgE;YAChE,IAAI,WAAW,GAAuB,IAAI,CAAC;YAC3C,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,MAAK,OAAO,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACpE,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;gBAChC,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;YAC/B,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvE,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YAE1E,OAAO;gBACH,MAAM;gBACN,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;QAED,iEAAiE;QACjE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1B,GAAG,EAAE,CAAC;YACN,IAAI,WAAW,GAAuB,IAAI,CAAC;YAC3C,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACpE,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;gBAChC,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;YAC/B,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YAC1E,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YAEvE,OAAO;gBACH,MAAM;gBACN,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;QAED,yCAAyC;QACzC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAC9B,GAAG,EAAE,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC1C,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YAC1E,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,UAAU,KAAK,uBAAuB,EAAE,CAAC;YACzC,GAAG,EAAE,CAAC;YACN,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YACzF,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;YAE5B,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;gBACjC,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,aAAa,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YAC1E,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACjF,OAAO;gBACH,MAAM;gBACN,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;QAED,8EAA8E;QAC9E,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1B,GAAG,EAAE,CAAC;YACN,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtD,0BAA0B,EAAE,aAAa,CAAC,KAAK;aAClD,CAAC,CAAC;YACH,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YACvF,OAAO,YAAY,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,yFAAyF,CAAC,CAAC;IAC/J,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,OAAiB,EAAE,KAAa,EAAE,gBAAyB,EAAE,6BAAuC,EAAE;;QAChI,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,kFAAkF;QAClF,IAAI,kBAAkB,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,gBAAgB,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,+BAA+B,MAAM,IAAI,CAAC,CAAC;YACjH,CAAC;YACD,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACpD,kBAAkB,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,kBAAkB,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACnD,CAAC;QAED,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,IAAI,oBAAoB,GAAa,EAAE,CAAC;QAExC,gEAAgE;QAChE,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,0BAA0B,CAAC,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAEjE,4CAA4C;QAC5C,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAEnC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,MAAM;YACV,CAAC;YAED,sFAAsF;YACtF,IAAI,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC5C,MAAM;YACV,CAAC;YAED,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBAC/G,MAAM;YACV,CAAC;YAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpF,GAAG,GAAG,QAAQ,CAAC;YAEf,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC1E,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,2CAA2C,MAAM,IAAI,CAAC,CAAC;YAC7H,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC3D,GAAG,EAAE,CAAC;YAEN,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9D,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;YAE3B,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;YAEnF,oFAAoF;YACpF,MAAM,cAAc,GAAa,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;YACjE,oBAAoB,GAAG,EAAE,CAAC;YAE1B,kEAAkE;YAClE,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;YAEtE,sDAAsD;YACtD,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;YAEpF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEpB,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBACjC,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;gBACzD,GAAG,EAAE,CAAC;gBAEN,8DAA8D;gBAC9D,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;gBAEzE,oEAAoE;gBACpE,oBAAoB,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5D,SAAS;YACb,CAAC;YACD,MAAM;QACV,CAAC;QAED,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;QAEvC,gEAAgE;QAChE,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,OAAiB,EAAE,KAAa,EAAE,OAAmD;;QAClH,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,MAAM,kBAAkB,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,0BAA0B,mCAAI,EAAE,CAAC;QAErE,+EAA+E;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxF,IAAI,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACnC,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;QAC5B,IAAI,mBAAmB,GAAG,YAAY,CAAC,gBAAgB,CAAC;QAExD,yDAAyD;QACzD,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC3D,GAAG,EAAE,CAAC;YAEN,gEAAgE;YAChE,MAAM,oBAAoB,GAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,YAAY,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YACxG,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;YAE5B,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,YAAY,SAAS,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;YAC1G,CAAC;YAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;YACrC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;gBACjC,OAAO;gBACP,MAAM,EAAE,SAAS;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,CAAC;YAEtD,OAAO;gBACH,MAAM;gBACN,QAAQ,EAAE,GAAG;aAChB,CAAC;QACN,CAAC;QAED,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,wCAAwC,CAAC,CAAC;IACtH,CAAC;IAEO,MAAM,CAAC,2BAA2B,CACtC,OAAiB,EACjB,KAAa,EACb,wBAAkC;;QAElC,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,yFAAyF;QACzF,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,SAAS,EAAE,CAAC;YAC7C,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,GAAG;gBACb,gBAAgB,EAAE,CAAC,GAAG,wBAAwB,CAAC;aAClD,CAAC;QACN,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAC7D,GAAG,EAAE,CAAC;QAEN,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,IAAI,oBAAoB,GAAa,EAAE,CAAC;QAExC,wFAAwF;QACxF,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,wBAAwB,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAE5D,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACxE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAExD,iEAAiE;YACjE,MAAM,cAAc,GAAa,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;YACnE,oBAAoB,GAAG,EAAE,CAAC;YAE1B,sDAAsD;YACtD,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;YAExE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,GAAG,EAAE,CAAC;YAEN,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBACjC,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;gBACzD,GAAG,EAAE,CAAC;gBAEN,uDAAuD;gBACvD,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;gBAExE,wDAAwD;gBACxD,oBAAoB,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5D,SAAS;YACb,CAAC;YAED,MAAM;QACV,CAAC;QAED,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;YAC7F,oBAAoB,GAAG,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,mCAAI,cAAc,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,+CAA+C,MAAM,IAAI,CAAC,CAAC;QACjI,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QACnE,GAAG,EAAE,CAAC;QAEN,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtG,CAAC;QAED,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAEzD,OAAO;YACH,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC1C,QAAQ,EAAE,GAAG;YACb,gBAAgB;SACnB,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,MAAe;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,uEAAuE;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,MAAM,CAAC;IAC9F,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,MAAgB,EAAE,MAA4B;QACrE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,2BAA2B,CAAC,SAA0C,EAAE,QAA4B,EAAE,QAA8B;QAC/I,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,MAAe;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,CAAC;CACJ"}
@@ -2,30 +2,73 @@
2
2
  import { TokenType } from "../models/Lexeme";
3
3
  import { IdentifierString } from "../models/ValueComponent";
4
4
  import { ReturningClause } from "../models/Clause";
5
+ import { extractLexemeComments } from "./utils/LexemeCommentUtils";
5
6
  export class ReturningClauseParser {
6
7
  /**
7
8
  * Parse RETURNING clause from lexemes, starting at the given index.
8
9
  * Returns a ReturningClause instance and the new index after parsing.
9
10
  */
10
11
  static parseFromLexeme(lexemes, index) {
11
- var _a, _b, _c;
12
+ var _a, _b, _c, _d, _e, _f;
12
13
  let idx = index;
13
14
  if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) !== "returning") {
14
15
  throw new Error(`Syntax error at position ${idx}: Expected 'RETURNING' but found '${(_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value}'.`);
15
16
  }
17
+ const returningLexeme = lexemes[idx];
18
+ const returningComments = extractLexemeComments(returningLexeme);
16
19
  idx++;
17
20
  const columns = [];
18
- while (idx < lexemes.length && lexemes[idx].type === TokenType.Identifier) {
19
- columns.push(new IdentifierString(lexemes[idx].value));
21
+ // Track inline comments that should precede the next returning column.
22
+ let pendingBeforeForNext = [...returningComments.after];
23
+ while (idx < lexemes.length) {
24
+ const lexeme = lexemes[idx];
25
+ let column = null;
26
+ if (lexeme.type & TokenType.Identifier) {
27
+ column = new IdentifierString(lexeme.value);
28
+ }
29
+ else if (lexeme.value === "*") {
30
+ column = new IdentifierString("*");
31
+ }
32
+ if (!column) {
33
+ break;
34
+ }
35
+ const columnComments = extractLexemeComments(lexeme);
36
+ const beforeComments = [];
37
+ if (pendingBeforeForNext.length > 0) {
38
+ beforeComments.push(...pendingBeforeForNext);
39
+ }
40
+ if (columnComments.before.length > 0) {
41
+ beforeComments.push(...columnComments.before);
42
+ }
43
+ if (beforeComments.length > 0) {
44
+ column.addPositionedComments("before", beforeComments);
45
+ }
46
+ if (columnComments.after.length > 0) {
47
+ column.addPositionedComments("after", columnComments.after);
48
+ }
49
+ columns.push(column);
50
+ pendingBeforeForNext = [];
20
51
  idx++;
21
52
  if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === TokenType.Comma) {
53
+ const commaComments = extractLexemeComments(lexemes[idx]);
54
+ pendingBeforeForNext = [...commaComments.after];
22
55
  idx++;
56
+ continue;
23
57
  }
24
- else {
25
- break;
26
- }
58
+ break;
59
+ }
60
+ if (pendingBeforeForNext.length > 0 && columns.length > 0) {
61
+ columns[columns.length - 1].addPositionedComments("after", pendingBeforeForNext);
62
+ }
63
+ if (columns.length === 0) {
64
+ const position = (_f = (_e = (_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.position) === null || _e === void 0 ? void 0 : _e.startPosition) !== null && _f !== void 0 ? _f : idx;
65
+ throw new Error(`[ReturningClauseParser] Expected a column or '*' after RETURNING at position ${position}.`);
66
+ }
67
+ const clause = new ReturningClause(columns);
68
+ if (returningComments.before.length > 0) {
69
+ clause.addPositionedComments("before", returningComments.before);
27
70
  }
28
- return { value: new ReturningClause(columns), newIndex: idx };
71
+ return { value: clause, newIndex: idx };
29
72
  }
30
73
  }
31
74
  //# sourceMappingURL=ReturningClauseParser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReturningClauseParser.js","sourceRoot":"","sources":["../../../../src/parsers/ReturningClauseParser.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,OAAO,qBAAqB;IAC9B;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,MAAK,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,qCAAqC,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,IAAI,CAAC,CAAC;QACjH,CAAC;QACD,GAAG,EAAE,CAAC;QACN,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,GAAG,EAAE,CAAC;YACN,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzC,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAClE,CAAC;CACJ"}
1
+ {"version":3,"file":"ReturningClauseParser.js","sourceRoot":"","sources":["../../../../src/parsers/ReturningClauseParser.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Distinct, DistinctOn, SelectClause, SelectItem } from "../models/Clause";
2
2
  import { TokenType } from "../models/Lexeme";
3
- import { ColumnReference } from "../models/ValueComponent";
3
+ import { ColumnReference, BinaryExpression } from "../models/ValueComponent";
4
4
  import { SqlTokenizer } from "./SqlTokenizer";
5
5
  import { ValueParser } from "./ValueParser";
6
6
  import { HintClause } from "../models/HintClause";
@@ -224,14 +224,14 @@ export class SelectItemParser {
224
224
  selectItem.value.positionedComments = null;
225
225
  }
226
226
  // Also clear positioned comments from nested IdentifierString (in QualifiedName)
227
- if (selectItem.value.constructor.name === 'ColumnReference') {
227
+ if (selectItem.value instanceof ColumnReference) {
228
228
  const columnRef = selectItem.value;
229
229
  if (columnRef.qualifiedName && columnRef.qualifiedName.name) {
230
230
  columnRef.qualifiedName.name.positionedComments = null;
231
231
  }
232
232
  }
233
233
  // Clear positioned comments from BinaryExpression children only to avoid duplication
234
- if (selectItem.value.constructor.name === 'BinaryExpression') {
234
+ if (selectItem.value instanceof BinaryExpression) {
235
235
  this.clearPositionedCommentsRecursively(selectItem.value);
236
236
  }
237
237
  }