@tejasanik/postgres-mcp-server 2.1.0 → 2.2.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.
- package/README.md +186 -10
- package/dist/db-manager/index.d.ts +7 -0
- package/dist/db-manager/index.d.ts.map +1 -0
- package/dist/db-manager/index.js +7 -0
- package/dist/db-manager/index.js.map +1 -0
- package/dist/db-manager/validation.d.ts +35 -0
- package/dist/db-manager/validation.d.ts.map +1 -0
- package/dist/db-manager/validation.js +54 -0
- package/dist/db-manager/validation.js.map +1 -0
- package/dist/db-manager.d.ts +175 -5
- package/dist/db-manager.d.ts.map +1 -1
- package/dist/db-manager.js +589 -26
- package/dist/db-manager.js.map +1 -1
- package/dist/index.js +141 -11
- package/dist/index.js.map +1 -1
- package/dist/tools/analysis-tools.d.ts.map +1 -1
- package/dist/tools/analysis-tools.js +53 -49
- package/dist/tools/analysis-tools.js.map +1 -1
- package/dist/tools/schema-tools.d.ts +40 -1
- package/dist/tools/schema-tools.d.ts.map +1 -1
- package/dist/tools/schema-tools.js +174 -92
- package/dist/tools/schema-tools.js.map +1 -1
- package/dist/tools/server-tools.d.ts +1 -0
- package/dist/tools/server-tools.d.ts.map +1 -1
- package/dist/tools/server-tools.js +10 -6
- package/dist/tools/server-tools.js.map +1 -1
- package/dist/tools/sql/utils/connection-utils.d.ts +79 -0
- package/dist/tools/sql/utils/connection-utils.d.ts.map +1 -0
- package/dist/tools/sql/utils/connection-utils.js +129 -0
- package/dist/tools/sql/utils/connection-utils.js.map +1 -0
- package/dist/tools/sql/utils/constants.d.ts +55 -0
- package/dist/tools/sql/utils/constants.d.ts.map +1 -0
- package/dist/tools/sql/utils/constants.js +55 -0
- package/dist/tools/sql/utils/constants.js.map +1 -0
- package/dist/tools/sql/utils/dry-run-utils.d.ts +31 -0
- package/dist/tools/sql/utils/dry-run-utils.d.ts.map +1 -0
- package/dist/tools/sql/utils/dry-run-utils.js +173 -0
- package/dist/tools/sql/utils/dry-run-utils.js.map +1 -0
- package/dist/tools/sql/utils/file-handler.d.ts +57 -0
- package/dist/tools/sql/utils/file-handler.d.ts.map +1 -0
- package/dist/tools/sql/utils/file-handler.js +150 -0
- package/dist/tools/sql/utils/file-handler.js.map +1 -0
- package/dist/tools/sql/utils/index.d.ts +12 -0
- package/dist/tools/sql/utils/index.d.ts.map +1 -0
- package/dist/tools/sql/utils/index.js +12 -0
- package/dist/tools/sql/utils/index.js.map +1 -0
- package/dist/tools/sql/utils/result-formatter.d.ts +94 -0
- package/dist/tools/sql/utils/result-formatter.d.ts.map +1 -0
- package/dist/tools/sql/utils/result-formatter.js +154 -0
- package/dist/tools/sql/utils/result-formatter.js.map +1 -0
- package/dist/tools/sql/utils/sql-parser.d.ts +125 -0
- package/dist/tools/sql/utils/sql-parser.d.ts.map +1 -0
- package/dist/tools/sql/utils/sql-parser.js +468 -0
- package/dist/tools/sql/utils/sql-parser.js.map +1 -0
- package/dist/tools/sql-tools.d.ts +21 -0
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +383 -532
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/retry.d.ts +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/validation.d.ts +45 -9
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +335 -72
- package/dist/utils/validation.js.map +1 -1
- package/package.json +9 -2
- package/dist/__tests__/analysis-tools.test.d.ts +0 -2
- package/dist/__tests__/analysis-tools.test.d.ts.map +0 -1
- package/dist/__tests__/analysis-tools.test.js +0 -294
- package/dist/__tests__/analysis-tools.test.js.map +0 -1
- package/dist/__tests__/db-manager.test.d.ts +0 -2
- package/dist/__tests__/db-manager.test.d.ts.map +0 -1
- package/dist/__tests__/db-manager.test.js +0 -410
- package/dist/__tests__/db-manager.test.js.map +0 -1
- package/dist/__tests__/mcp-server.test.d.ts +0 -13
- package/dist/__tests__/mcp-server.test.d.ts.map +0 -1
- package/dist/__tests__/mcp-server.test.js +0 -146
- package/dist/__tests__/mcp-server.test.js.map +0 -1
- package/dist/__tests__/schema-tools.test.d.ts +0 -2
- package/dist/__tests__/schema-tools.test.d.ts.map +0 -1
- package/dist/__tests__/schema-tools.test.js +0 -171
- package/dist/__tests__/schema-tools.test.js.map +0 -1
- package/dist/__tests__/server-tools.test.d.ts +0 -2
- package/dist/__tests__/server-tools.test.d.ts.map +0 -1
- package/dist/__tests__/server-tools.test.js +0 -113
- package/dist/__tests__/server-tools.test.js.map +0 -1
- package/dist/__tests__/sql-tools.test.d.ts +0 -2
- package/dist/__tests__/sql-tools.test.d.ts.map +0 -1
- package/dist/__tests__/sql-tools.test.js +0 -1912
- package/dist/__tests__/sql-tools.test.js.map +0 -1
- package/dist/__tests__/validation.test.d.ts +0 -2
- package/dist/__tests__/validation.test.d.ts.map +0 -1
- package/dist/__tests__/validation.test.js +0 -203
- package/dist/__tests__/validation.test.js.map +0 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Parser Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for parsing, analyzing, and splitting SQL statements.
|
|
5
|
+
* Handles PostgreSQL-specific syntax including:
|
|
6
|
+
* - Dollar-quoted strings ($$ or $tag$)
|
|
7
|
+
* - Nested block comments
|
|
8
|
+
* - Single and double-quoted strings with escape handling
|
|
9
|
+
*/
|
|
10
|
+
/** Common SQL statement types for detection */
|
|
11
|
+
const STATEMENT_TYPES = [
|
|
12
|
+
'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'CREATE', 'ALTER', 'DROP',
|
|
13
|
+
'TRUNCATE', 'GRANT', 'REVOKE', 'BEGIN', 'COMMIT', 'ROLLBACK',
|
|
14
|
+
'SET', 'SHOW', 'EXPLAIN', 'ANALYZE', 'VACUUM', 'REINDEX',
|
|
15
|
+
'COMMENT', 'WITH', 'DO', 'CALL', 'EXECUTE', 'MERGE', 'COPY',
|
|
16
|
+
];
|
|
17
|
+
/** SQL keywords to skip when extracting table names */
|
|
18
|
+
const SQL_KEYWORDS_TO_SKIP = new Set([
|
|
19
|
+
'SELECT', 'WHERE', 'SET', 'VALUES', 'AND', 'OR', 'NOT', 'NULL',
|
|
20
|
+
'TRUE', 'FALSE', 'AS', 'ON', 'USING', 'NATURAL', 'CROSS',
|
|
21
|
+
'INNER', 'LEFT', 'RIGHT', 'FULL', 'OUTER', 'LATERAL',
|
|
22
|
+
]);
|
|
23
|
+
/**
|
|
24
|
+
* Strips a leading line comment from SQL and returns the remaining string.
|
|
25
|
+
* Returns null if no line comment is present.
|
|
26
|
+
*/
|
|
27
|
+
function stripLineComment(sql) {
|
|
28
|
+
if (!sql.startsWith('--')) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const newlineIndex = sql.indexOf('\n');
|
|
32
|
+
if (newlineIndex === -1) {
|
|
33
|
+
return ''; // Entire string is a line comment
|
|
34
|
+
}
|
|
35
|
+
return sql.substring(newlineIndex + 1).trim();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Finds the end position of a nested block comment starting at position 2.
|
|
39
|
+
* Returns the position after the closing comment, or -1 if unclosed.
|
|
40
|
+
*/
|
|
41
|
+
function findBlockCommentEnd(sql) {
|
|
42
|
+
let depth = 1;
|
|
43
|
+
let i = 2;
|
|
44
|
+
while (i < sql.length && depth > 0) {
|
|
45
|
+
if (sql[i] === '/' && sql[i + 1] === '*') {
|
|
46
|
+
depth++;
|
|
47
|
+
i += 2;
|
|
48
|
+
}
|
|
49
|
+
else if (sql[i] === '*' && sql[i + 1] === '/') {
|
|
50
|
+
depth--;
|
|
51
|
+
i += 2;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
i++;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return depth > 0 ? -1 : i;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Checks if character at position matches any statement type prefix.
|
|
61
|
+
*/
|
|
62
|
+
function matchesStatementType(trimmed, type) {
|
|
63
|
+
return (trimmed.startsWith(type + ' ') ||
|
|
64
|
+
trimmed.startsWith(type + '\n') ||
|
|
65
|
+
trimmed.startsWith(type + '\t') ||
|
|
66
|
+
trimmed === type);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Strips leading line comments and block comments from SQL.
|
|
70
|
+
* Properly handles nested block comments (PostgreSQL supports nesting).
|
|
71
|
+
* Returns empty string if the entire content is just comments.
|
|
72
|
+
*
|
|
73
|
+
* IMPORTANT: This function only strips LEADING comments. Line numbers
|
|
74
|
+
* in the remaining SQL are NOT affected - they still correspond to
|
|
75
|
+
* the original file positions.
|
|
76
|
+
*
|
|
77
|
+
* @param sql - The SQL string to process
|
|
78
|
+
* @returns The SQL with leading comments stripped
|
|
79
|
+
*/
|
|
80
|
+
export function stripLeadingComments(sql) {
|
|
81
|
+
let result = sql.trim();
|
|
82
|
+
while (result.length > 0) {
|
|
83
|
+
// Try stripping leading line comment
|
|
84
|
+
const afterLineComment = stripLineComment(result);
|
|
85
|
+
if (afterLineComment !== null) {
|
|
86
|
+
if (afterLineComment === '')
|
|
87
|
+
return '';
|
|
88
|
+
result = afterLineComment;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Try stripping leading block comment
|
|
92
|
+
if (result.startsWith('/*')) {
|
|
93
|
+
const endPos = findBlockCommentEnd(result);
|
|
94
|
+
if (endPos === -1) {
|
|
95
|
+
return ''; // Unclosed nested block comment
|
|
96
|
+
}
|
|
97
|
+
result = result.substring(endPos).trim();
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
// No more leading comments
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Detect the type of SQL statement (SELECT, INSERT, UPDATE, DELETE, CREATE, etc.)
|
|
107
|
+
*
|
|
108
|
+
* @param sql - The SQL statement to analyze
|
|
109
|
+
* @returns The detected statement type
|
|
110
|
+
*/
|
|
111
|
+
export function detectStatementType(sql) {
|
|
112
|
+
const trimmed = stripLeadingComments(sql).toUpperCase();
|
|
113
|
+
for (const type of STATEMENT_TYPES) {
|
|
114
|
+
if (matchesStatementType(trimmed, type)) {
|
|
115
|
+
// Special case for WITH - check if it's a CTE followed by SELECT/INSERT/UPDATE/DELETE
|
|
116
|
+
if (type === 'WITH') {
|
|
117
|
+
return detectWithCteType(trimmed);
|
|
118
|
+
}
|
|
119
|
+
return type;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return 'UNKNOWN';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Detects the type of WITH CTE statement.
|
|
126
|
+
*/
|
|
127
|
+
function detectWithCteType(trimmed) {
|
|
128
|
+
if (trimmed.includes('SELECT'))
|
|
129
|
+
return 'WITH SELECT';
|
|
130
|
+
if (trimmed.includes('INSERT'))
|
|
131
|
+
return 'WITH INSERT';
|
|
132
|
+
if (trimmed.includes('UPDATE'))
|
|
133
|
+
return 'WITH UPDATE';
|
|
134
|
+
if (trimmed.includes('DELETE'))
|
|
135
|
+
return 'WITH DELETE';
|
|
136
|
+
return 'WITH';
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Split SQL content into individual statements with line number tracking.
|
|
140
|
+
* Handles PostgreSQL-specific syntax including:
|
|
141
|
+
* - Single and double-quoted strings with escape handling
|
|
142
|
+
* - Dollar-quoted strings ($$ or $tag$)
|
|
143
|
+
* - Line comments (--)
|
|
144
|
+
* - Nested block comments (PostgreSQL supports nested comments)
|
|
145
|
+
*
|
|
146
|
+
* Line numbers in the returned statements correspond to actual file positions.
|
|
147
|
+
* Comments are NOT excluded from line counting - all newlines are counted.
|
|
148
|
+
*
|
|
149
|
+
* @param sql - The SQL content to split
|
|
150
|
+
* @returns Array of parsed statements with accurate line numbers
|
|
151
|
+
*/
|
|
152
|
+
export function splitSqlStatementsWithLineNumbers(sql) {
|
|
153
|
+
const result = splitSqlStatementsWithWarnings(sql);
|
|
154
|
+
return result.statements;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Split SQL content into individual statements with line number tracking
|
|
158
|
+
* and collect any warnings about parsing issues.
|
|
159
|
+
*
|
|
160
|
+
* @param sql - The SQL content to split
|
|
161
|
+
* @returns Object with statements and any parsing warnings
|
|
162
|
+
*/
|
|
163
|
+
export function splitSqlStatementsWithWarnings(sql) {
|
|
164
|
+
const statements = [];
|
|
165
|
+
const warnings = [];
|
|
166
|
+
let current = '';
|
|
167
|
+
let currentLineNumber = 1;
|
|
168
|
+
let statementStartLine = 1;
|
|
169
|
+
let hasStatementContent = false; // Track if we've seen actual SQL content (not just comments)
|
|
170
|
+
let inString = false;
|
|
171
|
+
let stringChar = '';
|
|
172
|
+
let stringStartLine = 0;
|
|
173
|
+
let stringStartPos = 0;
|
|
174
|
+
let inLineComment = false;
|
|
175
|
+
let blockCommentDepth = 0;
|
|
176
|
+
let blockCommentStartLine = 0;
|
|
177
|
+
let blockCommentStartPos = 0;
|
|
178
|
+
let i = 0;
|
|
179
|
+
while (i < sql.length) {
|
|
180
|
+
const char = sql[i];
|
|
181
|
+
const nextChar = sql[i + 1] || '';
|
|
182
|
+
// Track line numbers (ALL newlines count, including in comments)
|
|
183
|
+
if (char === '\n') {
|
|
184
|
+
currentLineNumber++;
|
|
185
|
+
}
|
|
186
|
+
// Check if we're starting actual SQL content (not in comment, not whitespace)
|
|
187
|
+
// This determines the accurate line number for the statement
|
|
188
|
+
const inComment = inLineComment || blockCommentDepth > 0;
|
|
189
|
+
if (!hasStatementContent && !inComment && char.trim() !== '') {
|
|
190
|
+
// Check if this is starting a new comment - if so, don't set statement start yet
|
|
191
|
+
const isStartingLineComment = char === '-' && nextChar === '-';
|
|
192
|
+
const isStartingBlockComment = char === '/' && nextChar === '*';
|
|
193
|
+
if (!isStartingLineComment && !isStartingBlockComment) {
|
|
194
|
+
hasStatementContent = true;
|
|
195
|
+
statementStartLine = currentLineNumber;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Handle line comments
|
|
199
|
+
if (!inString && blockCommentDepth === 0 && char === '-' && nextChar === '-') {
|
|
200
|
+
inLineComment = true;
|
|
201
|
+
current += char;
|
|
202
|
+
i++;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (inLineComment && (char === '\n' || char === '\r')) {
|
|
206
|
+
inLineComment = false;
|
|
207
|
+
current += char;
|
|
208
|
+
i++;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
// Handle nested block comments
|
|
212
|
+
if (!inString && !inLineComment && char === '/' && nextChar === '*') {
|
|
213
|
+
if (blockCommentDepth === 0) {
|
|
214
|
+
blockCommentStartLine = currentLineNumber;
|
|
215
|
+
blockCommentStartPos = i;
|
|
216
|
+
}
|
|
217
|
+
blockCommentDepth++;
|
|
218
|
+
current += char + nextChar;
|
|
219
|
+
i += 2;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (blockCommentDepth > 0 && char === '*' && nextChar === '/') {
|
|
223
|
+
blockCommentDepth--;
|
|
224
|
+
current += char + nextChar;
|
|
225
|
+
i += 2;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Handle string literals
|
|
229
|
+
if (!inLineComment && blockCommentDepth === 0 && (char === "'" || char === '"')) {
|
|
230
|
+
if (!inString) {
|
|
231
|
+
inString = true;
|
|
232
|
+
stringChar = char;
|
|
233
|
+
stringStartLine = currentLineNumber;
|
|
234
|
+
stringStartPos = i;
|
|
235
|
+
}
|
|
236
|
+
else if (char === stringChar) {
|
|
237
|
+
if (nextChar === stringChar) {
|
|
238
|
+
current += char + nextChar;
|
|
239
|
+
i += 2;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
inString = false;
|
|
243
|
+
stringChar = '';
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Handle dollar-quoted strings (PostgreSQL specific)
|
|
247
|
+
if (!inString && !inLineComment && blockCommentDepth === 0 && char === '$') {
|
|
248
|
+
const dollarMatch = /^(\$\w*\$)/.exec(sql.slice(i));
|
|
249
|
+
if (dollarMatch) {
|
|
250
|
+
const dollarTag = dollarMatch[1];
|
|
251
|
+
const searchStart = i + dollarTag.length;
|
|
252
|
+
const endIndex = sql.indexOf(dollarTag, searchStart);
|
|
253
|
+
if (endIndex !== -1) {
|
|
254
|
+
const dollarContent = sql.slice(i, endIndex + dollarTag.length);
|
|
255
|
+
// Count newlines in dollar-quoted content for accurate line tracking
|
|
256
|
+
const newlines = (dollarContent.match(/\n/g) || []).length;
|
|
257
|
+
currentLineNumber += newlines;
|
|
258
|
+
current += dollarContent;
|
|
259
|
+
i = endIndex + dollarTag.length;
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Unclosed dollar-quote - add warning and consume to end
|
|
264
|
+
warnings.push({
|
|
265
|
+
type: 'unclosed_dollar_quote',
|
|
266
|
+
message: `Unclosed dollar-quote ${dollarTag} starting at line ${currentLineNumber}`,
|
|
267
|
+
lineNumber: currentLineNumber,
|
|
268
|
+
position: i,
|
|
269
|
+
tag: dollarTag,
|
|
270
|
+
});
|
|
271
|
+
// Consume everything to the end as part of this statement
|
|
272
|
+
const remainder = sql.slice(i);
|
|
273
|
+
const newlines = (remainder.match(/\n/g) || []).length;
|
|
274
|
+
currentLineNumber += newlines;
|
|
275
|
+
current += remainder;
|
|
276
|
+
i = sql.length;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Handle statement separator
|
|
282
|
+
if (!inString && !inLineComment && blockCommentDepth === 0 && char === ';') {
|
|
283
|
+
current += char;
|
|
284
|
+
const trimmed = current.trim();
|
|
285
|
+
if (trimmed) {
|
|
286
|
+
statements.push({ sql: trimmed, lineNumber: statementStartLine });
|
|
287
|
+
}
|
|
288
|
+
current = '';
|
|
289
|
+
hasStatementContent = false; // Reset for next statement
|
|
290
|
+
i++;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
current += char;
|
|
294
|
+
i++;
|
|
295
|
+
}
|
|
296
|
+
// Check for unclosed constructs at end of input
|
|
297
|
+
if (blockCommentDepth > 0) {
|
|
298
|
+
warnings.push({
|
|
299
|
+
type: 'unclosed_block_comment',
|
|
300
|
+
message: `Unclosed block comment starting at line ${blockCommentStartLine}`,
|
|
301
|
+
lineNumber: blockCommentStartLine,
|
|
302
|
+
position: blockCommentStartPos,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (inString) {
|
|
306
|
+
warnings.push({
|
|
307
|
+
type: 'unclosed_string',
|
|
308
|
+
message: `Unclosed string literal starting at line ${stringStartLine}`,
|
|
309
|
+
lineNumber: stringStartLine,
|
|
310
|
+
position: stringStartPos,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
// Add remaining content if any
|
|
314
|
+
const trimmed = current.trim();
|
|
315
|
+
if (trimmed) {
|
|
316
|
+
statements.push({ sql: trimmed, lineNumber: statementStartLine });
|
|
317
|
+
}
|
|
318
|
+
return { statements, warnings };
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Extracts table names from a SQL query.
|
|
322
|
+
* Handles common patterns:
|
|
323
|
+
* - FROM, JOIN, INTO, UPDATE, DELETE FROM
|
|
324
|
+
* - MERGE INTO/USING
|
|
325
|
+
* - COPY (table) FROM/TO
|
|
326
|
+
* - LATERAL subquery references
|
|
327
|
+
* - USING clause in JOINs
|
|
328
|
+
*
|
|
329
|
+
* @param sql - The SQL query to analyze
|
|
330
|
+
* @returns Array of unique table references
|
|
331
|
+
*/
|
|
332
|
+
export function extractTablesFromSql(sql) {
|
|
333
|
+
const tables = [];
|
|
334
|
+
const seen = new Set();
|
|
335
|
+
// Normalize SQL: remove comments and extra whitespace
|
|
336
|
+
const normalized = sql
|
|
337
|
+
.replace(/--[^\n]*/g, '') // Remove line comments
|
|
338
|
+
.replace(/\/\*[\s\S]*?\*\//g, '') // Remove block comments
|
|
339
|
+
.replace(/\s+/g, ' ') // Normalize whitespace
|
|
340
|
+
.trim();
|
|
341
|
+
// Pattern for SQL identifier: optional quotes, word chars, optional schema.table
|
|
342
|
+
const identPattern = '(["`]?\\w+["`]?(?:\\.\\s*["`]?\\w+["`]?)?)';
|
|
343
|
+
// Patterns to find table references
|
|
344
|
+
const patterns = [
|
|
345
|
+
// Standard patterns
|
|
346
|
+
new RegExp(`\\bFROM\\s+${identPattern}`, 'gi'),
|
|
347
|
+
new RegExp(`\\bJOIN\\s+${identPattern}`, 'gi'),
|
|
348
|
+
new RegExp(`\\bINTO\\s+${identPattern}`, 'gi'),
|
|
349
|
+
new RegExp(`\\bUPDATE\\s+${identPattern}`, 'gi'),
|
|
350
|
+
new RegExp(`\\bDELETE\\s+FROM\\s+${identPattern}`, 'gi'),
|
|
351
|
+
// MERGE statement patterns
|
|
352
|
+
new RegExp(`\\bMERGE\\s+INTO\\s+${identPattern}`, 'gi'),
|
|
353
|
+
new RegExp(`\\bUSING\\s+${identPattern}`, 'gi'),
|
|
354
|
+
// COPY statement pattern
|
|
355
|
+
new RegExp(`\\bCOPY\\s+${identPattern}`, 'gi'),
|
|
356
|
+
// TABLE keyword (for COPY TABLE, etc.)
|
|
357
|
+
new RegExp(`\\bTABLE\\s+${identPattern}`, 'gi'),
|
|
358
|
+
];
|
|
359
|
+
for (const pattern of patterns) {
|
|
360
|
+
let match;
|
|
361
|
+
while ((match = pattern.exec(normalized)) !== null) {
|
|
362
|
+
const tableRef = match[1].replace(/["`]/g, '').trim();
|
|
363
|
+
// Skip common SQL keywords that might be matched
|
|
364
|
+
if (SQL_KEYWORDS_TO_SKIP.has(tableRef.toUpperCase())) {
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
// Skip if it looks like a function call (ends with parenthesis nearby)
|
|
368
|
+
const afterMatch = normalized.slice(match.index + match[0].length).trim();
|
|
369
|
+
if (afterMatch.startsWith('(')) {
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
let schema = 'public';
|
|
373
|
+
let table = tableRef;
|
|
374
|
+
if (tableRef.includes('.')) {
|
|
375
|
+
const parts = tableRef.split('.');
|
|
376
|
+
schema = parts[0].trim();
|
|
377
|
+
table = parts[1].trim();
|
|
378
|
+
}
|
|
379
|
+
const key = `${schema}.${table}`.toLowerCase();
|
|
380
|
+
if (!seen.has(key)) {
|
|
381
|
+
seen.add(key);
|
|
382
|
+
tables.push({ schema, table });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return tables;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Filter parsed statements to only executable ones (non-empty, non-comment).
|
|
390
|
+
*
|
|
391
|
+
* @param statements - Array of parsed statements
|
|
392
|
+
* @returns Filtered array of executable statements
|
|
393
|
+
*/
|
|
394
|
+
export function filterExecutableStatements(statements) {
|
|
395
|
+
return statements.filter((stmt) => {
|
|
396
|
+
const trimmed = stmt.sql.trim();
|
|
397
|
+
if (!trimmed)
|
|
398
|
+
return false;
|
|
399
|
+
const withoutComments = stripLeadingComments(trimmed);
|
|
400
|
+
return withoutComments.length > 0;
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Normalize SQL by removing comments and extra whitespace.
|
|
405
|
+
* Properly handles nested block comments.
|
|
406
|
+
*
|
|
407
|
+
* @param sql - The SQL to normalize
|
|
408
|
+
* @returns Normalized SQL string
|
|
409
|
+
*/
|
|
410
|
+
export function normalizeSql(sql) {
|
|
411
|
+
// Remove nested block comments
|
|
412
|
+
let result = sql;
|
|
413
|
+
let prevLength = -1;
|
|
414
|
+
// Keep removing until no more changes (handles nested comments)
|
|
415
|
+
while (result.length !== prevLength) {
|
|
416
|
+
prevLength = result.length;
|
|
417
|
+
// Remove innermost comments first
|
|
418
|
+
result = result.replace(/\/\*[^/*]*\*\//g, '');
|
|
419
|
+
}
|
|
420
|
+
return result
|
|
421
|
+
.replace(/--[^\n]*/g, '') // Remove line comments
|
|
422
|
+
.replace(/\s+/g, ' ') // Normalize whitespace
|
|
423
|
+
.trim();
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Checks if SQL content is empty after preprocessing (removing comments/whitespace).
|
|
427
|
+
*
|
|
428
|
+
* @param sql - The SQL to check
|
|
429
|
+
* @returns true if SQL is effectively empty, false otherwise
|
|
430
|
+
*/
|
|
431
|
+
export function isEmptyAfterPreprocessing(sql) {
|
|
432
|
+
const stripped = stripLeadingComments(sql);
|
|
433
|
+
return stripped.trim().length === 0;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Detects potential schema change statements in SQL.
|
|
437
|
+
* Useful for warning about schema changes during multi-statement execution.
|
|
438
|
+
*
|
|
439
|
+
* @param sql - The SQL statement to check
|
|
440
|
+
* @returns Object with detected schema changes
|
|
441
|
+
*/
|
|
442
|
+
export function detectSchemaChanges(sql) {
|
|
443
|
+
const normalized = normalizeSql(sql).toUpperCase();
|
|
444
|
+
// Check for SET search_path
|
|
445
|
+
const searchPathRegex = /SET\s+(?:LOCAL\s+)?SEARCH_PATH\s*(?:TO|=)\s*(\w+)/;
|
|
446
|
+
const searchPathMatch = searchPathRegex.exec(normalized);
|
|
447
|
+
if (searchPathMatch) {
|
|
448
|
+
return {
|
|
449
|
+
hasSchemaChange: true,
|
|
450
|
+
changeType: 'search_path',
|
|
451
|
+
newSchema: searchPathMatch[1].toLowerCase(),
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
// Check for CREATE SCHEMA
|
|
455
|
+
if (/CREATE\s+SCHEMA\b/.test(normalized)) {
|
|
456
|
+
return { hasSchemaChange: true, changeType: 'schema_create' };
|
|
457
|
+
}
|
|
458
|
+
// Check for DROP SCHEMA
|
|
459
|
+
if (/DROP\s+SCHEMA\b/.test(normalized)) {
|
|
460
|
+
return { hasSchemaChange: true, changeType: 'schema_drop' };
|
|
461
|
+
}
|
|
462
|
+
// Check for ALTER SCHEMA
|
|
463
|
+
if (/ALTER\s+SCHEMA\b/.test(normalized)) {
|
|
464
|
+
return { hasSchemaChange: true, changeType: 'schema_alter' };
|
|
465
|
+
}
|
|
466
|
+
return { hasSchemaChange: false };
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=sql-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-parser.js","sourceRoot":"","sources":["../../../../src/tools/sql/utils/sql-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,9 @@ export declare function executeSql(args: {
|
|
|
8
8
|
includeSchemaHint?: boolean;
|
|
9
9
|
allowMultipleStatements?: boolean;
|
|
10
10
|
transactionId?: string;
|
|
11
|
+
server?: string;
|
|
12
|
+
database?: string;
|
|
13
|
+
schema?: string;
|
|
11
14
|
}): Promise<ExecuteSqlResult | ExecuteSqlMultiResult>;
|
|
12
15
|
export declare function explainQuery(args: {
|
|
13
16
|
sql: string;
|
|
@@ -19,6 +22,9 @@ export declare function explainQuery(args: {
|
|
|
19
22
|
columns: string[];
|
|
20
23
|
indexType?: string;
|
|
21
24
|
}>;
|
|
25
|
+
server?: string;
|
|
26
|
+
database?: string;
|
|
27
|
+
schema?: string;
|
|
22
28
|
}): Promise<QueryPlan>;
|
|
23
29
|
/**
|
|
24
30
|
* Individual statement error when stopOnError is false
|
|
@@ -85,6 +91,9 @@ export declare function executeSqlFile(args: {
|
|
|
85
91
|
stripAsRegex?: boolean;
|
|
86
92
|
/** If true, only parse and validate the file without executing (default: false) */
|
|
87
93
|
validateOnly?: boolean;
|
|
94
|
+
server?: string;
|
|
95
|
+
database?: string;
|
|
96
|
+
schema?: string;
|
|
88
97
|
}): Promise<ExecuteSqlFileResult>;
|
|
89
98
|
/**
|
|
90
99
|
* Preview a SQL file without executing.
|
|
@@ -120,6 +129,9 @@ export declare function dryRunSqlFile(args: {
|
|
|
120
129
|
maxStatements?: number;
|
|
121
130
|
/** Stop on first error (default: false - continues to show all errors) */
|
|
122
131
|
stopOnError?: boolean;
|
|
132
|
+
server?: string;
|
|
133
|
+
database?: string;
|
|
134
|
+
schema?: string;
|
|
123
135
|
}): Promise<SqlFileDryRunResult>;
|
|
124
136
|
/**
|
|
125
137
|
* Preview the effect of a mutation (INSERT/UPDATE/DELETE) without executing it.
|
|
@@ -128,6 +140,9 @@ export declare function dryRunSqlFile(args: {
|
|
|
128
140
|
export declare function mutationPreview(args: {
|
|
129
141
|
sql: string;
|
|
130
142
|
sampleSize?: number;
|
|
143
|
+
server?: string;
|
|
144
|
+
database?: string;
|
|
145
|
+
schema?: string;
|
|
131
146
|
}): Promise<MutationPreviewResult>;
|
|
132
147
|
/**
|
|
133
148
|
* Execute a mutation (INSERT/UPDATE/DELETE) in dry-run mode.
|
|
@@ -142,6 +157,9 @@ export declare function mutationPreview(args: {
|
|
|
142
157
|
export declare function mutationDryRun(args: {
|
|
143
158
|
sql: string;
|
|
144
159
|
sampleSize?: number;
|
|
160
|
+
server?: string;
|
|
161
|
+
database?: string;
|
|
162
|
+
schema?: string;
|
|
145
163
|
}): Promise<MutationDryRunResult>;
|
|
146
164
|
/**
|
|
147
165
|
* Execute multiple SQL queries in parallel.
|
|
@@ -150,6 +168,9 @@ export declare function mutationDryRun(args: {
|
|
|
150
168
|
export declare function batchExecute(args: {
|
|
151
169
|
queries: BatchQuery[];
|
|
152
170
|
stopOnError?: boolean;
|
|
171
|
+
server?: string;
|
|
172
|
+
database?: string;
|
|
173
|
+
schema?: string;
|
|
153
174
|
}): Promise<BatchExecuteResult>;
|
|
154
175
|
/**
|
|
155
176
|
* Begin a new transaction. Returns a transactionId to use with subsequent queries.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-tools.d.ts","sourceRoot":"","sources":["../../src/tools/sql-tools.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,SAAS,EAGT,qBAAqB,EACrB,UAAU,EAEV,kBAAkB,EAClB,iBAAiB,EAGjB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,
|
|
1
|
+
{"version":3,"file":"sql-tools.d.ts","sourceRoot":"","sources":["../../src/tools/sql-tools.ts"],"names":[],"mappings":"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"}
|