Skip to content

Commit f9d76a8

Browse files
committed
Better support for finding statement type when EXEC is used
1 parent 95bffdc commit f9d76a8

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/language/sql/statement.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,19 @@ export default class Statement {
99
public type: StatementType = StatementType.Unknown;
1010

1111
constructor(public tokens: Token[], public range: IRange) {
12-
const first = tokens[0];
12+
this.tokens = this.tokens.filter(newToken => newToken.type !== `newline`);
13+
14+
let first = this.tokens[0];
15+
16+
if (tokenIs(first, `word`, `EXEC`) && tokenIs(this.tokens[1], `word`, `SQL`) && this) {
17+
first = this.tokens[3];
18+
}
1319

1420
if (tokenIs(first, `statementType`) || tokenIs(first, `keyword`, `END`) || tokenIs(first, `keyword`, `BEGIN`)) {
1521
const wordValue = first.value?.toUpperCase();
1622

1723
this.type = StatementTypeWord[wordValue];
1824
}
19-
20-
this.tokens = this.tokens.filter(newToken => newToken.type !== `newline`)
2125

2226
switch (this.type) {
2327
case StatementType.With:
@@ -466,6 +470,9 @@ export default class Statement {
466470
* DECLARE .. CURSOR FOR
467471
*/
468472
getEmbeddedStatementAreas() {
473+
// Only these statements support the INTO clause in embedded SQL really
474+
const validIntoStatements: StatementType[] = [StatementType.Unknown, StatementType.With, StatementType.Select];
475+
469476
let ranges: {type: "remove"|"marker", range: IRange}[] = [];
470477
let intoClause: Token|undefined;
471478
let declareStmt: Token|undefined;
@@ -484,6 +491,7 @@ export default class Statement {
484491
break;
485492

486493
case `clause`:
494+
if (!validIntoStatements.includes(this.type)) continue;
487495
if (declareStmt) continue;
488496

489497
// We need to remove the INTO clause completely.

src/language/sql/tests/statements.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,4 +1314,18 @@ describe(`Parameter statement tests`, () => {
13141314
` WHERE column-1 = expression`,
13151315
].join(`\n`));
13161316
});
1317+
1318+
test(`Insert with INTO clause`, () => {
1319+
const content = `INSERT INTO COOLSTUFF.DLRGPSNEW (DLRID, LOCATION) SELECT ID, QSYS2.ST_POINT(GPSLON, GPSLAT) FROM COOLSTUFF.DLRGPS2`;
1320+
1321+
const document = new Document(content);
1322+
const statements = document.statements;
1323+
expect(statements.length).toBe(1);
1324+
1325+
const statement = statements[0];
1326+
1327+
const result = document.removeEmbeddedAreas(statement);
1328+
expect(result.parameterCount).toBe(0);
1329+
expect(result.content).toBe(content);
1330+
});
13171331
});

0 commit comments

Comments
 (0)