rawsql-ts 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/LICENSE +21 -0
  2. package/dist/esm/index.js +11 -0
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/index.min.js +16 -16
  5. package/dist/esm/index.min.js.map +3 -3
  6. package/dist/esm/src/index.d.ts +12 -0
  7. package/dist/esm/src/index.js +11 -0
  8. package/dist/esm/src/index.js.map +1 -1
  9. package/dist/esm/src/models/Clause.d.ts +7 -3
  10. package/dist/esm/src/models/Clause.js +17 -4
  11. package/dist/esm/src/models/Clause.js.map +1 -1
  12. package/dist/esm/src/models/DDLStatements.d.ts +14 -2
  13. package/dist/esm/src/models/DDLStatements.js +12 -0
  14. package/dist/esm/src/models/DDLStatements.js.map +1 -1
  15. package/dist/esm/src/models/InsertQuery.d.ts +1 -4
  16. package/dist/esm/src/models/InsertQuery.js +3 -5
  17. package/dist/esm/src/models/InsertQuery.js.map +1 -1
  18. package/dist/esm/src/models/SqlPrintToken.d.ts +1 -0
  19. package/dist/esm/src/models/SqlPrintToken.js +1 -0
  20. package/dist/esm/src/models/SqlPrintToken.js.map +1 -1
  21. package/dist/esm/src/models/TableDefinitionModel.d.ts +39 -0
  22. package/dist/esm/src/models/TableDefinitionModel.js +77 -0
  23. package/dist/esm/src/models/TableDefinitionModel.js.map +1 -0
  24. package/dist/esm/src/models/ValuesQuery.d.ts +2 -0
  25. package/dist/esm/src/models/ValuesQuery.js +1 -0
  26. package/dist/esm/src/models/ValuesQuery.js.map +1 -1
  27. package/dist/esm/src/parsers/AlterTableParser.js +1 -1
  28. package/dist/esm/src/parsers/AlterTableParser.js.map +1 -1
  29. package/dist/esm/src/parsers/InsertQueryParser.js +4 -1
  30. package/dist/esm/src/parsers/InsertQueryParser.js.map +1 -1
  31. package/dist/esm/src/parsers/ReturningClauseParser.js +33 -47
  32. package/dist/esm/src/parsers/ReturningClauseParser.js.map +1 -1
  33. package/dist/esm/src/parsers/SqlParser.d.ts +0 -1
  34. package/dist/esm/src/parsers/SqlParser.js +44 -58
  35. package/dist/esm/src/parsers/SqlParser.js.map +1 -1
  36. package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +1 -0
  37. package/dist/esm/src/parsers/SqlPrintTokenParser.js +23 -5
  38. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  39. package/dist/esm/src/tokenReaders/LiteralTokenReader.js +7 -0
  40. package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  41. package/dist/esm/src/transformers/DDLDiffGenerator.d.ts +14 -0
  42. package/dist/esm/src/transformers/DDLDiffGenerator.js +197 -0
  43. package/dist/esm/src/transformers/DDLDiffGenerator.js.map +1 -0
  44. package/dist/esm/src/transformers/DDLGeneralizer.d.ts +13 -0
  45. package/dist/esm/src/transformers/DDLGeneralizer.js +98 -0
  46. package/dist/esm/src/transformers/DDLGeneralizer.js.map +1 -0
  47. package/dist/esm/src/transformers/DDLToFixtureConverter.d.ts +19 -0
  48. package/dist/esm/src/transformers/DDLToFixtureConverter.js +202 -0
  49. package/dist/esm/src/transformers/DDLToFixtureConverter.js.map +1 -0
  50. package/dist/esm/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
  51. package/dist/esm/src/transformers/DeleteResultSelectConverter.js +394 -0
  52. package/dist/esm/src/transformers/DeleteResultSelectConverter.js.map +1 -0
  53. package/dist/esm/src/transformers/FixtureCteBuilder.d.ts +60 -0
  54. package/dist/esm/src/transformers/FixtureCteBuilder.js +147 -0
  55. package/dist/esm/src/transformers/FixtureCteBuilder.js.map +1 -0
  56. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
  57. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
  58. package/dist/esm/src/transformers/InsertResultSelectConverter.d.ts +64 -0
  59. package/dist/esm/src/transformers/InsertResultSelectConverter.js +495 -0
  60. package/dist/esm/src/transformers/InsertResultSelectConverter.js.map +1 -0
  61. package/dist/esm/src/transformers/MergeResultSelectConverter.d.ts +38 -0
  62. package/dist/esm/src/transformers/MergeResultSelectConverter.js +306 -0
  63. package/dist/esm/src/transformers/MergeResultSelectConverter.js.map +1 -0
  64. package/dist/esm/src/transformers/QueryBuilder.d.ts +11 -0
  65. package/dist/esm/src/transformers/QueryBuilder.js +19 -3
  66. package/dist/esm/src/transformers/QueryBuilder.js.map +1 -1
  67. package/dist/esm/src/transformers/SelectResultSelectConverter.d.ts +10 -0
  68. package/dist/esm/src/transformers/SelectResultSelectConverter.js +32 -0
  69. package/dist/esm/src/transformers/SelectResultSelectConverter.js.map +1 -0
  70. package/dist/esm/src/transformers/SimulatedSelectConverter.d.ts +23 -0
  71. package/dist/esm/src/transformers/SimulatedSelectConverter.js +61 -0
  72. package/dist/esm/src/transformers/SimulatedSelectConverter.js.map +1 -0
  73. package/dist/esm/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
  74. package/dist/esm/src/transformers/UpdateResultSelectConverter.js +340 -0
  75. package/dist/esm/src/transformers/UpdateResultSelectConverter.js.map +1 -0
  76. package/dist/esm/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
  77. package/dist/esm/src/utils/SelectQueryWithClauseHelper.js +43 -0
  78. package/dist/esm/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
  79. package/dist/esm/src/utils/ValueComponentRewriter.d.ts +3 -0
  80. package/dist/esm/src/utils/ValueComponentRewriter.js +180 -0
  81. package/dist/esm/src/utils/ValueComponentRewriter.js.map +1 -0
  82. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  83. package/dist/formatters/OriginalFormatRestorer.js +139 -0
  84. package/dist/formatters/OriginalFormatRestorer.js.map +1 -0
  85. package/dist/index.js +144 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/index.min.js +17 -17
  88. package/dist/index.min.js.map +3 -3
  89. package/dist/models/BinarySelectQuery.js +198 -0
  90. package/dist/models/BinarySelectQuery.js.map +1 -0
  91. package/dist/models/CTEError.js +37 -0
  92. package/dist/models/CTEError.js.map +1 -0
  93. package/dist/models/Clause.js +535 -0
  94. package/dist/models/Clause.js.map +1 -0
  95. package/dist/models/CreateTableQuery.js +135 -0
  96. package/dist/models/CreateTableQuery.js.map +1 -0
  97. package/dist/models/DDLStatements.js +275 -0
  98. package/dist/models/DDLStatements.js.map +1 -0
  99. package/dist/models/DeleteQuery.js +20 -0
  100. package/dist/models/DeleteQuery.js.map +1 -0
  101. package/dist/models/FormattingLexeme.js +3 -0
  102. package/dist/models/FormattingLexeme.js.map +1 -0
  103. package/dist/models/HintClause.js +41 -0
  104. package/dist/models/HintClause.js.map +1 -0
  105. package/dist/models/InsertQuery.js +23 -0
  106. package/dist/models/InsertQuery.js.map +1 -0
  107. package/dist/models/KeywordTrie.js +54 -0
  108. package/dist/models/KeywordTrie.js.map +1 -0
  109. package/dist/models/Lexeme.js +22 -0
  110. package/dist/models/Lexeme.js.map +1 -0
  111. package/dist/models/MergeQuery.js +104 -0
  112. package/dist/models/MergeQuery.js.map +1 -0
  113. package/dist/models/SelectQuery.js +22 -0
  114. package/dist/models/SelectQuery.js.map +1 -0
  115. package/dist/models/SimpleSelectQuery.js +648 -0
  116. package/dist/models/SimpleSelectQuery.js.map +1 -0
  117. package/dist/models/SqlComponent.js +73 -0
  118. package/dist/models/SqlComponent.js.map +1 -0
  119. package/dist/models/SqlPrintToken.js +143 -0
  120. package/dist/models/SqlPrintToken.js.map +1 -0
  121. package/dist/models/TableDefinitionModel.js +86 -0
  122. package/dist/models/TableDefinitionModel.js.map +1 -0
  123. package/dist/models/UpdateQuery.js +29 -0
  124. package/dist/models/UpdateQuery.js.map +1 -0
  125. package/dist/models/ValueComponent.js +380 -0
  126. package/dist/models/ValueComponent.js.map +1 -0
  127. package/dist/models/ValuesQuery.js +62 -0
  128. package/dist/models/ValuesQuery.js.map +1 -0
  129. package/dist/parsers/AlterTableParser.js +490 -0
  130. package/dist/parsers/AlterTableParser.js.map +1 -0
  131. package/dist/parsers/AnalyzeStatementParser.js +94 -0
  132. package/dist/parsers/AnalyzeStatementParser.js.map +1 -0
  133. package/dist/parsers/CommandExpressionParser.js +213 -0
  134. package/dist/parsers/CommandExpressionParser.js.map +1 -0
  135. package/dist/parsers/CommonTableParser.js +177 -0
  136. package/dist/parsers/CommonTableParser.js.map +1 -0
  137. package/dist/parsers/CreateIndexParser.js +241 -0
  138. package/dist/parsers/CreateIndexParser.js.map +1 -0
  139. package/dist/parsers/CreateTableParser.js +738 -0
  140. package/dist/parsers/CreateTableParser.js.map +1 -0
  141. package/dist/parsers/DeleteClauseParser.js +37 -0
  142. package/dist/parsers/DeleteClauseParser.js.map +1 -0
  143. package/dist/parsers/DeleteQueryParser.js +77 -0
  144. package/dist/parsers/DeleteQueryParser.js.map +1 -0
  145. package/dist/parsers/DropConstraintParser.js +51 -0
  146. package/dist/parsers/DropConstraintParser.js.map +1 -0
  147. package/dist/parsers/DropIndexParser.js +73 -0
  148. package/dist/parsers/DropIndexParser.js.map +1 -0
  149. package/dist/parsers/DropTableParser.js +63 -0
  150. package/dist/parsers/DropTableParser.js.map +1 -0
  151. package/dist/parsers/ExplainStatementParser.js +189 -0
  152. package/dist/parsers/ExplainStatementParser.js.map +1 -0
  153. package/dist/parsers/FetchClauseParser.js +89 -0
  154. package/dist/parsers/FetchClauseParser.js.map +1 -0
  155. package/dist/parsers/ForClauseParser.js +58 -0
  156. package/dist/parsers/ForClauseParser.js.map +1 -0
  157. package/dist/parsers/FromClauseParser.js +54 -0
  158. package/dist/parsers/FromClauseParser.js.map +1 -0
  159. package/dist/parsers/FullNameParser.js +110 -0
  160. package/dist/parsers/FullNameParser.js.map +1 -0
  161. package/dist/parsers/FunctionExpressionParser.js +524 -0
  162. package/dist/parsers/FunctionExpressionParser.js.map +1 -0
  163. package/dist/parsers/GroupByParser.js +58 -0
  164. package/dist/parsers/GroupByParser.js.map +1 -0
  165. package/dist/parsers/HavingParser.js +36 -0
  166. package/dist/parsers/HavingParser.js.map +1 -0
  167. package/dist/parsers/IdentifierDecorator.js +17 -0
  168. package/dist/parsers/IdentifierDecorator.js.map +1 -0
  169. package/dist/parsers/IdentifierParser.js +15 -0
  170. package/dist/parsers/IdentifierParser.js.map +1 -0
  171. package/dist/parsers/InsertQueryParser.js +162 -0
  172. package/dist/parsers/InsertQueryParser.js.map +1 -0
  173. package/dist/parsers/JoinClauseParser.js +117 -0
  174. package/dist/parsers/JoinClauseParser.js.map +1 -0
  175. package/dist/parsers/JoinOnClauseParser.js +21 -0
  176. package/dist/parsers/JoinOnClauseParser.js.map +1 -0
  177. package/dist/parsers/JoinUsingClauseParser.js +23 -0
  178. package/dist/parsers/JoinUsingClauseParser.js.map +1 -0
  179. package/dist/parsers/KeywordParser.js +99 -0
  180. package/dist/parsers/KeywordParser.js.map +1 -0
  181. package/dist/parsers/LimitClauseParser.js +38 -0
  182. package/dist/parsers/LimitClauseParser.js.map +1 -0
  183. package/dist/parsers/LiteralParser.js +48 -0
  184. package/dist/parsers/LiteralParser.js.map +1 -0
  185. package/dist/parsers/MergeQueryParser.js +483 -0
  186. package/dist/parsers/MergeQueryParser.js.map +1 -0
  187. package/dist/parsers/OffsetClauseParser.js +42 -0
  188. package/dist/parsers/OffsetClauseParser.js.map +1 -0
  189. package/dist/parsers/OrderByClauseParser.js +108 -0
  190. package/dist/parsers/OrderByClauseParser.js.map +1 -0
  191. package/dist/parsers/OverExpressionParser.js +44 -0
  192. package/dist/parsers/OverExpressionParser.js.map +1 -0
  193. package/dist/parsers/ParameterDecorator.js +40 -0
  194. package/dist/parsers/ParameterDecorator.js.map +1 -0
  195. package/dist/parsers/ParameterExpressionParser.js +24 -0
  196. package/dist/parsers/ParameterExpressionParser.js.map +1 -0
  197. package/dist/parsers/ParenExpressionParser.js +109 -0
  198. package/dist/parsers/ParenExpressionParser.js.map +1 -0
  199. package/dist/parsers/ParseError.js +25 -0
  200. package/dist/parsers/ParseError.js.map +1 -0
  201. package/dist/parsers/PartitionByParser.js +53 -0
  202. package/dist/parsers/PartitionByParser.js.map +1 -0
  203. package/dist/parsers/ReturningClauseParser.js +64 -0
  204. package/dist/parsers/ReturningClauseParser.js.map +1 -0
  205. package/dist/parsers/SelectClauseParser.js +244 -0
  206. package/dist/parsers/SelectClauseParser.js.map +1 -0
  207. package/dist/parsers/SelectQueryParser.js +564 -0
  208. package/dist/parsers/SelectQueryParser.js.map +1 -0
  209. package/dist/parsers/SequenceParser.js +245 -0
  210. package/dist/parsers/SequenceParser.js.map +1 -0
  211. package/dist/parsers/SetClauseParser.js +125 -0
  212. package/dist/parsers/SetClauseParser.js.map +1 -0
  213. package/dist/parsers/SourceAliasExpressionParser.js +60 -0
  214. package/dist/parsers/SourceAliasExpressionParser.js.map +1 -0
  215. package/dist/parsers/SourceExpressionParser.js +69 -0
  216. package/dist/parsers/SourceExpressionParser.js.map +1 -0
  217. package/dist/parsers/SourceParser.js +144 -0
  218. package/dist/parsers/SourceParser.js.map +1 -0
  219. package/dist/parsers/SqlParser.js +431 -0
  220. package/dist/parsers/SqlParser.js.map +1 -0
  221. package/dist/parsers/SqlPrintTokenParser.js +3289 -0
  222. package/dist/parsers/SqlPrintTokenParser.js.map +1 -0
  223. package/dist/parsers/SqlTokenizer.js +553 -0
  224. package/dist/parsers/SqlTokenizer.js.map +1 -0
  225. package/dist/parsers/StringSpecifierExpressionParser.js +22 -0
  226. package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -0
  227. package/dist/parsers/UnaryExpressionParser.js +39 -0
  228. package/dist/parsers/UnaryExpressionParser.js.map +1 -0
  229. package/dist/parsers/UpdateClauseParser.js +21 -0
  230. package/dist/parsers/UpdateClauseParser.js.map +1 -0
  231. package/dist/parsers/UpdateQueryParser.js +98 -0
  232. package/dist/parsers/UpdateQueryParser.js.map +1 -0
  233. package/dist/parsers/UsingClauseParser.js +33 -0
  234. package/dist/parsers/UsingClauseParser.js.map +1 -0
  235. package/dist/parsers/ValueParser.js +562 -0
  236. package/dist/parsers/ValueParser.js.map +1 -0
  237. package/dist/parsers/ValuesQueryParser.js +112 -0
  238. package/dist/parsers/ValuesQueryParser.js.map +1 -0
  239. package/dist/parsers/WhereClauseParser.js +51 -0
  240. package/dist/parsers/WhereClauseParser.js.map +1 -0
  241. package/dist/parsers/WindowClauseParser.js +57 -0
  242. package/dist/parsers/WindowClauseParser.js.map +1 -0
  243. package/dist/parsers/WindowExpressionParser.js +163 -0
  244. package/dist/parsers/WindowExpressionParser.js.map +1 -0
  245. package/dist/parsers/WithClauseParser.js +165 -0
  246. package/dist/parsers/WithClauseParser.js.map +1 -0
  247. package/dist/parsers/utils/LexemeCommentUtils.js +29 -0
  248. package/dist/parsers/utils/LexemeCommentUtils.js.map +1 -0
  249. package/dist/reporting/models/DataFlowEdge.js +58 -0
  250. package/dist/reporting/models/DataFlowEdge.js.map +1 -0
  251. package/dist/reporting/models/DataFlowGraph.js +138 -0
  252. package/dist/reporting/models/DataFlowGraph.js.map +1 -0
  253. package/dist/reporting/models/DataFlowNode.js +148 -0
  254. package/dist/reporting/models/DataFlowNode.js.map +1 -0
  255. package/dist/reporting/services/CTEHandler.js +58 -0
  256. package/dist/reporting/services/CTEHandler.js.map +1 -0
  257. package/dist/reporting/services/DataSourceHandler.js +95 -0
  258. package/dist/reporting/services/DataSourceHandler.js.map +1 -0
  259. package/dist/reporting/services/JoinHandler.js +84 -0
  260. package/dist/reporting/services/JoinHandler.js.map +1 -0
  261. package/dist/reporting/services/ProcessHandler.js +26 -0
  262. package/dist/reporting/services/ProcessHandler.js.map +1 -0
  263. package/dist/src/index.d.ts +15 -0
  264. package/dist/src/index.js +13 -1
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/models/Clause.d.ts +7 -3
  267. package/dist/src/models/Clause.js +16 -3
  268. package/dist/src/models/Clause.js.map +1 -1
  269. package/dist/src/models/DDLStatements.d.ts +97 -2
  270. package/dist/src/models/DDLStatements.js +14 -1
  271. package/dist/src/models/DDLStatements.js.map +1 -1
  272. package/dist/src/models/InsertQuery.d.ts +1 -4
  273. package/dist/src/models/InsertQuery.js +3 -5
  274. package/dist/src/models/InsertQuery.js.map +1 -1
  275. package/dist/src/models/SqlPrintToken.d.ts +6 -0
  276. package/dist/src/models/SqlPrintToken.js +1 -0
  277. package/dist/src/models/SqlPrintToken.js.map +1 -1
  278. package/dist/src/models/TableDefinitionModel.d.ts +41 -0
  279. package/dist/src/models/TableDefinitionModel.js +85 -0
  280. package/dist/src/models/TableDefinitionModel.js.map +1 -0
  281. package/dist/src/models/ValueComponent.d.ts +2 -1
  282. package/dist/src/models/ValuesQuery.d.ts +2 -0
  283. package/dist/src/models/ValuesQuery.js +1 -0
  284. package/dist/src/models/ValuesQuery.js.map +1 -1
  285. package/dist/src/parsers/AlterTableParser.d.ts +1 -0
  286. package/dist/src/parsers/AlterTableParser.js +26 -5
  287. package/dist/src/parsers/AlterTableParser.js.map +1 -1
  288. package/dist/src/parsers/FunctionExpressionParser.d.ts +1 -0
  289. package/dist/src/parsers/InsertQueryParser.js +4 -1
  290. package/dist/src/parsers/InsertQueryParser.js.map +1 -1
  291. package/dist/src/parsers/ReturningClauseParser.js +33 -47
  292. package/dist/src/parsers/ReturningClauseParser.js.map +1 -1
  293. package/dist/src/parsers/SequenceParser.d.ts +16 -0
  294. package/dist/src/parsers/SqlParser.d.ts +4 -3
  295. package/dist/src/parsers/SqlParser.js +44 -63
  296. package/dist/src/parsers/SqlParser.js.map +1 -1
  297. package/dist/src/parsers/SqlPrintTokenParser.d.ts +9 -0
  298. package/dist/src/parsers/SqlPrintTokenParser.js +22 -4
  299. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  300. package/dist/src/parsers/SqlTokenizer.d.ts +1 -0
  301. package/dist/src/tokenReaders/LiteralTokenReader.js +7 -0
  302. package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  303. package/dist/src/transformers/DDLDiffGenerator.d.ts +18 -0
  304. package/dist/src/transformers/DDLDiffGenerator.js +313 -0
  305. package/dist/src/transformers/DDLDiffGenerator.js.map +1 -0
  306. package/dist/src/transformers/DDLGeneralizer.d.ts +13 -0
  307. package/dist/src/transformers/DDLGeneralizer.js +119 -0
  308. package/dist/src/transformers/DDLGeneralizer.js.map +1 -0
  309. package/dist/src/transformers/DDLToFixtureConverter.d.ts +19 -0
  310. package/dist/src/transformers/DDLToFixtureConverter.js +206 -0
  311. package/dist/src/transformers/DDLToFixtureConverter.js.map +1 -0
  312. package/dist/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
  313. package/dist/src/transformers/DeleteResultSelectConverter.js +398 -0
  314. package/dist/src/transformers/DeleteResultSelectConverter.js.map +1 -0
  315. package/dist/src/transformers/FixtureCteBuilder.d.ts +60 -0
  316. package/dist/src/transformers/FixtureCteBuilder.js +151 -0
  317. package/dist/src/transformers/FixtureCteBuilder.js.map +1 -0
  318. package/dist/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
  319. package/dist/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
  320. package/dist/src/transformers/InsertResultSelectConverter.d.ts +67 -0
  321. package/dist/src/transformers/InsertResultSelectConverter.js +499 -0
  322. package/dist/src/transformers/InsertResultSelectConverter.js.map +1 -0
  323. package/dist/src/transformers/MergeResultSelectConverter.d.ts +38 -0
  324. package/dist/src/transformers/MergeResultSelectConverter.js +310 -0
  325. package/dist/src/transformers/MergeResultSelectConverter.js.map +1 -0
  326. package/dist/src/transformers/QueryBuilder.d.ts +11 -0
  327. package/dist/src/transformers/QueryBuilder.js +19 -3
  328. package/dist/src/transformers/QueryBuilder.js.map +1 -1
  329. package/dist/src/transformers/SelectResultSelectConverter.d.ts +10 -0
  330. package/dist/src/transformers/SelectResultSelectConverter.js +36 -0
  331. package/dist/src/transformers/SelectResultSelectConverter.js.map +1 -0
  332. package/dist/src/transformers/SimulatedSelectConverter.d.ts +23 -0
  333. package/dist/src/transformers/SimulatedSelectConverter.js +65 -0
  334. package/dist/src/transformers/SimulatedSelectConverter.js.map +1 -0
  335. package/dist/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
  336. package/dist/src/transformers/UpdateResultSelectConverter.js +344 -0
  337. package/dist/src/transformers/UpdateResultSelectConverter.js.map +1 -0
  338. package/dist/src/types/GenericFixture.d.ts +17 -0
  339. package/dist/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
  340. package/dist/src/utils/SelectQueryWithClauseHelper.js +47 -0
  341. package/dist/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
  342. package/dist/src/utils/TableNameUtils.d.ts +10 -0
  343. package/dist/src/utils/ValueComponentRewriter.d.ts +3 -0
  344. package/dist/src/utils/ValueComponentRewriter.js +183 -0
  345. package/dist/src/utils/ValueComponentRewriter.js.map +1 -0
  346. package/dist/tokenReaders/BaseTokenReader.js +86 -0
  347. package/dist/tokenReaders/BaseTokenReader.js.map +1 -0
  348. package/dist/tokenReaders/CommandTokenReader.js +221 -0
  349. package/dist/tokenReaders/CommandTokenReader.js.map +1 -0
  350. package/dist/tokenReaders/EscapedIdentifierTokenReader.js +99 -0
  351. package/dist/tokenReaders/EscapedIdentifierTokenReader.js.map +1 -0
  352. package/dist/tokenReaders/FunctionTokenReader.js +47 -0
  353. package/dist/tokenReaders/FunctionTokenReader.js.map +1 -0
  354. package/dist/tokenReaders/IdentifierTokenReader.js +34 -0
  355. package/dist/tokenReaders/IdentifierTokenReader.js.map +1 -0
  356. package/dist/tokenReaders/LiteralTokenReader.js +329 -0
  357. package/dist/tokenReaders/LiteralTokenReader.js.map +1 -0
  358. package/dist/tokenReaders/OperatorTokenReader.js +152 -0
  359. package/dist/tokenReaders/OperatorTokenReader.js.map +1 -0
  360. package/dist/tokenReaders/ParameterTokenReader.js +190 -0
  361. package/dist/tokenReaders/ParameterTokenReader.js.map +1 -0
  362. package/dist/tokenReaders/StringSpecifierTokenReader.js +31 -0
  363. package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
  364. package/dist/tokenReaders/SymbolTokenReader.js +35 -0
  365. package/dist/tokenReaders/SymbolTokenReader.js.map +1 -0
  366. package/dist/tokenReaders/TokenReaderManager.js +110 -0
  367. package/dist/tokenReaders/TokenReaderManager.js.map +1 -0
  368. package/dist/tokenReaders/TypeTokenReader.js +69 -0
  369. package/dist/tokenReaders/TypeTokenReader.js.map +1 -0
  370. package/dist/transformers/AliasRenamer.js +600 -0
  371. package/dist/transformers/AliasRenamer.js.map +1 -0
  372. package/dist/transformers/CTEBuilder.js +188 -0
  373. package/dist/transformers/CTEBuilder.js.map +1 -0
  374. package/dist/transformers/CTECollector.js +409 -0
  375. package/dist/transformers/CTECollector.js.map +1 -0
  376. package/dist/transformers/CTEComposer.js +302 -0
  377. package/dist/transformers/CTEComposer.js.map +1 -0
  378. package/dist/transformers/CTEDependencyAnalyzer.js +285 -0
  379. package/dist/transformers/CTEDependencyAnalyzer.js.map +1 -0
  380. package/dist/transformers/CTEDependencyTracer.js +253 -0
  381. package/dist/transformers/CTEDependencyTracer.js.map +1 -0
  382. package/dist/transformers/CTEDisabler.js +355 -0
  383. package/dist/transformers/CTEDisabler.js.map +1 -0
  384. package/dist/transformers/CTEInjector.js +83 -0
  385. package/dist/transformers/CTEInjector.js.map +1 -0
  386. package/dist/transformers/CTENormalizer.js +46 -0
  387. package/dist/transformers/CTENormalizer.js.map +1 -0
  388. package/dist/transformers/CTEQueryDecomposer.js +589 -0
  389. package/dist/transformers/CTEQueryDecomposer.js.map +1 -0
  390. package/dist/transformers/CTERenamer.js +486 -0
  391. package/dist/transformers/CTERenamer.js.map +1 -0
  392. package/dist/transformers/CTETableReferenceCollector.js +358 -0
  393. package/dist/transformers/CTETableReferenceCollector.js.map +1 -0
  394. package/dist/transformers/ColumnReferenceCollector.js +478 -0
  395. package/dist/transformers/ColumnReferenceCollector.js.map +1 -0
  396. package/dist/transformers/DDLDiffGenerator.js +313 -0
  397. package/dist/transformers/DDLDiffGenerator.js.map +1 -0
  398. package/dist/transformers/DDLGeneralizer.js +119 -0
  399. package/dist/transformers/DDLGeneralizer.js.map +1 -0
  400. package/dist/transformers/DDLToFixtureConverter.js +206 -0
  401. package/dist/transformers/DDLToFixtureConverter.js.map +1 -0
  402. package/dist/transformers/DeleteResultSelectConverter.js +414 -0
  403. package/dist/transformers/DeleteResultSelectConverter.js.map +1 -0
  404. package/dist/transformers/DynamicQueryBuilder.js +164 -0
  405. package/dist/transformers/DynamicQueryBuilder.js.map +1 -0
  406. package/dist/transformers/EnhancedJsonMapping.js +223 -0
  407. package/dist/transformers/EnhancedJsonMapping.js.map +1 -0
  408. package/dist/transformers/FilterableItemCollector.js +259 -0
  409. package/dist/transformers/FilterableItemCollector.js.map +1 -0
  410. package/dist/transformers/FixtureCteBuilder.js +151 -0
  411. package/dist/transformers/FixtureCteBuilder.js.map +1 -0
  412. package/dist/transformers/FormatOptionResolver.js +67 -0
  413. package/dist/transformers/FormatOptionResolver.js.map +1 -0
  414. package/dist/transformers/Formatter.js +38 -0
  415. package/dist/transformers/Formatter.js.map +1 -0
  416. package/dist/transformers/InsertQuerySelectValuesConverter.js +125 -0
  417. package/dist/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
  418. package/dist/transformers/InsertResultSelectConverter.js +589 -0
  419. package/dist/transformers/InsertResultSelectConverter.js.map +1 -0
  420. package/dist/transformers/JoinAggregationDecomposer.js +497 -0
  421. package/dist/transformers/JoinAggregationDecomposer.js.map +1 -0
  422. package/dist/transformers/JsonMappingConverter.js +392 -0
  423. package/dist/transformers/JsonMappingConverter.js.map +1 -0
  424. package/dist/transformers/JsonMappingUnifier.js +216 -0
  425. package/dist/transformers/JsonMappingUnifier.js.map +1 -0
  426. package/dist/transformers/LinePrinter.js +148 -0
  427. package/dist/transformers/LinePrinter.js.map +1 -0
  428. package/dist/transformers/MergeResultSelectConverter.js +310 -0
  429. package/dist/transformers/MergeResultSelectConverter.js.map +1 -0
  430. package/dist/transformers/ModelDrivenJsonMapping.js +122 -0
  431. package/dist/transformers/ModelDrivenJsonMapping.js.map +1 -0
  432. package/dist/transformers/OnelineFormattingHelper.js +99 -0
  433. package/dist/transformers/OnelineFormattingHelper.js.map +1 -0
  434. package/dist/transformers/ParameterCollector.js +37 -0
  435. package/dist/transformers/ParameterCollector.js.map +1 -0
  436. package/dist/transformers/PostgresArrayEntityCteBuilder.js +458 -0
  437. package/dist/transformers/PostgresArrayEntityCteBuilder.js.map +1 -0
  438. package/dist/transformers/PostgresJsonQueryBuilder.js +245 -0
  439. package/dist/transformers/PostgresJsonQueryBuilder.js.map +1 -0
  440. package/dist/transformers/PostgresObjectEntityCteBuilder.js +347 -0
  441. package/dist/transformers/PostgresObjectEntityCteBuilder.js.map +1 -0
  442. package/dist/transformers/QueryBuilder.js +649 -0
  443. package/dist/transformers/QueryBuilder.js.map +1 -0
  444. package/dist/transformers/QueryFlowDiagramGenerator.js +157 -0
  445. package/dist/transformers/QueryFlowDiagramGenerator.js.map +1 -0
  446. package/dist/transformers/SchemaCollector.js +523 -0
  447. package/dist/transformers/SchemaCollector.js.map +1 -0
  448. package/dist/transformers/SelectResultSelectConverter.js +36 -0
  449. package/dist/transformers/SelectResultSelectConverter.js.map +1 -0
  450. package/dist/transformers/SelectValueCollector.js +244 -0
  451. package/dist/transformers/SelectValueCollector.js.map +1 -0
  452. package/dist/transformers/SelectableColumnCollector.js +674 -0
  453. package/dist/transformers/SelectableColumnCollector.js.map +1 -0
  454. package/dist/transformers/SimulatedSelectConverter.js +65 -0
  455. package/dist/transformers/SimulatedSelectConverter.js.map +1 -0
  456. package/dist/transformers/SmartRenamer.js +422 -0
  457. package/dist/transformers/SmartRenamer.js.map +1 -0
  458. package/dist/transformers/SqlFormatter.js +77 -0
  459. package/dist/transformers/SqlFormatter.js.map +1 -0
  460. package/dist/transformers/SqlIdentifierRenamer.js +504 -0
  461. package/dist/transformers/SqlIdentifierRenamer.js.map +1 -0
  462. package/dist/transformers/SqlOutputToken.js +13 -0
  463. package/dist/transformers/SqlOutputToken.js.map +1 -0
  464. package/dist/transformers/SqlPaginationInjector.js +108 -0
  465. package/dist/transformers/SqlPaginationInjector.js.map +1 -0
  466. package/dist/transformers/SqlParamInjector.js +802 -0
  467. package/dist/transformers/SqlParamInjector.js.map +1 -0
  468. package/dist/transformers/SqlParameterBinder.js +70 -0
  469. package/dist/transformers/SqlParameterBinder.js.map +1 -0
  470. package/dist/transformers/SqlPrinter.js +1478 -0
  471. package/dist/transformers/SqlPrinter.js.map +1 -0
  472. package/dist/transformers/SqlSortInjector.js +153 -0
  473. package/dist/transformers/SqlSortInjector.js.map +1 -0
  474. package/dist/transformers/TableColumnResolver.js +3 -0
  475. package/dist/transformers/TableColumnResolver.js.map +1 -0
  476. package/dist/transformers/TableSourceCollector.js +439 -0
  477. package/dist/transformers/TableSourceCollector.js.map +1 -0
  478. package/dist/transformers/TypeTransformationPostProcessor.js +363 -0
  479. package/dist/transformers/TypeTransformationPostProcessor.js.map +1 -0
  480. package/dist/transformers/UpdateResultSelectConverter.js +359 -0
  481. package/dist/transformers/UpdateResultSelectConverter.js.map +1 -0
  482. package/dist/transformers/UpstreamSelectQueryFinder.js +184 -0
  483. package/dist/transformers/UpstreamSelectQueryFinder.js.map +1 -0
  484. package/dist/tsconfig.tsbuildinfo +1 -1
  485. package/dist/types/Formatting.js +3 -0
  486. package/dist/types/Formatting.js.map +1 -0
  487. package/dist/types/GenericFixture.js +3 -0
  488. package/dist/types/GenericFixture.js.map +1 -0
  489. package/dist/utils/CTERegionDetector.js +464 -0
  490. package/dist/utils/CTERegionDetector.js.map +1 -0
  491. package/dist/utils/CommentEditor.js +345 -0
  492. package/dist/utils/CommentEditor.js.map +1 -0
  493. package/dist/utils/CommentUtils.js +69 -0
  494. package/dist/utils/CommentUtils.js.map +1 -0
  495. package/dist/utils/CursorContextAnalyzer.js +338 -0
  496. package/dist/utils/CursorContextAnalyzer.js.map +1 -0
  497. package/dist/utils/IntelliSenseApi.js +292 -0
  498. package/dist/utils/IntelliSenseApi.js.map +1 -0
  499. package/dist/utils/JsonSchemaValidator.js +215 -0
  500. package/dist/utils/JsonSchemaValidator.js.map +1 -0
  501. package/dist/utils/KeywordCache.js +206 -0
  502. package/dist/utils/KeywordCache.js.map +1 -0
  503. package/dist/utils/LexemeCursor.js +314 -0
  504. package/dist/utils/LexemeCursor.js.map +1 -0
  505. package/dist/utils/MultiQuerySplitter.js +292 -0
  506. package/dist/utils/MultiQuerySplitter.js.map +1 -0
  507. package/dist/utils/OperatorPrecedence.js +107 -0
  508. package/dist/utils/OperatorPrecedence.js.map +1 -0
  509. package/dist/utils/ParameterDetector.js +53 -0
  510. package/dist/utils/ParameterDetector.js.map +1 -0
  511. package/dist/utils/ParameterHelper.js +31 -0
  512. package/dist/utils/ParameterHelper.js.map +1 -0
  513. package/dist/utils/ParameterRemover.js +783 -0
  514. package/dist/utils/ParameterRemover.js.map +1 -0
  515. package/dist/utils/ParserStringUtils.js +31 -0
  516. package/dist/utils/ParserStringUtils.js.map +1 -0
  517. package/dist/utils/PositionAwareParser.js +363 -0
  518. package/dist/utils/PositionAwareParser.js.map +1 -0
  519. package/dist/utils/SchemaManager.js +217 -0
  520. package/dist/utils/SchemaManager.js.map +1 -0
  521. package/dist/utils/ScopeResolver.js +272 -0
  522. package/dist/utils/ScopeResolver.js.map +1 -0
  523. package/dist/utils/SelectQueryWithClauseHelper.js +47 -0
  524. package/dist/utils/SelectQueryWithClauseHelper.js.map +1 -0
  525. package/dist/utils/SqlSchemaValidator.js +55 -0
  526. package/dist/utils/SqlSchemaValidator.js.map +1 -0
  527. package/dist/utils/TableNameUtils.js +35 -0
  528. package/dist/utils/TableNameUtils.js.map +1 -0
  529. package/dist/utils/TextPositionUtils.js +128 -0
  530. package/dist/utils/TextPositionUtils.js.map +1 -0
  531. package/dist/utils/ValueComponentRewriter.js +187 -0
  532. package/dist/utils/ValueComponentRewriter.js.map +1 -0
  533. package/dist/utils/charLookupTable.js +73 -0
  534. package/dist/utils/charLookupTable.js.map +1 -0
  535. package/dist/utils/stringUtils.js +230 -0
  536. package/dist/utils/stringUtils.js.map +1 -0
  537. package/package.json +62 -62
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommandExpressionParser = void 0;
4
+ const Lexeme_1 = require("../models/Lexeme");
5
+ const ValueComponent_1 = require("../models/ValueComponent");
6
+ const ValueParser_1 = require("./ValueParser");
7
+ class CommandExpressionParser {
8
+ static parseFromLexeme(lexemes, index) {
9
+ let idx = index;
10
+ const current = lexemes[idx];
11
+ if (current.value === "case") {
12
+ // Capture CASE keyword comments before consuming
13
+ const caseKeywordComments = current.comments;
14
+ const caseKeywordPositionedComments = current.positionedComments;
15
+ idx++;
16
+ return this.parseCaseExpression(lexemes, idx, caseKeywordComments, caseKeywordPositionedComments);
17
+ }
18
+ else if (current.value === "case when") {
19
+ // Capture CASE WHEN keyword comments before consuming
20
+ const caseWhenKeywordComments = current.comments;
21
+ const caseWhenKeywordPositionedComments = current.positionedComments;
22
+ idx++;
23
+ return this.parseCaseWhenExpression(lexemes, idx, caseWhenKeywordComments, caseWhenKeywordPositionedComments);
24
+ }
25
+ return this.parseModifierUnaryExpression(lexemes, idx);
26
+ }
27
+ static parseModifierUnaryExpression(lexemes, index) {
28
+ let idx = index;
29
+ // Check for modifier unary expression
30
+ if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Command)) {
31
+ const command = lexemes[idx].value;
32
+ idx++;
33
+ const result = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
34
+ return { value: new ValueComponent_1.UnaryExpression(command, result.value), newIndex: result.newIndex };
35
+ }
36
+ throw new Error(`Invalid modifier unary expression at index ${idx}, Lexeme: ${lexemes[idx].value}`);
37
+ }
38
+ static parseCaseExpression(lexemes, index, caseKeywordComments, caseKeywordPositionedComments) {
39
+ let idx = index;
40
+ const condition = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
41
+ idx = condition.newIndex;
42
+ const switchCaseResult = this.parseSwitchCaseArgument(lexemes, idx, []);
43
+ idx = switchCaseResult.newIndex;
44
+ // Create CASE expression
45
+ const result = new ValueComponent_1.CaseExpression(condition.value, switchCaseResult.value);
46
+ // Assign CASE keyword comments to the CaseExpression (positioned comments only for unified spec)
47
+ if (caseKeywordPositionedComments && caseKeywordPositionedComments.length > 0) {
48
+ result.positionedComments = caseKeywordPositionedComments;
49
+ }
50
+ else if (caseKeywordComments && caseKeywordComments.length > 0) {
51
+ // Convert legacy comments to positioned comments for unified spec
52
+ result.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(caseKeywordComments, 'before')];
53
+ }
54
+ return { value: result, newIndex: idx };
55
+ }
56
+ static parseCaseWhenExpression(lexemes, index, caseWhenKeywordComments, caseWhenKeywordPositionedComments) {
57
+ let idx = index;
58
+ // Parse the first WHEN clause
59
+ const casewhenResult = this.parseCaseConditionValuePair(lexemes, idx);
60
+ idx = casewhenResult.newIndex;
61
+ // Add the initial WHEN-THEN pair to the list
62
+ const caseWhenList = [casewhenResult.value];
63
+ // Process remaining WHEN-ELSE-END parts
64
+ const switchCaseResult = this.parseSwitchCaseArgument(lexemes, idx, caseWhenList);
65
+ idx = switchCaseResult.newIndex;
66
+ // Create CASE expression with condition null (uses WHEN conditions instead of a simple CASE)
67
+ const result = new ValueComponent_1.CaseExpression(null, switchCaseResult.value);
68
+ // Assign CASE WHEN keyword comments to the CaseExpression (positioned comments only for unified spec)
69
+ if (caseWhenKeywordPositionedComments && caseWhenKeywordPositionedComments.length > 0) {
70
+ result.positionedComments = caseWhenKeywordPositionedComments;
71
+ }
72
+ else if (caseWhenKeywordComments && caseWhenKeywordComments.length > 0) {
73
+ // Convert legacy comments to positioned comments for unified spec
74
+ result.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(caseWhenKeywordComments, 'before')];
75
+ }
76
+ return { value: result, newIndex: idx };
77
+ }
78
+ // parseSwitchCaseArgument method processes the WHEN, ELSE, and END clauses of a CASE expression.
79
+ static parseSwitchCaseArgument(lexemes, index, initialWhenThenList) {
80
+ let idx = index;
81
+ const whenThenList = [...initialWhenThenList];
82
+ // Parse all WHEN clauses
83
+ idx = this.parseAdditionalWhenClauses(lexemes, idx, whenThenList);
84
+ // Parse optional ELSE clause
85
+ const { elseValue, elseComments, newIndex: elseIndex } = this.parseElseClause(lexemes, idx);
86
+ idx = elseIndex;
87
+ // Parse required END clause
88
+ const { endComments, newIndex: endIndex } = this.parseEndClause(lexemes, idx);
89
+ idx = endIndex;
90
+ if (whenThenList.length === 0) {
91
+ throw new Error(`The CASE expression requires at least one WHEN clause (index ${idx})`);
92
+ }
93
+ // Create SwitchCaseArgument and apply comments directly
94
+ const switchCaseArg = new ValueComponent_1.SwitchCaseArgument(whenThenList, elseValue);
95
+ this.applySwitchCaseComments(switchCaseArg, elseComments, endComments);
96
+ return { value: switchCaseArg, newIndex: idx };
97
+ }
98
+ // Parse additional WHEN clauses
99
+ static parseAdditionalWhenClauses(lexemes, index, whenThenList) {
100
+ let idx = index;
101
+ while (idx < lexemes.length && this.isCommandWithValue(lexemes[idx], "when")) {
102
+ idx++;
103
+ const whenResult = this.parseCaseConditionValuePair(lexemes, idx);
104
+ idx = whenResult.newIndex;
105
+ whenThenList.push(whenResult.value);
106
+ }
107
+ return idx;
108
+ }
109
+ // Parse optional ELSE clause
110
+ static parseElseClause(lexemes, index) {
111
+ let elseValue = null;
112
+ let elseComments = null;
113
+ let idx = index;
114
+ if (idx < lexemes.length && this.isCommandWithValue(lexemes[idx], "else")) {
115
+ // Extract comments from ELSE keyword before consuming
116
+ elseComments = this.extractKeywordComments(lexemes[idx]);
117
+ idx++;
118
+ const elseResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
119
+ elseValue = elseResult.value;
120
+ idx = elseResult.newIndex;
121
+ }
122
+ return { elseValue, elseComments, newIndex: idx };
123
+ }
124
+ // Parse required END clause
125
+ static parseEndClause(lexemes, index) {
126
+ let idx = index;
127
+ let endComments = null;
128
+ if (idx < lexemes.length && this.isCommandWithValue(lexemes[idx], "end")) {
129
+ // Extract comments from END keyword before consuming
130
+ endComments = this.extractKeywordComments(lexemes[idx]);
131
+ idx++;
132
+ }
133
+ else {
134
+ throw new Error(`The CASE expression requires 'end' keyword at the end (index ${idx})`);
135
+ }
136
+ return { endComments, newIndex: idx };
137
+ }
138
+ // Extract comments from a keyword token
139
+ static extractKeywordComments(token) {
140
+ return {
141
+ legacy: token.comments,
142
+ positioned: token.positionedComments
143
+ };
144
+ }
145
+ // Apply comments to SwitchCaseArgument directly (no collection then assignment)
146
+ static applySwitchCaseComments(switchCaseArg, elseComments, endComments) {
147
+ const allPositionedComments = [];
148
+ const allLegacyComments = [];
149
+ // Process ELSE comments directly
150
+ if ((elseComments === null || elseComments === void 0 ? void 0 : elseComments.positioned) && elseComments.positioned.length > 0) {
151
+ allPositionedComments.push(...elseComments.positioned);
152
+ }
153
+ if ((elseComments === null || elseComments === void 0 ? void 0 : elseComments.legacy) && elseComments.legacy.length > 0) {
154
+ allLegacyComments.push(...elseComments.legacy);
155
+ }
156
+ // Process END comments directly
157
+ if ((endComments === null || endComments === void 0 ? void 0 : endComments.positioned) && endComments.positioned.length > 0) {
158
+ allPositionedComments.push(...endComments.positioned);
159
+ }
160
+ if ((endComments === null || endComments === void 0 ? void 0 : endComments.legacy) && endComments.legacy.length > 0) {
161
+ allLegacyComments.push(...endComments.legacy);
162
+ }
163
+ // Apply positioned comments directly, or convert legacy comments
164
+ if (allPositionedComments.length > 0) {
165
+ switchCaseArg.positionedComments = allPositionedComments;
166
+ }
167
+ else if (allLegacyComments.length > 0) {
168
+ switchCaseArg.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(allLegacyComments, 'after')];
169
+ }
170
+ }
171
+ // Helper method: Check if a lexeme is a Command token with the specified value
172
+ static isCommandWithValue(lexeme, value) {
173
+ return ((lexeme.type & Lexeme_1.TokenType.Command) !== 0) && lexeme.value === value;
174
+ }
175
+ static parseCaseConditionValuePair(lexemes, index) {
176
+ let idx = index;
177
+ const condition = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
178
+ idx = condition.newIndex;
179
+ // Check for the existence of the THEN keyword
180
+ if (idx >= lexemes.length || !(lexemes[idx].type & Lexeme_1.TokenType.Command) || lexemes[idx].value !== "then") {
181
+ throw new Error(`Expected 'then' after WHEN condition at index ${idx}`);
182
+ }
183
+ // Capture THEN keyword comments before consuming
184
+ const thenKeywordComments = lexemes[idx].comments;
185
+ const thenKeywordPositionedComments = lexemes[idx].positionedComments;
186
+ idx++; // Skip the THEN keyword
187
+ // Parse the value after THEN
188
+ const value = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
189
+ idx = value.newIndex;
190
+ const keyValuePair = new ValueComponent_1.CaseKeyValuePair(condition.value, value.value);
191
+ // Store THEN keyword comments on the CaseKeyValuePair
192
+ // Store THEN keyword comments - unified spec: positioned comments only
193
+ if (thenKeywordPositionedComments && thenKeywordPositionedComments.length > 0) {
194
+ keyValuePair.positionedComments = thenKeywordPositionedComments;
195
+ }
196
+ else if (thenKeywordComments && thenKeywordComments.length > 0) {
197
+ // Convert legacy comments to positioned comments for unified spec
198
+ keyValuePair.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(thenKeywordComments, 'after')];
199
+ }
200
+ return { value: keyValuePair, newIndex: idx };
201
+ }
202
+ /**
203
+ * Convert legacy comments to positioned comments format
204
+ */
205
+ static convertLegacyToPositioned(legacyComments, position = 'before') {
206
+ return {
207
+ position,
208
+ comments: legacyComments
209
+ };
210
+ }
211
+ }
212
+ exports.CommandExpressionParser = CommandExpressionParser;
213
+ //# sourceMappingURL=CommandExpressionParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/CommandExpressionParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommonTableParser = void 0;
4
+ const Clause_1 = require("../models/Clause");
5
+ const Lexeme_1 = require("../models/Lexeme");
6
+ const SqlTokenizer_1 = require("./SqlTokenizer");
7
+ const SelectQueryParser_1 = require("./SelectQueryParser");
8
+ const SourceAliasExpressionParser_1 = require("./SourceAliasExpressionParser");
9
+ class CommonTableParser {
10
+ // Parse SQL string to AST (was: parse)
11
+ static parse(query) {
12
+ const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
13
+ const lexemes = tokenizer.readLexmes(); // Get tokens
14
+ // Parse
15
+ const result = this.parseFromLexeme(lexemes, 0);
16
+ // Error if there are remaining tokens
17
+ if (result.newIndex < lexemes.length) {
18
+ 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.`);
19
+ }
20
+ return result.value;
21
+ }
22
+ // Parse from lexeme array (was: parse)
23
+ static parseFromLexeme(lexemes, index) {
24
+ let idx = index;
25
+ // 1. Parse alias and optional column aliases
26
+ const aliasResult = SourceAliasExpressionParser_1.SourceAliasExpressionParser.parseFromLexeme(lexemes, idx);
27
+ idx = aliasResult.newIndex;
28
+ // 2. Collect preceding comments for this CTE
29
+ this.collectPrecedingComments(lexemes, index, aliasResult);
30
+ // 3. Parse AS keyword
31
+ idx = this.parseAsKeyword(lexemes, idx);
32
+ // 4. Parse optional MATERIALIZED flag
33
+ const { materialized, newIndex: materializedIndex } = this.parseMaterializedFlag(lexemes, idx);
34
+ idx = materializedIndex;
35
+ // 5. Parse inner SELECT query with parentheses
36
+ const { selectQuery, trailingComments, newIndex: selectIndex } = this.parseInnerSelectQuery(lexemes, idx);
37
+ idx = selectIndex;
38
+ // 6. Create CommonTable instance
39
+ const value = new Clause_1.CommonTable(selectQuery, aliasResult.value, materialized);
40
+ return {
41
+ value,
42
+ newIndex: idx,
43
+ trailingComments
44
+ };
45
+ }
46
+ // Collect comments from preceding tokens that should belong to this CTE
47
+ static collectPrecedingComments(lexemes, index, aliasResult) {
48
+ var _a;
49
+ if (!((_a = aliasResult.value) === null || _a === void 0 ? void 0 : _a.table))
50
+ return;
51
+ const cteTable = aliasResult.value.table;
52
+ for (let i = index - 1; i >= 0; i--) {
53
+ const token = lexemes[i];
54
+ // Handle WITH keyword specially - collect its "after" comments for the first CTE
55
+ if (token.value.toLowerCase() === 'with') {
56
+ this.collectWithTokenComments(token, cteTable);
57
+ break; // Stop at WITH keyword
58
+ }
59
+ // Stop looking if we hit a comma (indicates previous CTE) or RECURSIVE keyword
60
+ if (token.type & Lexeme_1.TokenType.Comma || token.value.toLowerCase() === 'recursive') {
61
+ break;
62
+ }
63
+ // Collect comments from tokens before the CTE name
64
+ this.collectTokenComments(token, cteTable);
65
+ }
66
+ }
67
+ // Collect comments from WITH token
68
+ static collectWithTokenComments(token, cteTable) {
69
+ let hasPositionedComments = false;
70
+ if (token.positionedComments && token.positionedComments.length > 0) {
71
+ for (const posComment of token.positionedComments) {
72
+ if (posComment.position === 'after' && posComment.comments) {
73
+ this.addPositionedComment(cteTable, 'before', posComment.comments);
74
+ hasPositionedComments = true;
75
+ }
76
+ }
77
+ }
78
+ // Only use legacy comments if no positioned comments were found
79
+ if (!hasPositionedComments && token.comments && token.comments.length > 0) {
80
+ this.addPositionedComment(cteTable, 'before', token.comments);
81
+ }
82
+ }
83
+ // Collect comments from a token
84
+ static collectTokenComments(token, cteTable) {
85
+ if (token.comments && token.comments.length > 0) {
86
+ this.addPositionedComment(cteTable, 'before', token.comments);
87
+ }
88
+ if (token.positionedComments && token.positionedComments.length > 0) {
89
+ if (!cteTable.positionedComments) {
90
+ cteTable.positionedComments = [];
91
+ }
92
+ cteTable.positionedComments.unshift(...token.positionedComments);
93
+ }
94
+ }
95
+ // Helper to add positioned comment
96
+ static addPositionedComment(cteTable, position, comments) {
97
+ if (!cteTable.positionedComments) {
98
+ cteTable.positionedComments = [];
99
+ }
100
+ cteTable.positionedComments.unshift({
101
+ position,
102
+ comments: [...comments]
103
+ });
104
+ }
105
+ // Parse AS keyword
106
+ static parseAsKeyword(lexemes, index) {
107
+ if (index < lexemes.length && lexemes[index].value !== "as") {
108
+ throw new Error(`Syntax error at position ${index}: Expected 'AS' keyword after CTE name but found "${lexemes[index].value}".`);
109
+ }
110
+ return index + 1; // Skip 'AS' keyword
111
+ }
112
+ // Parse optional MATERIALIZED flag
113
+ static parseMaterializedFlag(lexemes, index) {
114
+ if (index >= lexemes.length) {
115
+ return { materialized: null, newIndex: index };
116
+ }
117
+ const currentValue = lexemes[index].value;
118
+ if (currentValue === "materialized") {
119
+ return { materialized: true, newIndex: index + 1 };
120
+ }
121
+ else if (currentValue === "not materialized") {
122
+ return { materialized: false, newIndex: index + 1 };
123
+ }
124
+ return { materialized: null, newIndex: index };
125
+ }
126
+ // Parse inner SELECT query with parentheses
127
+ static parseInnerSelectQuery(lexemes, index) {
128
+ let idx = index;
129
+ if (idx < lexemes.length && lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
130
+ throw new Error(`Syntax error at position ${idx}: Expected '(' after CTE name but found "${lexemes[idx].value}".`);
131
+ }
132
+ // Capture comments from the opening parenthesis for the CTE inner query
133
+ const cteQueryHeaderComments = this.extractComments(lexemes[idx]);
134
+ idx++; // Skip opening parenthesis
135
+ const queryResult = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, idx);
136
+ idx = queryResult.newIndex;
137
+ // Add comments from the opening parenthesis as header comments for the inner query
138
+ if (cteQueryHeaderComments.length > 0) {
139
+ if (queryResult.value.headerComments) {
140
+ queryResult.value.headerComments = [...cteQueryHeaderComments, ...queryResult.value.headerComments];
141
+ }
142
+ else {
143
+ queryResult.value.headerComments = cteQueryHeaderComments;
144
+ }
145
+ }
146
+ if (idx < lexemes.length && lexemes[idx].type !== Lexeme_1.TokenType.CloseParen) {
147
+ throw new Error(`Syntax error at position ${idx}: Expected ')' after CTE query but found "${lexemes[idx].value}".`);
148
+ }
149
+ // Capture comments from the closing parenthesis
150
+ const closingParenComments = this.extractComments(lexemes[idx]);
151
+ idx++; // Skip closing parenthesis
152
+ return {
153
+ selectQuery: queryResult.value,
154
+ trailingComments: closingParenComments.length > 0 ? closingParenComments : null,
155
+ newIndex: idx
156
+ };
157
+ }
158
+ // Extract comments from a lexeme (both positioned and legacy)
159
+ static extractComments(lexeme) {
160
+ const comments = [];
161
+ // Check positioned comments
162
+ if (lexeme.positionedComments) {
163
+ for (const posComment of lexeme.positionedComments) {
164
+ if (posComment.comments) {
165
+ comments.push(...posComment.comments);
166
+ }
167
+ }
168
+ }
169
+ // Check legacy comments for backward compatibility
170
+ if (lexeme.comments && lexeme.comments.length > 0) {
171
+ comments.push(...lexeme.comments);
172
+ }
173
+ return comments;
174
+ }
175
+ }
176
+ exports.CommonTableParser = CommonTableParser;
177
+ //# sourceMappingURL=CommonTableParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonTableParser.js","sourceRoot":"","sources":["../../src/parsers/CommonTableParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateIndexParser = void 0;
4
+ const SqlTokenizer_1 = require("./SqlTokenizer");
5
+ const DDLStatements_1 = require("../models/DDLStatements");
6
+ const Lexeme_1 = require("../models/Lexeme");
7
+ const FullNameParser_1 = require("./FullNameParser");
8
+ const ValueComponent_1 = require("../models/ValueComponent");
9
+ const ValueParser_1 = require("./ValueParser");
10
+ const ParserStringUtils_1 = require("../utils/ParserStringUtils");
11
+ /**
12
+ * Parses CREATE INDEX statements.
13
+ */
14
+ class CreateIndexParser {
15
+ static parse(sql) {
16
+ const tokenizer = new SqlTokenizer_1.SqlTokenizer(sql);
17
+ const lexemes = tokenizer.readLexemes();
18
+ const result = this.parseFromLexeme(lexemes, 0);
19
+ if (result.newIndex < lexemes.length) {
20
+ throw new Error(`[CreateIndexParser] Unexpected token "${lexemes[result.newIndex].value}" after CREATE INDEX.`);
21
+ }
22
+ return result.value;
23
+ }
24
+ static parseFromLexeme(lexemes, index) {
25
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
26
+ let idx = index;
27
+ const firstToken = (_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase();
28
+ if (firstToken !== "create index" && firstToken !== "create unique index") {
29
+ throw new Error(`[CreateIndexParser] Expected CREATE INDEX at index ${idx}.`);
30
+ }
31
+ const unique = firstToken === "create unique index";
32
+ idx++;
33
+ let concurrently = false;
34
+ if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value.toLowerCase()) === "concurrently") {
35
+ concurrently = true;
36
+ idx++;
37
+ }
38
+ let ifNotExists = false;
39
+ if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.value.toLowerCase()) === "if not exists") {
40
+ ifNotExists = true;
41
+ idx++;
42
+ }
43
+ const indexNameResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
44
+ const indexName = new ValueComponent_1.QualifiedName(indexNameResult.namespaces, indexNameResult.name);
45
+ idx = indexNameResult.newIndex;
46
+ if (((_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value.toLowerCase()) !== "on") {
47
+ throw new Error(`[CreateIndexParser] Expected ON keyword before table name at index ${idx}.`);
48
+ }
49
+ idx++;
50
+ const tableResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
51
+ const tableName = new ValueComponent_1.QualifiedName(tableResult.namespaces, tableResult.name);
52
+ idx = tableResult.newIndex;
53
+ let usingMethod = null;
54
+ if (((_e = lexemes[idx]) === null || _e === void 0 ? void 0 : _e.value.toLowerCase()) === "using") {
55
+ idx++;
56
+ const methodResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
57
+ usingMethod = methodResult.name;
58
+ idx = methodResult.newIndex;
59
+ }
60
+ const columnsResult = this.parseIndexColumnList(lexemes, idx);
61
+ const columns = columnsResult.columns;
62
+ idx = columnsResult.newIndex;
63
+ let include = null;
64
+ if (((_f = lexemes[idx]) === null || _f === void 0 ? void 0 : _f.value.toLowerCase()) === "include") {
65
+ idx++;
66
+ const includeResult = this.parseIdentifierList(lexemes, idx);
67
+ include = includeResult.identifiers;
68
+ idx = includeResult.newIndex;
69
+ }
70
+ let withOptions = null;
71
+ if (((_g = lexemes[idx]) === null || _g === void 0 ? void 0 : _g.value.toLowerCase()) === "with") {
72
+ const withResult = this.parseWithOptions(lexemes, idx);
73
+ withOptions = withResult.options;
74
+ idx = withResult.newIndex;
75
+ }
76
+ let tablespace = null;
77
+ if (((_h = lexemes[idx]) === null || _h === void 0 ? void 0 : _h.value.toLowerCase()) === "tablespace") {
78
+ idx++;
79
+ const tablespaceResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
80
+ tablespace = tablespaceResult.name;
81
+ idx = tablespaceResult.newIndex;
82
+ }
83
+ let whereClause;
84
+ if (((_j = lexemes[idx]) === null || _j === void 0 ? void 0 : _j.value.toLowerCase()) === "where") {
85
+ idx++;
86
+ const whereResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
87
+ whereClause = whereResult.value;
88
+ idx = whereResult.newIndex;
89
+ }
90
+ return {
91
+ value: new DDLStatements_1.CreateIndexStatement({
92
+ unique,
93
+ concurrently,
94
+ ifNotExists,
95
+ indexName,
96
+ tableName,
97
+ usingMethod,
98
+ columns,
99
+ include,
100
+ withOptions,
101
+ tablespace,
102
+ where: whereClause
103
+ }),
104
+ newIndex: idx
105
+ };
106
+ }
107
+ static parseIndexColumnList(lexemes, index) {
108
+ var _a, _b, _c, _d;
109
+ let idx = index;
110
+ if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== Lexeme_1.TokenType.OpenParen) {
111
+ throw new Error(`[CreateIndexParser] Expected '(' starting column list at index ${idx}.`);
112
+ }
113
+ idx++;
114
+ const columns = [];
115
+ while (idx < lexemes.length) {
116
+ const expressionResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
117
+ idx = expressionResult.newIndex;
118
+ let sortOrder = null;
119
+ let nullsOrder = null;
120
+ let collation = null;
121
+ let operatorClass = null;
122
+ while (idx < lexemes.length) {
123
+ const tokenValue = lexemes[idx].value.toLowerCase();
124
+ if (tokenValue === "asc" || tokenValue === "desc") {
125
+ sortOrder = tokenValue;
126
+ idx++;
127
+ continue;
128
+ }
129
+ if (tokenValue === "nulls first" || tokenValue === "nulls last") {
130
+ nullsOrder = tokenValue.endsWith("first") ? "first" : "last";
131
+ idx++;
132
+ continue;
133
+ }
134
+ if (tokenValue === "collate") {
135
+ idx++;
136
+ const collateResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
137
+ collation = new ValueComponent_1.QualifiedName(collateResult.namespaces, collateResult.name);
138
+ idx = collateResult.newIndex;
139
+ continue;
140
+ }
141
+ if (this.isClauseTerminator(tokenValue) || (lexemes[idx].type & (Lexeme_1.TokenType.Comma | Lexeme_1.TokenType.CloseParen))) {
142
+ break;
143
+ }
144
+ if (lexemes[idx].type & (Lexeme_1.TokenType.Identifier | Lexeme_1.TokenType.Type | Lexeme_1.TokenType.Function)) {
145
+ const opClassResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
146
+ operatorClass = new ValueComponent_1.QualifiedName(opClassResult.namespaces, opClassResult.name);
147
+ idx = opClassResult.newIndex;
148
+ continue;
149
+ }
150
+ break;
151
+ }
152
+ columns.push(new DDLStatements_1.IndexColumnDefinition({
153
+ expression: expressionResult.value,
154
+ sortOrder,
155
+ nullsOrder,
156
+ collation,
157
+ operatorClass
158
+ }));
159
+ if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === Lexeme_1.TokenType.Comma) {
160
+ idx++;
161
+ continue;
162
+ }
163
+ if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === Lexeme_1.TokenType.CloseParen) {
164
+ idx++;
165
+ break;
166
+ }
167
+ }
168
+ if (((_d = lexemes[idx - 1]) === null || _d === void 0 ? void 0 : _d.type) !== Lexeme_1.TokenType.CloseParen) {
169
+ throw new Error(`[CreateIndexParser] Expected ')' to close column list starting at index ${index}.`);
170
+ }
171
+ return { columns, newIndex: idx };
172
+ }
173
+ static parseIdentifierList(lexemes, index) {
174
+ var _a, _b, _c, _d;
175
+ let idx = index;
176
+ if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== Lexeme_1.TokenType.OpenParen) {
177
+ throw new Error(`[CreateIndexParser] Expected '(' starting identifier list at index ${idx}.`);
178
+ }
179
+ idx++;
180
+ const identifiers = [];
181
+ while (idx < lexemes.length) {
182
+ const result = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
183
+ identifiers.push(result.name);
184
+ idx = result.newIndex;
185
+ if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === Lexeme_1.TokenType.Comma) {
186
+ idx++;
187
+ continue;
188
+ }
189
+ if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === Lexeme_1.TokenType.CloseParen) {
190
+ idx++;
191
+ break;
192
+ }
193
+ }
194
+ if (((_d = lexemes[idx - 1]) === null || _d === void 0 ? void 0 : _d.type) !== Lexeme_1.TokenType.CloseParen) {
195
+ throw new Error(`[CreateIndexParser] Expected ')' to close identifier list starting at index ${index}.`);
196
+ }
197
+ return { identifiers, newIndex: idx };
198
+ }
199
+ static parseWithOptions(lexemes, index) {
200
+ var _a, _b;
201
+ let idx = index;
202
+ const start = idx;
203
+ if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value.toLowerCase()) !== "with") {
204
+ throw new Error(`[CreateIndexParser] Expected WITH keyword at index ${idx}.`);
205
+ }
206
+ idx++;
207
+ if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) !== Lexeme_1.TokenType.OpenParen) {
208
+ throw new Error(`[CreateIndexParser] Expected '(' after WITH at index ${idx}.`);
209
+ }
210
+ let depth = 0;
211
+ while (idx < lexemes.length) {
212
+ if (lexemes[idx].type === Lexeme_1.TokenType.OpenParen) {
213
+ depth++;
214
+ }
215
+ else if (lexemes[idx].type === Lexeme_1.TokenType.CloseParen) {
216
+ depth--;
217
+ if (depth === 0) {
218
+ idx++;
219
+ break;
220
+ }
221
+ }
222
+ idx++;
223
+ }
224
+ if (depth !== 0) {
225
+ throw new Error(`[CreateIndexParser] Unterminated WITH options starting at index ${start}; unbalanced parentheses.`);
226
+ }
227
+ const text = (0, ParserStringUtils_1.joinLexemeValues)(lexemes, start, idx);
228
+ return {
229
+ options: new ValueComponent_1.RawString(text),
230
+ newIndex: idx
231
+ };
232
+ }
233
+ static isClauseTerminator(value) {
234
+ return value === "include" ||
235
+ value === "with" ||
236
+ value === "where" ||
237
+ value === "tablespace";
238
+ }
239
+ }
240
+ exports.CreateIndexParser = CreateIndexParser;
241
+ //# sourceMappingURL=CreateIndexParser.js.map