rawsql-ts 0.11.32-beta → 0.11.33-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/esm/index.js +9 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/index.min.js +37 -29
  4. package/dist/esm/index.min.js.map +4 -4
  5. package/dist/esm/src/formatters/OriginalFormatRestorer.d.ts +40 -0
  6. package/dist/esm/src/formatters/OriginalFormatRestorer.js +135 -0
  7. package/dist/esm/src/formatters/OriginalFormatRestorer.js.map +1 -0
  8. package/dist/esm/src/index.d.ts +11 -0
  9. package/dist/esm/src/index.js +9 -0
  10. package/dist/esm/src/index.js.map +1 -1
  11. package/dist/esm/src/models/FormattingLexeme.d.ts +66 -0
  12. package/dist/esm/src/models/FormattingLexeme.js +2 -0
  13. package/dist/esm/src/models/FormattingLexeme.js.map +1 -0
  14. package/dist/esm/src/models/ValueComponent.d.ts +3 -1
  15. package/dist/esm/src/models/ValueComponent.js +3 -1
  16. package/dist/esm/src/models/ValueComponent.js.map +1 -1
  17. package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +12 -0
  18. package/dist/esm/src/parsers/FunctionExpressionParser.js +111 -7
  19. package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
  20. package/dist/esm/src/parsers/KeywordParser.d.ts +1 -0
  21. package/dist/esm/src/parsers/KeywordParser.js +10 -4
  22. package/dist/esm/src/parsers/KeywordParser.js.map +1 -1
  23. package/dist/esm/src/parsers/SqlPrintTokenParser.js +8 -0
  24. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  25. package/dist/esm/src/parsers/SqlTokenizer.d.ts +42 -2
  26. package/dist/esm/src/parsers/SqlTokenizer.js +213 -12
  27. package/dist/esm/src/parsers/SqlTokenizer.js.map +1 -1
  28. package/dist/esm/src/tokenReaders/CommandTokenReader.d.ts +3 -0
  29. package/dist/esm/src/tokenReaders/CommandTokenReader.js +4 -1
  30. package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
  31. package/dist/esm/src/transformers/AliasRenamer.d.ts +199 -0
  32. package/dist/esm/src/transformers/AliasRenamer.js +595 -0
  33. package/dist/esm/src/transformers/AliasRenamer.js.map +1 -0
  34. package/dist/esm/src/transformers/CTERenamer.d.ts +53 -0
  35. package/dist/esm/src/transformers/CTERenamer.js +138 -0
  36. package/dist/esm/src/transformers/CTERenamer.js.map +1 -1
  37. package/dist/esm/src/transformers/DynamicQueryBuilder.d.ts +72 -0
  38. package/dist/esm/src/transformers/DynamicQueryBuilder.js +42 -0
  39. package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
  40. package/dist/esm/src/transformers/FilterableItemCollector.d.ts +80 -0
  41. package/dist/esm/src/transformers/FilterableItemCollector.js +254 -0
  42. package/dist/esm/src/transformers/FilterableItemCollector.js.map +1 -0
  43. package/dist/esm/src/transformers/SelectableColumnCollector.d.ts +3 -0
  44. package/dist/esm/src/transformers/SelectableColumnCollector.js +68 -7
  45. package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
  46. package/dist/esm/src/transformers/SmartRenamer.d.ts +134 -0
  47. package/dist/esm/src/transformers/SmartRenamer.js +430 -0
  48. package/dist/esm/src/transformers/SmartRenamer.js.map +1 -0
  49. package/dist/esm/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
  50. package/dist/esm/src/transformers/SqlIdentifierRenamer.js +493 -0
  51. package/dist/esm/src/transformers/SqlIdentifierRenamer.js.map +1 -0
  52. package/dist/esm/src/transformers/SqlParamInjector.d.ts +27 -0
  53. package/dist/esm/src/transformers/SqlParamInjector.js +304 -16
  54. package/dist/esm/src/transformers/SqlParamInjector.js.map +1 -1
  55. package/dist/esm/src/transformers/SqlSortInjector.js +6 -3
  56. package/dist/esm/src/transformers/SqlSortInjector.js.map +1 -1
  57. package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js +5 -2
  58. package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  59. package/dist/esm/src/utils/LexemeCursor.d.ts +41 -0
  60. package/dist/esm/src/utils/LexemeCursor.js +93 -0
  61. package/dist/esm/src/utils/LexemeCursor.js.map +1 -1
  62. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  63. package/dist/index.min.js +37 -29
  64. package/dist/index.min.js.map +4 -4
  65. package/dist/src/formatters/OriginalFormatRestorer.d.ts +40 -0
  66. package/dist/src/formatters/OriginalFormatRestorer.js +139 -0
  67. package/dist/src/formatters/OriginalFormatRestorer.js.map +1 -0
  68. package/dist/src/index.d.ts +11 -0
  69. package/dist/src/index.js +11 -1
  70. package/dist/src/index.js.map +1 -1
  71. package/dist/src/models/FormattingLexeme.d.ts +66 -0
  72. package/dist/src/models/FormattingLexeme.js +3 -0
  73. package/dist/src/models/FormattingLexeme.js.map +1 -0
  74. package/dist/src/models/ValueComponent.d.ts +3 -1
  75. package/dist/src/models/ValueComponent.js +3 -1
  76. package/dist/src/models/ValueComponent.js.map +1 -1
  77. package/dist/src/parsers/FunctionExpressionParser.d.ts +12 -0
  78. package/dist/src/parsers/FunctionExpressionParser.js +110 -6
  79. package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
  80. package/dist/src/parsers/KeywordParser.d.ts +1 -0
  81. package/dist/src/parsers/KeywordParser.js +10 -4
  82. package/dist/src/parsers/KeywordParser.js.map +1 -1
  83. package/dist/src/parsers/SqlPrintTokenParser.js +8 -0
  84. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  85. package/dist/src/parsers/SqlTokenizer.d.ts +42 -2
  86. package/dist/src/parsers/SqlTokenizer.js +222 -12
  87. package/dist/src/parsers/SqlTokenizer.js.map +1 -1
  88. package/dist/src/tokenReaders/CommandTokenReader.d.ts +3 -0
  89. package/dist/src/tokenReaders/CommandTokenReader.js +5 -2
  90. package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
  91. package/dist/src/transformers/AliasRenamer.d.ts +199 -0
  92. package/dist/src/transformers/AliasRenamer.js +599 -0
  93. package/dist/src/transformers/AliasRenamer.js.map +1 -0
  94. package/dist/src/transformers/CTERenamer.d.ts +53 -0
  95. package/dist/src/transformers/CTERenamer.js +138 -0
  96. package/dist/src/transformers/CTERenamer.js.map +1 -1
  97. package/dist/src/transformers/DynamicQueryBuilder.d.ts +72 -0
  98. package/dist/src/transformers/DynamicQueryBuilder.js +42 -0
  99. package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
  100. package/dist/src/transformers/FilterableItemCollector.d.ts +80 -0
  101. package/dist/src/transformers/FilterableItemCollector.js +259 -0
  102. package/dist/src/transformers/FilterableItemCollector.js.map +1 -0
  103. package/dist/src/transformers/SelectableColumnCollector.d.ts +3 -0
  104. package/dist/src/transformers/SelectableColumnCollector.js +67 -6
  105. package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
  106. package/dist/src/transformers/SmartRenamer.d.ts +134 -0
  107. package/dist/src/transformers/SmartRenamer.js +442 -0
  108. package/dist/src/transformers/SmartRenamer.js.map +1 -0
  109. package/dist/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
  110. package/dist/src/transformers/SqlIdentifierRenamer.js +497 -0
  111. package/dist/src/transformers/SqlIdentifierRenamer.js.map +1 -0
  112. package/dist/src/transformers/SqlParamInjector.d.ts +27 -0
  113. package/dist/src/transformers/SqlParamInjector.js +303 -15
  114. package/dist/src/transformers/SqlParamInjector.js.map +1 -1
  115. package/dist/src/transformers/SqlSortInjector.js +5 -2
  116. package/dist/src/transformers/SqlSortInjector.js.map +1 -1
  117. package/dist/src/transformers/UpstreamSelectQueryFinder.js +4 -1
  118. package/dist/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  119. package/dist/src/utils/LexemeCursor.d.ts +41 -0
  120. package/dist/src/utils/LexemeCursor.js +93 -0
  121. package/dist/src/utils/LexemeCursor.js.map +1 -1
  122. package/dist/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +1 -1
