rawsql-ts 0.16.0 → 0.17.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 (211) hide show
  1. package/README.md +161 -875
  2. package/dist/esm/index.d.ts +7 -0
  3. package/dist/esm/index.js +7 -0
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/index.min.js +22 -20
  6. package/dist/esm/index.min.js.map +4 -4
  7. package/dist/esm/models/Clause.d.ts +15 -3
  8. package/dist/esm/models/Clause.js +2 -1
  9. package/dist/esm/models/Clause.js.map +1 -1
  10. package/dist/esm/models/CreateTableQuery.d.ts +3 -0
  11. package/dist/esm/models/CreateTableQuery.js +5 -4
  12. package/dist/esm/models/CreateTableQuery.js.map +1 -1
  13. package/dist/esm/models/DDLStatements.d.ts +71 -0
  14. package/dist/esm/models/DDLStatements.js +63 -0
  15. package/dist/esm/models/DDLStatements.js.map +1 -1
  16. package/dist/esm/models/KeywordTrie.d.ts +2 -3
  17. package/dist/esm/models/KeywordTrie.js +26 -27
  18. package/dist/esm/models/KeywordTrie.js.map +1 -1
  19. package/dist/esm/models/SqlPrintToken.d.ts +1 -0
  20. package/dist/esm/models/SqlPrintToken.js +1 -0
  21. package/dist/esm/models/SqlPrintToken.js.map +1 -1
  22. package/dist/esm/parsers/CheckpointStatementParser.d.ts +8 -0
  23. package/dist/esm/parsers/CheckpointStatementParser.js +14 -0
  24. package/dist/esm/parsers/CheckpointStatementParser.js.map +1 -0
  25. package/dist/esm/parsers/ClusterStatementParser.d.ts +8 -0
  26. package/dist/esm/parsers/ClusterStatementParser.js +14 -0
  27. package/dist/esm/parsers/ClusterStatementParser.js.map +1 -0
  28. package/dist/esm/parsers/CommandExpressionParser.js.map +1 -1
  29. package/dist/esm/parsers/CommentOnParser.d.ts +23 -0
  30. package/dist/esm/parsers/CommentOnParser.js +61 -0
  31. package/dist/esm/parsers/CommentOnParser.js.map +1 -0
  32. package/dist/esm/parsers/CommonTableParser.d.ts +5 -1
  33. package/dist/esm/parsers/CommonTableParser.js +94 -16
  34. package/dist/esm/parsers/CommonTableParser.js.map +1 -1
  35. package/dist/esm/parsers/CreateIndexParser.js +12 -6
  36. package/dist/esm/parsers/CreateIndexParser.js.map +1 -1
  37. package/dist/esm/parsers/CreateTableParser.d.ts +2 -0
  38. package/dist/esm/parsers/CreateTableParser.js +11 -2
  39. package/dist/esm/parsers/CreateTableParser.js.map +1 -1
  40. package/dist/esm/parsers/ExplainStatementParser.js.map +1 -1
  41. package/dist/esm/parsers/FullNameParser.js +35 -3
  42. package/dist/esm/parsers/FullNameParser.js.map +1 -1
  43. package/dist/esm/parsers/OrderByClauseParser.js.map +1 -1
  44. package/dist/esm/parsers/ReindexStatementParser.d.ts +8 -0
  45. package/dist/esm/parsers/ReindexStatementParser.js +14 -0
  46. package/dist/esm/parsers/ReindexStatementParser.js.map +1 -0
  47. package/dist/esm/parsers/SelectQueryParser.js.map +1 -1
  48. package/dist/esm/parsers/SourceParser.js +6 -1
  49. package/dist/esm/parsers/SourceParser.js.map +1 -1
  50. package/dist/esm/parsers/SqlParser.d.ts +12 -2
  51. package/dist/esm/parsers/SqlParser.js +117 -251
  52. package/dist/esm/parsers/SqlParser.js.map +1 -1
  53. package/dist/esm/parsers/SqlPrintTokenParser.d.ts +1 -0
  54. package/dist/esm/parsers/SqlPrintTokenParser.js +32 -4
  55. package/dist/esm/parsers/SqlPrintTokenParser.js.map +1 -1
  56. package/dist/esm/parsers/SqlTokenizer.d.ts +5 -0
  57. package/dist/esm/parsers/SqlTokenizer.js +181 -67
  58. package/dist/esm/parsers/SqlTokenizer.js.map +1 -1
  59. package/dist/esm/parsers/UsingClauseParser.js.map +1 -1
  60. package/dist/esm/parsers/VacuumStatementParser.d.ts +8 -0
  61. package/dist/esm/parsers/VacuumStatementParser.js +14 -0
  62. package/dist/esm/parsers/VacuumStatementParser.js.map +1 -0
  63. package/dist/esm/tokenReaders/CommandTokenReader.js +22 -4
  64. package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -1
  65. package/dist/esm/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
  66. package/dist/esm/tokenReaders/StringSpecifierTokenReader.js +30 -13
  67. package/dist/esm/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
  68. package/dist/esm/tokenReaders/TokenReaderManager.d.ts +0 -7
  69. package/dist/esm/tokenReaders/TokenReaderManager.js +16 -48
  70. package/dist/esm/tokenReaders/TokenReaderManager.js.map +1 -1
  71. package/dist/esm/transformers/AliasRenamer.d.ts +1 -0
  72. package/dist/esm/transformers/AliasRenamer.js +7 -1
  73. package/dist/esm/transformers/AliasRenamer.js.map +1 -1
  74. package/dist/esm/transformers/CTECollector.d.ts +5 -2
  75. package/dist/esm/transformers/CTECollector.js +49 -0
  76. package/dist/esm/transformers/CTECollector.js.map +1 -1
  77. package/dist/esm/transformers/CTEDependencyTracer.d.ts +6 -1
  78. package/dist/esm/transformers/CTEDependencyTracer.js +44 -2
  79. package/dist/esm/transformers/CTEDependencyTracer.js.map +1 -1
  80. package/dist/esm/transformers/CTEDisabler.d.ts +6 -0
  81. package/dist/esm/transformers/CTEDisabler.js +19 -0
  82. package/dist/esm/transformers/CTEDisabler.js.map +1 -1
  83. package/dist/esm/transformers/CTERenamer.js +5 -2
  84. package/dist/esm/transformers/CTERenamer.js.map +1 -1
  85. package/dist/esm/transformers/ColumnReferenceCollector.d.ts +4 -0
  86. package/dist/esm/transformers/ColumnReferenceCollector.js +69 -1
  87. package/dist/esm/transformers/ColumnReferenceCollector.js.map +1 -1
  88. package/dist/esm/transformers/DeleteResultSelectConverter.js.map +1 -1
  89. package/dist/esm/transformers/DynamicQueryBuilder.d.ts +87 -11
  90. package/dist/esm/transformers/DynamicQueryBuilder.js +237 -9
  91. package/dist/esm/transformers/DynamicQueryBuilder.js.map +1 -1
  92. package/dist/esm/transformers/ExistsPredicateInjector.d.ts +33 -0
  93. package/dist/esm/transformers/ExistsPredicateInjector.js +294 -0
  94. package/dist/esm/transformers/ExistsPredicateInjector.js.map +1 -0
  95. package/dist/esm/transformers/FixtureCteBuilder.js +5 -2
  96. package/dist/esm/transformers/FixtureCteBuilder.js.map +1 -1
  97. package/dist/esm/transformers/InsertResultSelectConverter.d.ts +1 -0
  98. package/dist/esm/transformers/InsertResultSelectConverter.js +28 -7
  99. package/dist/esm/transformers/InsertResultSelectConverter.js.map +1 -1
  100. package/dist/esm/transformers/LinePrinter.d.ts +4 -2
  101. package/dist/esm/transformers/LinePrinter.js +93 -22
  102. package/dist/esm/transformers/LinePrinter.js.map +1 -1
  103. package/dist/esm/transformers/MergeResultSelectConverter.js.map +1 -1
  104. package/dist/esm/transformers/OptimizeUnusedLeftJoins.d.ts +33 -0
  105. package/dist/esm/transformers/OptimizeUnusedLeftJoins.js +333 -0
  106. package/dist/esm/transformers/OptimizeUnusedLeftJoins.js.map +1 -0
  107. package/dist/esm/transformers/PruneOptionalConditionBranches.d.ts +10 -0
  108. package/dist/esm/transformers/PruneOptionalConditionBranches.js +197 -0
  109. package/dist/esm/transformers/PruneOptionalConditionBranches.js.map +1 -0
  110. package/dist/esm/transformers/SchemaCollector.d.ts +3 -0
  111. package/dist/esm/transformers/SchemaCollector.js +37 -1
  112. package/dist/esm/transformers/SchemaCollector.js.map +1 -1
  113. package/dist/esm/transformers/SelectValueCollector.d.ts +5 -0
  114. package/dist/esm/transformers/SelectValueCollector.js +44 -2
  115. package/dist/esm/transformers/SelectValueCollector.js.map +1 -1
  116. package/dist/esm/transformers/SqlParamInjector.d.ts +5 -1
  117. package/dist/esm/transformers/SqlParamInjector.js +47 -11
  118. package/dist/esm/transformers/SqlParamInjector.js.map +1 -1
  119. package/dist/esm/transformers/SqlPrinter.js +8 -2
  120. package/dist/esm/transformers/SqlPrinter.js.map +1 -1
  121. package/dist/esm/transformers/TableSourceCollector.d.ts +9 -1
  122. package/dist/esm/transformers/TableSourceCollector.js +72 -5
  123. package/dist/esm/transformers/TableSourceCollector.js.map +1 -1
  124. package/dist/esm/transformers/UpdateResultSelectConverter.js.map +1 -1
  125. package/dist/esm/transformers/UpstreamSelectQueryFinder.d.ts +5 -0
  126. package/dist/esm/transformers/UpstreamSelectQueryFinder.js +46 -1
  127. package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  128. package/dist/esm/utils/CommentUtils.d.ts +1 -0
  129. package/dist/esm/utils/CommentUtils.js +14 -4
  130. package/dist/esm/utils/CommentUtils.js.map +1 -1
  131. package/dist/esm/utils/MultiQuerySplitter.d.ts +7 -11
  132. package/dist/esm/utils/MultiQuerySplitter.js +105 -66
  133. package/dist/esm/utils/MultiQuerySplitter.js.map +1 -1
  134. package/dist/esm/utils/ParameterRemover.d.ts +4 -0
  135. package/dist/esm/utils/ParameterRemover.js +23 -0
  136. package/dist/esm/utils/ParameterRemover.js.map +1 -1
  137. package/dist/esm/utils/ScopeResolver.d.ts +5 -2
  138. package/dist/esm/utils/ScopeResolver.js +37 -18
  139. package/dist/esm/utils/ScopeResolver.js.map +1 -1
  140. package/dist/esm/utils/charLookupTable.d.ts +6 -0
  141. package/dist/esm/utils/charLookupTable.js +9 -1
  142. package/dist/esm/utils/charLookupTable.js.map +1 -1
  143. package/dist/esm/utils/serialTypeNormalization.d.ts +15 -0
  144. package/dist/esm/utils/serialTypeNormalization.js +55 -0
  145. package/dist/esm/utils/serialTypeNormalization.js.map +1 -0
  146. package/dist/esm/utils/stringUtils.js +51 -26
  147. package/dist/esm/utils/stringUtils.js.map +1 -1
  148. package/dist/index.js +2 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/index.min.js +21 -19
  151. package/dist/index.min.js.map +4 -4
  152. package/dist/models/CreateTableQuery.js +5 -4
  153. package/dist/models/CreateTableQuery.js.map +1 -1
  154. package/dist/models/DDLStatements.js +14 -1
  155. package/dist/models/DDLStatements.js.map +1 -1
  156. package/dist/models/KeywordTrie.js +26 -27
  157. package/dist/models/KeywordTrie.js.map +1 -1
  158. package/dist/models/SqlPrintToken.js +1 -0
  159. package/dist/models/SqlPrintToken.js.map +1 -1
  160. package/dist/parsers/CommentOnParser.js +65 -0
  161. package/dist/parsers/CommentOnParser.js.map +1 -0
  162. package/dist/parsers/CreateIndexParser.js +12 -6
  163. package/dist/parsers/CreateIndexParser.js.map +1 -1
  164. package/dist/parsers/CreateTableParser.js +6 -1
  165. package/dist/parsers/CreateTableParser.js.map +1 -1
  166. package/dist/parsers/FullNameParser.js +35 -3
  167. package/dist/parsers/FullNameParser.js.map +1 -1
  168. package/dist/parsers/SqlParser.js +93 -307
  169. package/dist/parsers/SqlParser.js.map +1 -1
  170. package/dist/parsers/SqlPrintTokenParser.js +27 -3
  171. package/dist/parsers/SqlPrintTokenParser.js.map +1 -1
  172. package/dist/parsers/SqlTokenizer.js +176 -67
  173. package/dist/parsers/SqlTokenizer.js.map +1 -1
  174. package/dist/src/index.d.ts +2 -0
  175. package/dist/src/models/CreateTableQuery.d.ts +3 -0
  176. package/dist/src/models/DDLStatements.d.ts +15 -0
  177. package/dist/src/models/KeywordTrie.d.ts +2 -3
  178. package/dist/src/models/SqlPrintToken.d.ts +1 -0
  179. package/dist/src/parsers/CommentOnParser.d.ts +23 -0
  180. package/dist/src/parsers/CreateTableParser.d.ts +1 -0
  181. package/dist/src/parsers/SqlParser.d.ts +8 -2
  182. package/dist/src/parsers/SqlPrintTokenParser.d.ts +1 -0
  183. package/dist/src/parsers/SqlTokenizer.d.ts +5 -0
  184. package/dist/src/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
  185. package/dist/src/tokenReaders/TokenReaderManager.d.ts +0 -7
  186. package/dist/src/transformers/DynamicQueryBuilder.d.ts +12 -0
  187. package/dist/src/transformers/LinePrinter.d.ts +4 -2
  188. package/dist/src/transformers/PruneOptionalConditionBranches.d.ts +10 -0
  189. package/dist/src/utils/CommentUtils.d.ts +1 -0
  190. package/dist/src/utils/MultiQuerySplitter.d.ts +7 -11
  191. package/dist/tokenReaders/CommandTokenReader.js +21 -4
  192. package/dist/tokenReaders/CommandTokenReader.js.map +1 -1
  193. package/dist/tokenReaders/StringSpecifierTokenReader.js +30 -13
  194. package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
  195. package/dist/tokenReaders/TokenReaderManager.js +16 -48
  196. package/dist/tokenReaders/TokenReaderManager.js.map +1 -1
  197. package/dist/transformers/DynamicQueryBuilder.js +24 -2
  198. package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
  199. package/dist/transformers/LinePrinter.js +93 -22
  200. package/dist/transformers/LinePrinter.js.map +1 -1
  201. package/dist/transformers/PruneOptionalConditionBranches.js +201 -0
  202. package/dist/transformers/PruneOptionalConditionBranches.js.map +1 -0
  203. package/dist/tsconfig.browser.tsbuildinfo +1 -1
  204. package/dist/utils/CommentUtils.js +14 -4
  205. package/dist/utils/CommentUtils.js.map +1 -1
  206. package/dist/utils/MultiQuerySplitter.js +105 -66
  207. package/dist/utils/MultiQuerySplitter.js.map +1 -1
  208. package/dist/utils/stringUtils.js +42 -23
  209. package/dist/utils/stringUtils.js.map +1 -1
  210. package/package.json +65 -64
  211. package/LICENSE +0 -21
