Skip to content

Commit 7954e8d

Browse files
committed
Allow removeEmbeddedAreas to support values
Signed-off-by: worksofliam <mrliamallan@live.co.uk>
1 parent e01ee29 commit 7954e8d

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

src/language/sql/document.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ export default class Document {
223223
})
224224
}
225225

226-
removeEmbeddedAreas(statement: Statement, replacement: `snippet`|`?` = `?`): ParsedEmbeddedStatement {
226+
removeEmbeddedAreas(statement: Statement, options: {replacement: `snippet`|`?`|`values`, values?: any[]} = {replacement: `?`}): ParsedEmbeddedStatement {
227227
const areas = statement.getEmbeddedStatementAreas();
228228

229229
const totalParameters = areas.filter(a => a.type === `marker`).length;
@@ -242,13 +242,27 @@ export default class Document {
242242
case `marker`:
243243
const markerContent = newContent.substring(start, end);
244244

245-
switch (replacement) {
245+
switch (options.replacement) {
246246
case `snippet`:
247247
newContent = newContent.substring(0, start) + `\${${totalParameters-parameterCount}:${markerContent}}` + newContent.substring(end) + `$0`;
248248
break;
249249
case `?`:
250250
newContent = newContent.substring(0, start) + `?` + newContent.substring(end);
251251
break;
252+
case `values`:
253+
let valueIndex = totalParameters - parameterCount - 1;
254+
if (options.values && options.values.length > valueIndex) {
255+
let value = options.values[valueIndex];
256+
257+
if (typeof value === `string`) {
258+
value = `'${value.replace(/'/g, `''`)}'`; // Escape single quotes in strings
259+
}
260+
261+
newContent = newContent.substring(0, start) + value + newContent.substring(end);
262+
} else {
263+
newContent = newContent.substring(0, start) + `?` + newContent.substring(end);
264+
}
265+
break;
252266
}
253267

254268
parameterCount++;

src/views/results/binding.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function getPriorBindableStatement(editor: TextEditor, offset: number): {
1818
if (group.statements.length === 1) {
1919
const statement = group.statements[0];
2020
if (!statement.getLabel()) {
21-
const newStatement = sqlDocument.removeEmbeddedAreas(statement, `?`);
21+
const newStatement = sqlDocument.removeEmbeddedAreas(statement);
2222
return {
2323
statement: newStatement.content,
2424
parameters: newStatement.parameterCount

src/views/results/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ export function initialise(context: vscode.ExtensionContext) {
163163
)
164164
}
165165

166-
const ALLOWED_PREFIXES_FOR_MULTIPLE: StatementQualifier[] = [`cl`, `json`, `csv`, `sql`, `statement`];
166+
const ALLOWED_PREFIXES_FOR_MULTIPLE: StatementQualifier[] = [`cl`, `json`, `csv`, `sql`, `statement`, `bind`];
167167

168168
function isStop(statement: Statement) {
169169
return (statement.type === StatementType.Unknown && statement.tokens.length === 1 && statement.tokens[0].value.toUpperCase() === `STOP`);
@@ -600,7 +600,7 @@ export function parseStatement(editor?: vscode.TextEditor, existingInfo?: Statem
600600

601601
if (sqlDocument) {
602602
if (statementInfo.qualifier !== `cl`) {
603-
statementInfo.embeddedInfo = sqlDocument.removeEmbeddedAreas(statementInfo.statement, `snippet`);
603+
statementInfo.embeddedInfo = sqlDocument.removeEmbeddedAreas(statementInfo.statement, {replacement: `snippet`});
604604
}
605605
}
606606

0 commit comments

Comments
 (0)