@@ -0,0 +1,497 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqlIdentifierRenamer = void 0;
4
+ /**
5
+ * Handles safe renaming of SQL identifiers within SQL strings
6
+ * Uses character-by-character parsing instead of regex for better performance and maintainability
7
+ */
8
+ class SqlIdentifierRenamer {
9
+ /**
10
+ * Safely renames identifiers in SQL string while preserving context
11
+ * @param sql SQL string to modify
12
+ * @param renames Map of original identifiers to new identifiers
13
+ * @returns Modified SQL string with renamed identifiers
14
+ */
15
+ renameIdentifiers(sql, renames) {
16
+ if (renames.size === 0) {
17
+ return sql;
18
+ }
19
+ let result = sql;
20
+ // Apply all renames
21
+ for (const [originalValue, newValue] of renames) {
22
+ result = this.replaceIdentifierSafely(result, originalValue, newValue);
23
+ }
24
+ return result;
25
+ }
26
+ /**
27
+ * Renames a single identifier in SQL string
28
+ * @param sql SQL string to modify
29
+ * @param oldIdentifier Original identifier to replace
30
+ * @param newIdentifier New identifier to replace with
31
+ * @returns Modified SQL string
32
+ */
33
+ renameIdentifier(sql, oldIdentifier, newIdentifier) {
34
+ return this.replaceIdentifierSafely(sql, oldIdentifier, newIdentifier);
35
+ }
36
+ /**
37
+ * Renames a single identifier within a specified scope range
38
+ * @param sql SQL string to modify
39
+ * @param oldIdentifier Original identifier to replace
40
+ * @param newIdentifier New identifier to replace with
41
+ * @param scopeRange Optional scope range to limit replacement
42
+ * @returns Modified SQL string
43
+ */
44
+ renameIdentifierInScope(sql, oldIdentifier, newIdentifier, scopeRange) {
45
+ if (!scopeRange) {
46
+ // Fallback to full SQL replacement
47
+ return this.replaceIdentifierSafely(sql, oldIdentifier, newIdentifier);
48
+ }
49
+ // Extract the portion of SQL within scope range
50
+ const beforeScope = sql.slice(0, scopeRange.start);
51
+ const scopeContent = sql.slice(scopeRange.start, scopeRange.end);
52
+ const afterScope = sql.slice(scopeRange.end);
53
+ // Replace identifiers only within the scope
54
+ const modifiedScopeContent = this.replaceIdentifierSafely(scopeContent, oldIdentifier, newIdentifier);
55
+ // Reconstruct the full SQL
56
+ return beforeScope + modifiedScopeContent + afterScope;
57
+ }
58
+ /**
59
+ * Checks if an identifier at the given position can be renamed
60
+ * @param sql SQL string
61
+ * @param position Position in the SQL text
62
+ * @returns Renameability result
63
+ */
64
+ checkRenameability(sql, position) {
65
+ // Convert line/column to character position
66
+ const charPosition = this.positionToCharIndex(sql, position);
67
+ // TODO: Implement proper identifier detection and scope analysis
68
+ // For now, minimal implementation to make tests pass
69
+ // Simple detection - if we're in a string literal, not renameable
70
+ if (this.isInsideStringLiteral(sql, charPosition)) {
71
+ return {
72
+ canRename: false,
73
+ reason: 'Cannot rename identifiers inside string literal'
74
+ };
75
+ }
76
+ // Detect if we're on an identifier (simplified)
77
+ const identifier = this.getIdentifierAtPosition(sql, charPosition);
78
+ if (!identifier) {
79
+ return {
80
+ canRename: false,
81
+ reason: 'No identifier found at position'
82
+ };
83
+ }
84
+ // Determine type and scope (simplified logic)
85
+ const type = this.determineIdentifierType(sql, charPosition, identifier);
86
+ const scopeRange = this.calculateScopeRange(sql, charPosition, type);
87
+ return {
88
+ canRename: true,
89
+ currentName: identifier,
90
+ type: type,
91
+ scopeRange: scopeRange
92
+ };
93
+ }
94
+ /**
95
+ * Renames identifier at the specified position
96
+ * @param sql SQL string
97
+ * @param position Position in the SQL text
98
+ * @param newName New identifier name
99
+ * @returns Modified SQL string
100
+ */
101
+ renameAtPosition(sql, position, newName) {
102
+ const renameability = this.checkRenameability(sql, position);
103
+ if (!renameability.canRename || !renameability.currentName) {
104
+ throw new Error(renameability.reason || 'Cannot rename at this position');
105
+ }
106
+ return this.renameIdentifierInScope(sql, renameability.currentName, newName, renameability.scopeRange);
107
+ }
108
+ /**
109
+ * Convert line/column position to character index
110
+ */
111
+ positionToCharIndex(sql, position) {
112
+ const lines = sql.split('\n');
113
+ let charIndex = 0;
114
+ for (let i = 0; i < position.line - 1 && i < lines.length; i++) {
115
+ charIndex += lines[i].length + 1; // +1 for newline
116
+ }
117
+ charIndex += position.column - 1;
118
+ return Math.min(charIndex, sql.length - 1);
119
+ }
120
+ /**
121
+ * Check if position is inside a string literal
122
+ */
123
+ isInsideStringLiteral(sql, charPosition) {
124
+ // Simple check - count single quotes before position
125
+ let inString = false;
126
+ for (let i = 0; i < charPosition && i < sql.length; i++) {
127
+ if (sql[i] === "'") {
128
+ inString = !inString;
129
+ }
130
+ }
131
+ return inString;
132
+ }
133
+ /**
134
+ * Get identifier at the specified character position
135
+ */
136
+ getIdentifierAtPosition(sql, charPosition) {
137
+ if (charPosition >= sql.length)
138
+ return null;
139
+ // Find start of identifier
140
+ let start = charPosition;
141
+ while (start > 0 && this.isIdentifierChar(sql.charCodeAt(start - 1))) {
142
+ start--;
143
+ }
144
+ // Find end of identifier
145
+ let end = charPosition;
146
+ while (end < sql.length && this.isIdentifierChar(sql.charCodeAt(end))) {
147
+ end++;
148
+ }
149
+ if (start === end)
150
+ return null;
151
+ return sql.slice(start, end);
152
+ }
153
+ /**
154
+ * Determine the type of identifier (improved logic)
155
+ */
156
+ determineIdentifierType(sql, charPosition, identifier) {
157
+ const beforePosition = sql.slice(0, charPosition);
158
+ const afterPosition = sql.slice(charPosition);
159
+ // Check if this is a CTE name (appears between WITH and AS)
160
+ const beforeUpper = beforePosition.toUpperCase();
161
+ const afterUpper = afterPosition.toUpperCase();
162
+ // Find last WITH before our position
163
+ const lastWithIndex = beforeUpper.lastIndexOf('WITH');
164
+ if (lastWithIndex !== -1) {
165
+ // Get the identifier bounds
166
+ let start = charPosition;
167
+ while (start > 0 && this.isIdentifierChar(sql.charCodeAt(start - 1))) {
168
+ start--;
169
+ }
170
+ let end = charPosition;
171
+ while (end < sql.length && this.isIdentifierChar(sql.charCodeAt(end))) {
172
+ end++;
173
+ }
174
+ // Check what comes after the complete identifier
175
+ const afterIdentifier = sql.slice(end).toUpperCase();
176
+ // CTE pattern: WITH identifier AS (
177
+ if (afterIdentifier.trim().startsWith('AS (')) {
178
+ return 'cte';
179
+ }
180
+ }
181
+ // Check if this appears after FROM or JOIN (table alias)
182
+ const beforeLines = beforePosition.split('\n');
183
+ const currentLine = beforeLines[beforeLines.length - 1].toUpperCase();
184
+ if (currentLine.includes('FROM ') || currentLine.includes('JOIN ')) {
185
+ return 'table_alias';
186
+ }
187
+ // Check context around the identifier for table alias patterns
188
+ const contextBefore = beforePosition.slice(Math.max(0, charPosition - 50));
189
+ const contextAfter = afterPosition.slice(0, 50);
190
+ const fullContext = (contextBefore + identifier + contextAfter).toUpperCase();
191
+ // Table alias patterns: "FROM table AS alias" or "JOIN table alias"
192
+ if (fullContext.includes(' AS ' + identifier.toUpperCase()) ||
193
+ fullContext.includes(' ' + identifier.toUpperCase() + ' ON') ||
194
+ fullContext.includes(' ' + identifier.toUpperCase() + '\n')) {
195
+ return 'table_alias';
196
+ }
197
+ // Default to table alias if uncertain
198
+ return 'table_alias';
199
+ }
200
+ /**
201
+ * Calculate scope range for the identifier
202
+ */
203
+ calculateScopeRange(sql, charPosition, type) {
204
+ if (type === 'cte') {
205
+ // CTE has global scope
206
+ return { start: 0, end: sql.length };
207
+ }
208
+ // Table alias - find the containing SELECT statement (simplified)
209
+ // This is a very basic implementation
210
+ const beforePosition = sql.slice(0, charPosition);
211
+ const afterPosition = sql.slice(charPosition);
212
+ // Find the start of current SELECT
213
+ const lastSelect = beforePosition.toUpperCase().lastIndexOf('SELECT');
214
+ const start = lastSelect !== -1 ? lastSelect : 0;
215
+ // Find the end (next major clause or end of SQL)
216
+ const nextMajorClause = afterPosition.search(/\b(SELECT|WITH|UNION)\b/i);
217
+ const end = nextMajorClause !== -1 ? charPosition + nextMajorClause : sql.length;
218
+ return { start, end };
219
+ }
220
+ /**
221
+ * Safely replaces SQL identifiers while preserving word boundaries and context
222
+ * Uses character-by-character parsing instead of regex for better maintainability
223
+ * @param sql SQL string to modify
224
+ * @param oldIdentifier Original identifier to replace
225
+ * @param newIdentifier New identifier to replace with
226
+ * @returns Modified SQL string
227
+ */
228
+ replaceIdentifierSafely(sql, oldIdentifier, newIdentifier) {
229
+ if (oldIdentifier === newIdentifier || oldIdentifier.length === 0) {
230
+ return sql;
231
+ }
232
+ const result = [];
233
+ let position = 0;
234
+ const sqlLength = sql.length;
235
+ const oldIdLength = oldIdentifier.length;
236
+ while (position < sqlLength) {
237
+ const char = sql[position];
238
+ const charCode = char.charCodeAt(0);
239
+ // Handle quoted identifiers - check for identifier matches within quotes
240
+ if (charCode === 34 || charCode === 96 || charCode === 91) { // " ` [
241
+ const { content, nextPosition } = this.extractAndReplaceQuotedIdentifier(sql, position, char, oldIdentifier, newIdentifier);
242
+ result.push(content);
243
+ position = nextPosition;
244
+ continue;
245
+ }
246
+ // Skip string literals (only single quotes are actual string literals)
247
+ if (charCode === 39) { // '
248
+ const { content, nextPosition } = this.extractQuotedString(sql, position, char);
249
+ result.push(content);
250
+ position = nextPosition;
251
+ continue;
252
+ }
253
+ // Skip line comments --
254
+ if (charCode === 45 && position + 1 < sqlLength && sql.charCodeAt(position + 1) === 45) {
255
+ const { content, nextPosition } = this.extractLineComment(sql, position);
256
+ result.push(content);
257
+ position = nextPosition;
258
+ continue;
259
+ }
260
+ // Skip block comments
261
+ if (charCode === 47 && position + 1 < sqlLength && sql.charCodeAt(position + 1) === 42) {
262
+ const { content, nextPosition } = this.extractBlockComment(sql, position);
263
+ result.push(content);
264
+ position = nextPosition;
265
+ continue;
266
+ }
267
+ // Check for potential identifier match
268
+ if (this.isIdentifierStartChar(charCode) && this.matchesIdentifierAt(sql, position, oldIdentifier)) {
269
+ const beforePosition = position - 1;
270
+ const afterPosition = position + oldIdLength;
271
+ // Validate word boundaries
272
+ const beforeChar = beforePosition >= 0 ? sql[beforePosition] : null;
273
+ const afterChar = afterPosition < sqlLength ? sql[afterPosition] : null;
274
+ if (this.hasValidWordBoundaries(beforeChar, afterChar)) {
275
+ result.push(newIdentifier);
276
+ position += oldIdLength;
277
+ continue;
278
+ }
279
+ }
280
+ // Default: add current character
281
+ result.push(char);
282
+ position++;
283
+ }
284
+ return result.join('');
285
+ }
286
+ /**
287
+ * Validates that the rename operation was successful
288
+ * @param originalSql Original SQL string
289
+ * @param modifiedSql Modified SQL string after rename
290
+ * @param oldIdentifier Old identifier that was replaced
291
+ * @param newIdentifier New identifier that was added
292
+ * @returns True if rename appears successful
293
+ */
294
+ validateRename(originalSql, modifiedSql, oldIdentifier, newIdentifier) {
295
+ // Basic validation: modified SQL should be different from original
296
+ if (originalSql === modifiedSql) {
297
+ return false;
298
+ }
299
+ // The new identifier should appear in the result
300
+ if (!modifiedSql.includes(newIdentifier)) {
301
+ return false;
302
+ }
303
+ // The modified SQL should have fewer occurrences of the old identifier than the original
304
+ const originalOccurrences = this.countWordOccurrences(originalSql, oldIdentifier);
305
+ const modifiedOccurrences = this.countWordOccurrences(modifiedSql, oldIdentifier);
306
+ return modifiedOccurrences < originalOccurrences;
307
+ }
308
+ /**
309
+ * Extract and potentially replace quoted identifiers
310
+ */
311
+ extractAndReplaceQuotedIdentifier(sql, startPosition, quoteChar, oldIdentifier, newIdentifier) {
312
+ if (quoteChar === '[') {
313
+ return this.extractAndReplaceBracketedIdentifier(sql, startPosition, oldIdentifier, newIdentifier);
314
+ }
315
+ const result = [quoteChar];
316
+ let position = startPosition + 1;
317
+ const identifierStart = position;
318
+ while (position < sql.length) {
319
+ const char = sql[position];
320
+ if (char === quoteChar) {
321
+ // Check for escaped quotes (double quotes)
322
+ if (position + 1 < sql.length && sql[position + 1] === quoteChar) {
323
+ result.push(char);
324
+ result.push(sql[position + 1]);
325
+ position += 2;
326
+ continue;
327
+ }
328
+ // Extract the content within quotes and check for identifier match
329
+ const quotedContent = sql.slice(identifierStart, position);
330
+ if (quotedContent.toLowerCase() === oldIdentifier.toLowerCase()) {
331
+ result.push(newIdentifier);
332
+ }
333
+ else {
334
+ result.push(quotedContent);
335
+ }
336
+ result.push(char); // closing quote
337
+ break;
338
+ }
339
+ position++;
340
+ }
341
+ return { content: result.join(''), nextPosition: position + 1 };
342
+ }
343
+ /**
344
+ * Extract and potentially replace bracketed identifiers [identifier]
345
+ */
346
+ extractAndReplaceBracketedIdentifier(sql, startPosition, oldIdentifier, newIdentifier) {
347
+ const result = ['['];
348
+ let position = startPosition + 1;
349
+ const identifierStart = position;
350
+ while (position < sql.length) {
351
+ const char = sql[position];
352
+ if (char === ']') {
353
+ // Extract the content within brackets and check for identifier match
354
+ const bracketedContent = sql.slice(identifierStart, position);
355
+ if (bracketedContent.toLowerCase() === oldIdentifier.toLowerCase()) {
356
+ result.push(newIdentifier);
357
+ }
358
+ else {
359
+ result.push(bracketedContent);
360
+ }
361
+ result.push(char); // closing bracket
362
+ break;
363
+ }
364
+ position++;
365
+ }
366
+ return { content: result.join(''), nextPosition: position + 1 };
367
+ }
368
+ /**
369
+ * Extract quoted string (handles quotes)
370
+ */
371
+ extractQuotedString(sql, startPosition, quoteChar) {
372
+ const result = [quoteChar];
373
+ let position = startPosition + 1;
374
+ while (position < sql.length) {
375
+ const char = sql[position];
376
+ result.push(char);
377
+ if (char === quoteChar) {
378
+ // Check for escaped quotes (double quotes)
379
+ if (position + 1 < sql.length && sql[position + 1] === quoteChar) {
380
+ result.push(sql[position + 1]);
381
+ position += 2;
382
+ continue;
383
+ }
384
+ break;
385
+ }
386
+ position++;
387
+ }
388
+ return { content: result.join(''), nextPosition: position + 1 };
389
+ }
390
+ /**
391
+ * Extract line comment
392
+ */
393
+ extractLineComment(sql, startPosition) {
394
+ const result = [];
395
+ let position = startPosition;
396
+ while (position < sql.length && sql.charCodeAt(position) !== 10 && sql.charCodeAt(position) !== 13) {
397
+ result.push(sql[position]);
398
+ position++;
399
+ }
400
+ // Include the newline if present
401
+ if (position < sql.length && (sql.charCodeAt(position) === 10 || sql.charCodeAt(position) === 13)) {
402
+ result.push(sql[position]);
403
+ position++;
404
+ }
405
+ return { content: result.join(''), nextPosition: position };
406
+ }
407
+ /**
408
+ * Extract block comment
409
+ */
410
+ extractBlockComment(sql, startPosition) {
411
+ const result = ['/', '*'];
412
+ let position = startPosition + 2;
413
+ while (position < sql.length - 1) {
414
+ const char = sql[position];
415
+ result.push(char);
416
+ if (char === '*' && sql[position + 1] === '/') {
417
+ result.push('/');
418
+ position += 2;
419
+ break;
420
+ }
421
+ position++;
422
+ }
423
+ return { content: result.join(''), nextPosition: position };
424
+ }
425
+ /**
426
+ * Check if character code can start an identifier
427
+ */
428
+ isIdentifierStartChar(charCode) {
429
+ return (charCode >= 65 && charCode <= 90) || // A-Z
430
+ (charCode >= 97 && charCode <= 122) || // a-z
431
+ (charCode === 95); // _
432
+ }
433
+ /**
434
+ * Check if character code can be part of an identifier
435
+ */
436
+ isIdentifierChar(charCode) {
437
+ return (charCode >= 65 && charCode <= 90) || // A-Z
438
+ (charCode >= 97 && charCode <= 122) || // a-z
439
+ (charCode >= 48 && charCode <= 57) || // 0-9
440
+ (charCode === 95); // _
441
+ }
442
+ /**
443
+ * Check if the identifier matches at the given position (case-insensitive)
444
+ */
445
+ matchesIdentifierAt(sql, position, identifier) {
446
+ if (position + identifier.length > sql.length) {
447
+ return false;
448
+ }
449
+ // Case-insensitive comparison
450
+ for (let i = 0; i < identifier.length; i++) {
451
+ const sqlChar = sql.charCodeAt(position + i);
452
+ const idChar = identifier.charCodeAt(i);
453
+ // Convert both to lowercase for comparison
454
+ const sqlLower = sqlChar >= 65 && sqlChar <= 90 ? sqlChar + 32 : sqlChar;
455
+ const idLower = idChar >= 65 && idChar <= 90 ? idChar + 32 : idChar;
456
+ if (sqlLower !== idLower) {
457
+ return false;
458
+ }
459
+ }
460
+ return true;
461
+ }
462
+ /**
463
+ * Validate word boundaries
464
+ */
465
+ hasValidWordBoundaries(beforeChar, afterChar) {
466
+ const isValidBefore = beforeChar === null || !this.isIdentifierChar(beforeChar.charCodeAt(0));
467
+ const isValidAfter = afterChar === null || !this.isIdentifierChar(afterChar.charCodeAt(0));
468
+ return isValidBefore && isValidAfter;
469
+ }
470
+ /**
471
+ * Counts word boundary occurrences of an identifier in SQL
472
+ * @param sql SQL string to search
473
+ * @param identifier Identifier to count
474
+ * @returns Number of occurrences
475
+ */
476
+ countWordOccurrences(sql, identifier) {
477
+ let count = 0;
478
+ let position = 0;
479
+ const sqlLength = sql.length;
480
+ const idLength = identifier.length;
481
+ while (position <= sqlLength - idLength) {
482
+ if (this.matchesIdentifierAt(sql, position, identifier)) {
483
+ const beforePosition = position - 1;
484
+ const afterPosition = position + idLength;
485
+ const beforeChar = beforePosition >= 0 ? sql[beforePosition] : null;
486
+ const afterChar = afterPosition < sqlLength ? sql[afterPosition] : null;
487
+ if (this.hasValidWordBoundaries(beforeChar, afterChar)) {
488
+ count++;
489
+ }
490
+ }
491
+ position++;
492
+ }
493
+ return count;
494
+ }
495
+ }
496
+ exports.SqlIdentifierRenamer = SqlIdentifierRenamer;
497
+ //# sourceMappingURL=SqlIdentifierRenamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlIdentifierRenamer.js","sourceRoot":"","sources":["../../../src/transformers/SqlIdentifierRenamer.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,21 @@ export declare class SqlParamInjector {
44
44
  * Type guard for objects that need operator validation