@@ -4,6 +4,26 @@ exports.FullNameParser = void 0;
4
4
  const Lexeme_1 = require("../models/Lexeme");
5
5
  const ValueComponent_1 = require("../models/ValueComponent");
6
6
  const SqlTokenizer_1 = require("./SqlTokenizer");
7
+ /**
8
+ * PostgreSQL non-reserved keywords that may appear as Command tokens,
9
+ * but should still be accepted when parsing identifier positions.
10
+ * This set is intentionally limited to identifier contexts in FullNameParser.
11
+ */
12
+ const POSTGRESQL_COMMAND_KEYWORDS_ALLOWED_AS_IDENTIFIER = new Set([
13
+ 'groups', // window frame type: GROUPS BETWEEN ...
14
+ 'rows', // window frame type: ROWS BETWEEN ...
15
+ 'range', // window frame type: RANGE BETWEEN ...
16
+ 'window', // window clause: WINDOW w AS (...)
17
+ 'over', // window function: func() OVER (...)
18
+ 'following', // window frame bound: n FOLLOWING
19
+ 'preceding', // window frame bound: n PRECEDING
20
+ 'within', // ordered-set aggregate: WITHIN GROUP (...)
21
+ 'ordinality', // table function: WITH ORDINALITY
22
+ 'lateral', // lateral join/subquery
23
+ 'recursive', // CTE: WITH RECURSIVE
24
+ 'materialized', // CTE: AS MATERIALIZED / AS NOT MATERIALIZED
25
+ 'partition', // partitioning / window PARTITION BY
26
+ ]);
7
27
  /**
8
28
  * Utility class for parsing fully qualified names (e.g. db.schema.table or db.schema.table.column_name)
9
29
  * This can be used for both table and column references.
@@ -21,10 +41,15 @@ class FullNameParser {
21
41
  if (newIndex > index) {
22
42
  const lastLexeme = lexemes[newIndex - 1];
23
43
  if (lastLexeme.positionedComments && lastLexeme.positionedComments.length > 0) {
24
- identifierString.positionedComments = lastLexeme.positionedComments;
44
+ identifierString.positionedComments = [...lastLexeme.positionedComments];
25
45
  }
26
- else if (lastLexeme.comments && lastLexeme.comments.length > 0) {
27
- identifierString;
46
+ // Preserve legacy comments when positioned comments are absent.
47
+ // This keeps backward-compatible comment transfer behavior for callers
48
+ // that still read from the `comments` field.
49
+ if ((!identifierString.positionedComments || identifierString.positionedComments.length === 0) &&
50
+ lastLexeme.comments &&
51
+ lastLexeme.comments.length > 0) {
52
+ identifierString.comments = [...lastLexeme.comments];
28
53
  }
29
54
  }
30
55
  // Returns the type of the last token in the identifier sequence
@@ -77,6 +102,13 @@ class FullNameParser {
77
102
  identifiers.push(lexemes[idx].value);
78
103
  idx++;
79
104
  }
105
+ else if ((lexemes[idx].type & Lexeme_1.TokenType.Command) &&
106
+ POSTGRESQL_COMMAND_KEYWORDS_ALLOWED_AS_IDENTIFIER.has(lexemes[idx].value.toLowerCase())) {
107
+ // Accept selected PostgreSQL non-reserved keywords only when this parser
108
+ // is reading an identifier position (e.g. schema.table or table.column).
109
+ identifiers.push(lexemes[idx].value);
110
+ idx++;
111
+ }
80
112
  else if (lexemes[idx].value === "*") {
81
113
  // The wildcard '*' is always treated as the terminal part of a qualified name in SQL (e.g., db.schema.* or [db].[schema].*).
82
114
  // No valid SQL syntax allows a wildcard in the middle of a multi-part name.
@@ -1 +1 @@
1
- {"version":3,"file":"FullNameParser.js","sourceRoot":"","sources":["../../src/parsers/FullNameParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FullNameParser.js","sourceRoot":"","sources":["../../src/parsers/FullNameParser.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ const VacuumStatementParser_1 = require("./VacuumStatementParser");
23
23
  const ReindexStatementParser_1 = require("./ReindexStatementParser");
24
24
  const ClusterStatementParser_1 = require("./ClusterStatementParser");
25
25
  const CheckpointStatementParser_1 = require("./CheckpointStatementParser");
26
+ const CommentOnParser_1 = require("./CommentOnParser");
26
27
  /**
27
28
  * Canonical entry point for SQL parsing.
28
29
  * Delegates to dedicated parsers for SELECT, INSERT, UPDATE, and DELETE statements, and is designed to embrace additional statement types next.
@@ -33,6 +34,19 @@ class SqlParser {
33
34
  const skipEmpty = (_a = options.skipEmptyStatements) !== null && _a !== void 0 ? _a : true;
34
35
  const mode = (_b = options.mode) !== null && _b !== void 0 ? _b : 'single';
35
36
  const tokenizer = new SqlTokenizer_1.SqlTokenizer(sql);
37
+ // Fast path for the common single-statement parse used by benchmarks and most callers.
38
+ if (mode === 'single' && skipEmpty) {
39
+ const first = this.readNextMeaningfulStatement(tokenizer, 0);
40
+ if (!first) {
41
+ throw new Error('[SqlParser] No SQL statements found in input.');
42
+ }
43
+ const parsed = this.dispatchParse(first, 1);
44
+ const remainder = this.readNextMeaningfulStatement(tokenizer, first.nextPosition);
45
+ if (remainder) {
46
+ throw new Error('[SqlParser] Unexpected additional statement detected at index 2. Use parseMany or set mode to "multiple" to allow multiple statements.');
47
+ }
48
+ return parsed;
49
+ }
36
50
  // Acquire the first meaningful statement so future dispatching can inspect its leading keyword.
37
51
  const first = this.consumeNextStatement(tokenizer, 0, skipEmpty);
38
52
  if (!first) {
@@ -110,6 +124,7 @@ class SqlParser {
110
124
  return this.parseDeleteStatement(segment, statementIndex);
111
125
  case 'create table':
112
126
  case 'create temporary table':
127
+ case 'create unlogged table':
113
128
  return this.parseCreateTableStatement(segment, statementIndex);
114
129
  case 'merge into':
115
130
  return this.parseMergeStatement(segment, statementIndex);
@@ -134,6 +149,9 @@ class SqlParser {
134
149
  return this.parseAlterSequenceStatement(segment, statementIndex);
135
150
  case 'drop constraint':
136
151
  return this.parseDropConstraintStatement(segment, statementIndex);
152
+ case 'comment on table':
153
+ case 'comment on column':
154
+ return this.parseCommentOnStatement(segment, statementIndex);
137
155
  case 'analyze':
138
156
  return this.parseAnalyzeStatement(segment, statementIndex);
139
157
  case 'explain':
@@ -155,360 +173,110 @@ class SqlParser {
155
173
  }
156
174
  }
157
175
  static parseSelectStatement(segment, statementIndex) {
158
- var _a, _b;
159
- try {
160
- const result = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(segment.lexemes, 0);
161
- if (result.newIndex < segment.lexemes.length) {
162
- const unexpected = segment.lexemes[result.newIndex];
163
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
164
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
165
- }
166
- return result.value;
167
- }
168
- catch (error) {
169
- const message = error instanceof Error ? error.message : String(error);
170
- throw new Error(`[SqlParser] Failed to parse SELECT statement ${statementIndex}: ${message}`);
171
- }
176
+ return this.parseStatementWithParser(segment, statementIndex, 'SELECT', (lexemes, startIndex) => SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, startIndex));
172
177
  }
173
178
  static parseExplainStatement(segment, statementIndex) {
174
- var _a, _b;
175
- try {
176
- const result = ExplainStatementParser_1.ExplainStatementParser.parseFromLexeme(segment.lexemes, 0, (lexemes, nestedStart) => {
177
- if (nestedStart >= lexemes.length) {
178
- throw new Error("[ExplainStatementParser] Missing statement after EXPLAIN options.");
179
- }
180
- const nestedSegment = {
181
- lexemes: lexemes.slice(nestedStart),
182
- statementStart: segment.statementStart,
183
- statementEnd: segment.statementEnd,
184
- nextPosition: segment.nextPosition,
185
- rawText: segment.rawText,
186
- leadingComments: segment.leadingComments,
187
- };
188
- const statement = this.dispatchParse(nestedSegment, statementIndex);
189
- return { value: statement, newIndex: lexemes.length };
190
- });
191
- if (result.newIndex < segment.lexemes.length) {
192
- const unexpected = segment.lexemes[result.newIndex];
193
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
194
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in EXPLAIN statement ${statementIndex} at character ${position}.`);
179
+ return this.parseStatementWithCallback(segment, statementIndex, 'EXPLAIN', () => ExplainStatementParser_1.ExplainStatementParser.parseFromLexeme(segment.lexemes, 0, (lexemes, nestedStart) => {
180
+ if (nestedStart >= lexemes.length) {
181
+ throw new Error("[ExplainStatementParser] Missing statement after EXPLAIN options.");
195
182
  }
196
- return result.value;
197
- }
198
- catch (error) {
199
- const message = error instanceof Error ? error.message : String(error);
200
- throw new Error(`[SqlParser] Failed to parse EXPLAIN statement ${statementIndex}: ${message}`);
201
- }
183
+ const nestedSegment = {
184
+ lexemes: lexemes.slice(nestedStart),
185
+ statementStart: segment.statementStart,
186
+ statementEnd: segment.statementEnd,
187
+ nextPosition: segment.nextPosition,
188
+ rawText: segment.rawText,
189
+ leadingComments: segment.leadingComments,
190
+ };
191
+ const statement = this.dispatchParse(nestedSegment, statementIndex);
192
+ return { value: statement, newIndex: lexemes.length };
193
+ }), `EXPLAIN statement ${statementIndex}`);
202
194
  }
203
195
  static parseVacuumStatement(segment, statementIndex) {
204
- var _a, _b;
205
- try {
206
- const result = VacuumStatementParser_1.VacuumStatementParser.parseFromLexeme(segment.lexemes, 0);
207
- if (result.newIndex < segment.lexemes.length) {
208
- const unexpected = segment.lexemes[result.newIndex];
209
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
210
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in VACUUM statement ${statementIndex} at character ${position}.`);
211
- }
212
- return result.value;
213
- }
214
- catch (error) {
215
- const message = error instanceof Error ? error.message : String(error);
216
- throw new Error(`[SqlParser] Failed to parse VACUUM statement ${statementIndex}: ${message}`);
217
- }
196
+ return this.parseStatementWithParser(segment, statementIndex, 'VACUUM', (lexemes, startIndex) => VacuumStatementParser_1.VacuumStatementParser.parseFromLexeme(lexemes, startIndex), `VACUUM statement ${statementIndex}`);
218
197
  }
219
198
  static parseReindexStatement(segment, statementIndex) {
220
- var _a, _b;
221
- try {
222
- const result = ReindexStatementParser_1.ReindexStatementParser.parseFromLexeme(segment.lexemes, 0);
223
- if (result.newIndex < segment.lexemes.length) {
224
- const unexpected = segment.lexemes[result.newIndex];
225
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
226
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in REINDEX statement ${statementIndex} at character ${position}.`);
227
- }
228
- return result.value;
229
- }
230
- catch (error) {
231
- const message = error instanceof Error ? error.message : String(error);
232
- throw new Error(`[SqlParser] Failed to parse REINDEX statement ${statementIndex}: ${message}`);
233
- }
199
+ return this.parseStatementWithParser(segment, statementIndex, 'REINDEX', (lexemes, startIndex) => ReindexStatementParser_1.ReindexStatementParser.parseFromLexeme(lexemes, startIndex), `REINDEX statement ${statementIndex}`);
234
200
  }
235
201
  static parseClusterStatement(segment, statementIndex) {
236
- var _a, _b;
237
- try {
238
- const result = ClusterStatementParser_1.ClusterStatementParser.parseFromLexeme(segment.lexemes, 0);
239
- if (result.newIndex < segment.lexemes.length) {
240
- const unexpected = segment.lexemes[result.newIndex];
241
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
242
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in CLUSTER statement ${statementIndex} at character ${position}.`);
243
- }
244
- return result.value;
245
- }
246
- catch (error) {
247
- const message = error instanceof Error ? error.message : String(error);
248
- throw new Error(`[SqlParser] Failed to parse CLUSTER statement ${statementIndex}: ${message}`);
249
- }
202
+ return this.parseStatementWithParser(segment, statementIndex, 'CLUSTER', (lexemes, startIndex) => ClusterStatementParser_1.ClusterStatementParser.parseFromLexeme(lexemes, startIndex), `CLUSTER statement ${statementIndex}`);
250
203
  }
251
204
  static parseCheckpointStatement(segment, statementIndex) {
252
- var _a, _b;
253
- try {
254
- const result = CheckpointStatementParser_1.CheckpointStatementParser.parseFromLexeme(segment.lexemes, 0);
255
- if (result.newIndex < segment.lexemes.length) {
256
- const unexpected = segment.lexemes[result.newIndex];
257
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
258
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in CHECKPOINT statement ${statementIndex} at character ${position}.`);
259
- }
260
- return result.value;
261
- }
262
- catch (error) {
263
- const message = error instanceof Error ? error.message : String(error);
264
- throw new Error(`[SqlParser] Failed to parse CHECKPOINT statement ${statementIndex}: ${message}`);
265
- }
205
+ return this.parseStatementWithParser(segment, statementIndex, 'CHECKPOINT', (lexemes, startIndex) => CheckpointStatementParser_1.CheckpointStatementParser.parseFromLexeme(lexemes, startIndex), `CHECKPOINT statement ${statementIndex}`);
266
206
  }
267
207
  static parseInsertStatement(segment, statementIndex) {
268
- var _a, _b;
269
- try {
270
- const result = InsertQueryParser_1.InsertQueryParser.parseFromLexeme(segment.lexemes, 0);
271
- if (result.newIndex < segment.lexemes.length) {
272
- const unexpected = segment.lexemes[result.newIndex];
273
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
274
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
275
- }
276
- return result.value;
277
- }
278
- catch (error) {
279
- const message = error instanceof Error ? error.message : String(error);
280
- throw new Error(`[SqlParser] Failed to parse INSERT statement ${statementIndex}: ${message}`);
281
- }
208
+ return this.parseStatementWithParser(segment, statementIndex, 'INSERT', (lexemes, startIndex) => InsertQueryParser_1.InsertQueryParser.parseFromLexeme(lexemes, startIndex));
282
209
  }
283
210
  static parseUpdateStatement(segment, statementIndex) {
284
- var _a, _b;
285
- try {
286
- const result = UpdateQueryParser_1.UpdateQueryParser.parseFromLexeme(segment.lexemes, 0);
287
- if (result.newIndex < segment.lexemes.length) {
288
- const unexpected = segment.lexemes[result.newIndex];
289
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
290
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
291
- }
292
- return result.value;
293
- }
294
- catch (error) {
295
- const message = error instanceof Error ? error.message : String(error);
296
- throw new Error(`[SqlParser] Failed to parse UPDATE statement ${statementIndex}: ${message}`);
297
- }
211
+ return this.parseStatementWithParser(segment, statementIndex, 'UPDATE', (lexemes, startIndex) => UpdateQueryParser_1.UpdateQueryParser.parseFromLexeme(lexemes, startIndex));
298
212
  }
299
213
  static parseDeleteStatement(segment, statementIndex) {
300
- var _a, _b;
301
- try {
302
- const result = DeleteQueryParser_1.DeleteQueryParser.parseFromLexeme(segment.lexemes, 0);
303
- // Guard against trailing tokens that would indicate multiple statements in DELETE parsing.
304
- if (result.newIndex < segment.lexemes.length) {
305
- const unexpected = segment.lexemes[result.newIndex];
306
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
307
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
308
- }
309
- return result.value;
310
- }
311
- catch (error) {
312
- const message = error instanceof Error ? error.message : String(error);
313
- throw new Error(`[SqlParser] Failed to parse DELETE statement ${statementIndex}: ${message}`);
314
- }
214
+ return this.parseStatementWithParser(segment, statementIndex, 'DELETE', (lexemes, startIndex) => DeleteQueryParser_1.DeleteQueryParser.parseFromLexeme(lexemes, startIndex));
315
215
  }
316
216
  static parseCreateTableStatement(segment, statementIndex) {
317
- var _a, _b;
318
- try {
319
- const result = CreateTableParser_1.CreateTableParser.parseFromLexeme(segment.lexemes, 0);
320
- if (result.newIndex < segment.lexemes.length) {
321
- const unexpected = segment.lexemes[result.newIndex];
322
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
323
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
324
- }
325
- return result.value;
326
- }
327
- catch (error) {
328
- const message = error instanceof Error ? error.message : String(error);
329
- throw new Error(`[SqlParser] Failed to parse CREATE TABLE statement ${statementIndex}: ${message}`);
330
- }
217
+ return this.parseStatementWithParser(segment, statementIndex, 'CREATE TABLE', (lexemes, startIndex) => CreateTableParser_1.CreateTableParser.parseFromLexeme(lexemes, startIndex));
331
218
  }
332
219
  static parseDropTableStatement(segment, statementIndex) {
333
- var _a, _b;
334
- try {
335
- const result = DropTableParser_1.DropTableParser.parseFromLexeme(segment.lexemes, 0);
336
- if (result.newIndex < segment.lexemes.length) {
337
- const unexpected = segment.lexemes[result.newIndex];
338
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
339
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
340
- }
341
- return result.value;
342
- }
343
- catch (error) {
344
- const message = error instanceof Error ? error.message : String(error);
345
- throw new Error(`[SqlParser] Failed to parse DROP TABLE statement ${statementIndex}: ${message}`);
346
- }
220
+ return this.parseStatementWithParser(segment, statementIndex, 'DROP TABLE', (lexemes, startIndex) => DropTableParser_1.DropTableParser.parseFromLexeme(lexemes, startIndex));
347
221
  }
348
222
  static parseDropSchemaStatement(segment, statementIndex) {
349
- var _a, _b;
350
- try {
351
- const result = DropSchemaParser_1.DropSchemaParser.parseFromLexeme(segment.lexemes, 0);
352
- if (result.newIndex < segment.lexemes.length) {
353
- const unexpected = segment.lexemes[result.newIndex];
354
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
355
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
356
- }
357
- return result.value;
358
- }
359
- catch (error) {
360
- const message = error instanceof Error ? error.message : String(error);
361
- throw new Error(`[SqlParser] Failed to parse DROP SCHEMA statement ${statementIndex}: ${message}`);
362
- }
223
+ return this.parseStatementWithParser(segment, statementIndex, 'DROP SCHEMA', (lexemes, startIndex) => DropSchemaParser_1.DropSchemaParser.parseFromLexeme(lexemes, startIndex));
363
224
  }
364
225
  static parseDropIndexStatement(segment, statementIndex) {
365
- var _a, _b;
366
- try {
367
- const result = DropIndexParser_1.DropIndexParser.parseFromLexeme(segment.lexemes, 0);
368
- if (result.newIndex < segment.lexemes.length) {
369
- const unexpected = segment.lexemes[result.newIndex];
370
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
371
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
372
- }
373
- return result.value;
374
- }
375
- catch (error) {
376
- const message = error instanceof Error ? error.message : String(error);
377
- throw new Error(`[SqlParser] Failed to parse DROP INDEX statement ${statementIndex}: ${message}`);
378
- }
226
+ return this.parseStatementWithParser(segment, statementIndex, 'DROP INDEX', (lexemes, startIndex) => DropIndexParser_1.DropIndexParser.parseFromLexeme(lexemes, startIndex));
379
227
  }
380
228
  static parseCreateIndexStatement(segment, statementIndex) {
381
- var _a, _b;
382
- try {
383
- const result = CreateIndexParser_1.CreateIndexParser.parseFromLexeme(segment.lexemes, 0);
384
- if (result.newIndex < segment.lexemes.length) {
385
- const unexpected = segment.lexemes[result.newIndex];
386
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
387
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
388
- }
389
- return result.value;
390
- }
391
- catch (error) {
392
- const message = error instanceof Error ? error.message : String(error);
393
- throw new Error(`[SqlParser] Failed to parse CREATE INDEX statement ${statementIndex}: ${message}`);
394
- }
229
+ return this.parseStatementWithParser(segment, statementIndex, 'CREATE INDEX', (lexemes, startIndex) => CreateIndexParser_1.CreateIndexParser.parseFromLexeme(lexemes, startIndex));
395
230
  }
396
231
  static parseCreateSchemaStatement(segment, statementIndex) {
397
- var _a, _b;
398
- try {
399
- const result = CreateSchemaParser_1.CreateSchemaParser.parseFromLexeme(segment.lexemes, 0);
400
- if (result.newIndex < segment.lexemes.length) {
401
- const unexpected = segment.lexemes[result.newIndex];
402
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
403
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
404
- }
405
- return result.value;
406
- }
407
- catch (error) {
408
- const message = error instanceof Error ? error.message : String(error);
409
- throw new Error(`[SqlParser] Failed to parse CREATE SCHEMA statement ${statementIndex}: ${message}`);
410
- }
232
+ return this.parseStatementWithParser(segment, statementIndex, 'CREATE SCHEMA', (lexemes, startIndex) => CreateSchemaParser_1.CreateSchemaParser.parseFromLexeme(lexemes, startIndex));
411
233
  }
412
234
  static parseCreateSequenceStatement(segment, statementIndex) {
413
- var _a, _b;
414
- try {
415
- const result = SequenceParser_1.CreateSequenceParser.parseFromLexeme(segment.lexemes, 0);
416
- // Ensure no trailing lexemes remain after the CREATE SEQUENCE clause.
417
- if (result.newIndex < segment.lexemes.length) {
418
- const unexpected = segment.lexemes[result.newIndex];
419
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
420
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
421
- }
422
- return result.value;
423
- }
424
- catch (error) {
425
- const message = error instanceof Error ? error.message : String(error);
426
- throw new Error(`[SqlParser] Failed to parse CREATE SEQUENCE statement ${statementIndex}: ${message}`);
427
- }
235
+ return this.parseStatementWithParser(segment, statementIndex, 'CREATE SEQUENCE', (lexemes, startIndex) => SequenceParser_1.CreateSequenceParser.parseFromLexeme(lexemes, startIndex));
428
236
  }
429
237
  static parseAlterSequenceStatement(segment, statementIndex) {
430
- var _a, _b;
431
- try {
432
- const result = SequenceParser_1.AlterSequenceParser.parseFromLexeme(segment.lexemes, 0);
433
- // Validate that the ALTER SEQUENCE statement consumed all available tokens.
434
- if (result.newIndex < segment.lexemes.length) {
435
- const unexpected = segment.lexemes[result.newIndex];
436
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
437
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
438
- }
439
- return result.value;
440
- }
441
- catch (error) {
442
- const message = error instanceof Error ? error.message : String(error);
443
- throw new Error(`[SqlParser] Failed to parse ALTER SEQUENCE statement ${statementIndex}: ${message}`);
444
- }
238
+ return this.parseStatementWithParser(segment, statementIndex, 'ALTER SEQUENCE', (lexemes, startIndex) => SequenceParser_1.AlterSequenceParser.parseFromLexeme(lexemes, startIndex));
445
239
  }
446
240
  static parseAlterTableStatement(segment, statementIndex) {
447
- var _a, _b;
448
- try {
449
- const result = AlterTableParser_1.AlterTableParser.parseFromLexeme(segment.lexemes, 0);
450
- if (result.newIndex < segment.lexemes.length) {
451
- const unexpected = segment.lexemes[result.newIndex];
452
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
453
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
454
- }
455
- return result.value;
456
- }
457
- catch (error) {
458
- const message = error instanceof Error ? error.message : String(error);
459
- throw new Error(`[SqlParser] Failed to parse ALTER TABLE statement ${statementIndex}: ${message}`);
460
- }
241
+ return this.parseStatementWithParser(segment, statementIndex, 'ALTER TABLE', (lexemes, startIndex) => AlterTableParser_1.AlterTableParser.parseFromLexeme(lexemes, startIndex));
461
242
  }
462
243
  static parseDropConstraintStatement(segment, statementIndex) {
463
- var _a, _b;
464
- try {
465
- const result = DropConstraintParser_1.DropConstraintParser.parseFromLexeme(segment.lexemes, 0);
466
- if (result.newIndex < segment.lexemes.length) {
467
- const unexpected = segment.lexemes[result.newIndex];
468
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
469
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
470
- }
471
- return result.value;
472
- }
473
- catch (error) {
474
- const message = error instanceof Error ? error.message : String(error);
475
- throw new Error(`[SqlParser] Failed to parse DROP CONSTRAINT statement ${statementIndex}: ${message}`);
476
- }
244
+ return this.parseStatementWithParser(segment, statementIndex, 'DROP CONSTRAINT', (lexemes, startIndex) => DropConstraintParser_1.DropConstraintParser.parseFromLexeme(lexemes, startIndex));
245
+ }
246
+ static parseCommentOnStatement(segment, statementIndex) {
247
+ return this.parseStatementWithParser(segment, statementIndex, 'COMMENT ON', (lexemes, startIndex) => CommentOnParser_1.CommentOnParser.parseFromLexeme(lexemes, startIndex));
477
248
  }
478
249
  static parseAnalyzeStatement(segment, statementIndex) {
479
- var _a, _b;
250
+ return this.parseStatementWithParser(segment, statementIndex, 'ANALYZE', (lexemes, startIndex) => AnalyzeStatementParser_1.AnalyzeStatementParser.parseFromLexeme(lexemes, startIndex));
251
+ }
252
+ static parseMergeStatement(segment, statementIndex) {
253
+ return this.parseStatementWithParser(segment, statementIndex, 'MERGE', (lexemes, startIndex) => MergeQueryParser_1.MergeQueryParser.parseFromLexeme(lexemes, startIndex));
254
+ }
255
+ static parseStatementWithParser(segment, statementIndex, statementLabel, parser, trailingContext = `statement ${statementIndex}`) {
256
+ return this.parseStatementWithCallback(segment, statementIndex, statementLabel, () => parser(segment.lexemes, 0), trailingContext);
257
+ }
258
+ static parseStatementWithCallback(segment, statementIndex, statementLabel, parse, trailingContext = `statement ${statementIndex}`) {
480
259
  try {
481
- // Delegate lexeme interpretation to the ANALYZE-specific parser.
482
- const result = AnalyzeStatementParser_1.AnalyzeStatementParser.parseFromLexeme(segment.lexemes, 0);
483
- // Ensure parsing consumed every lexeme belonging to this statement.
484
- if (result.newIndex < segment.lexemes.length) {
485
- const unexpected = segment.lexemes[result.newIndex];
486
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
487
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
488
- }
260
+ const result = parse();
261
+ // Keep trailing-token validation centralized so every statement parser reports the same shape of error.
262
+ this.assertFullyConsumed(segment, result.newIndex, trailingContext);
489
263
  return result.value;
490
264
  }
491
265
  catch (error) {
492
- const message = error instanceof Error ? error.message : String(error);
493
- throw new Error(`[SqlParser] Failed to parse ANALYZE statement ${statementIndex}: ${message}`);
266
+ throw new Error(`[SqlParser] Failed to parse ${statementLabel} statement ${statementIndex}: ${this.errorMessage(error)}`);
494
267
  }
495
268
  }
496
- static parseMergeStatement(segment, statementIndex) {
269
+ static assertFullyConsumed(segment, newIndex, trailingContext) {
497
270
  var _a, _b;
498
- try {
499
- const result = MergeQueryParser_1.MergeQueryParser.parseFromLexeme(segment.lexemes, 0);
500
- if (result.newIndex < segment.lexemes.length) {
501
- // Guard against trailing tokens that would indicate parsing stopped prematurely.
502
- const unexpected = segment.lexemes[result.newIndex];
503
- const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
504
- throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in statement ${statementIndex} at character ${position}.`);
505
- }
506
- return result.value;
507
- }
508
- catch (error) {
509
- const message = error instanceof Error ? error.message : String(error);
510
- throw new Error(`[SqlParser] Failed to parse MERGE statement ${statementIndex}: ${message}`);
271
+ if (newIndex >= segment.lexemes.length) {
272
+ return;
511
273
  }
274
+ const unexpected = segment.lexemes[newIndex];
275
+ const position = (_b = (_a = unexpected.position) === null || _a === void 0 ? void 0 : _a.startPosition) !== null && _b !== void 0 ? _b : segment.statementStart;
276
+ throw new Error(`[SqlParser] Unexpected token "${unexpected.value}" in ${trailingContext} at character ${position}.`);
277
+ }
278
+ static errorMessage(error) {
279
+ return error instanceof Error ? error.message : String(error);
512
280
  }
513
281
  static getCommandAfterWith(lexemes) {
514
282
  var _a;
@@ -521,6 +289,24 @@ class SqlParser {
521
289
  return null;
522
290
  }
523
291
  }
292
+ static readNextMeaningfulStatement(tokenizer, cursor) {
293
+ let localCursor = cursor;
294
+ let carry = null;
295
+ while (true) {
296
+ const segment = tokenizer.readNextStatement(localCursor, carry);
297
+ carry = null;
298
+ if (!segment) {
299
+ return null;
300
+ }
301
+ if (segment.lexemes.length > 0) {
302
+ return segment;
303
+ }
304
+ localCursor = segment.nextPosition;
305
+ if (segment.leadingComments && segment.leadingComments.length > 0) {
306
+ carry = segment.leadingComments;
307
+ }
308
+ }
309
+ }
524
310
  static consumeNextStatement(tokenizer, cursor, skipEmpty) {
525
311
  let localCursor = cursor;
526
312
  let carry = null;