45
45
  */
46
46
  private isValidatableObject;
47
+ /**
48
+ * Parses a qualified column name (table.column) into its components
49
+ * @param qualifiedName The qualified name (e.g., 'users.name' or 'name')
50
+ * @returns Object with table and column parts, or null if invalid
51
+ */
52
+ private parseQualifiedColumnName;
53
+ /**
54
+ * Checks if a column name is qualified (contains a dot)
55
+ */
56
+ private isQualifiedColumnName;
57
+ /**
58
+ * Sanitizes parameter names by replacing dots with underscores
59
+ * This ensures qualified names like 'users.name' become 'users_name' as parameter names
60
+ */
61
+ private sanitizeParameterName;
47
62
  /**
48
63
  * Type guard for column mapping presence
49
64
  */
@@ -56,6 +71,10 @@ export declare class SqlParamInjector {
56
71
  * Processes a single state parameter
57
72
  */
58
73
  private processStateParameter;
74
+ /**
75
+ * Processes unqualified parameters, respecting qualified parameter overrides
76
+ */
77
+ private processUnqualifiedParameter;
59
78
  /**
60
79
  * Processes regular column conditions (non-logical, non-explicit)
61
80
  */
@@ -76,6 +95,14 @@ export declare class SqlParamInjector {
76
95
  * Recursively collects columns from any SelectQuery type
77
96
  */
78
97
  private collectColumnsFromSelectQuery;
98
+ /**
99
+ * Builds a mapping between table aliases and real table names for enhanced qualified name resolution
100
+ */
101
+ private buildTableMapping;
102
+ /**
103
+ * Helper method to process a single SourceExpression for table mapping
104
+ */
105
+ private processSourceForMapping;
79
106
  }
80
107
  type BaseCondition = {
81
108
  '='?: number | string | boolean | Date;