Skip to content

Commit 7e51583

Browse files
committed
Fix for lateral use with no references
Signed-off-by: worksofliam <[email protected]>
1 parent 959df0b commit 7e51583

File tree

3 files changed

+44
-18
lines changed

3 files changed

+44
-18
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/language/sql/statement.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -324,11 +324,16 @@ export default class Statement {
324324

325325
}
326326

327+
private static readonly BANNED_NAMES = [`VALUES`];
327328
getObjectReferences(): ObjectRef[] {
328329
let list: ObjectRef[] = [];
329330

330331
const doAdd = (ref?: ObjectRef) => {
331-
if (ref) list.push(ref);
332+
if (ref) {
333+
if (ref.object.name && !Statement.BANNED_NAMES.includes(ref.object.name.toUpperCase())) {
334+
list.push(ref);
335+
}
336+
}
332337
}
333338

334339
const basicQueryFinder = (startIndex: number): void => {
@@ -365,6 +370,14 @@ export default class Statement {
365370
i += 3; //For the brackets
366371
}
367372
}
373+
} else if (currentClause === `from` && tokenIs(this.tokens[i], `function`)) {
374+
const sqlObj = this.getRefAtToken(i, {includeParameters: true});
375+
if (sqlObj) {
376+
i += sqlObj.tokens.length;
377+
if (sqlObj.isUDTF || sqlObj.fromLateral) {
378+
i += 3; //For the brackets
379+
}
380+
}
368381
}
369382
}
370383
}
@@ -538,18 +551,17 @@ export default class Statement {
538551
return list;
539552
}
540553

541-
private getRefAtToken(i: number, options: {withSystemName?: boolean} = {}): ObjectRef|undefined {
554+
private getRefAtToken(i: number, options: {withSystemName?: boolean, includeParameters?: boolean} = {}): ObjectRef|undefined {
542555
let sqlObj: ObjectRef;
543556

544557
let nextIndex = i;
545558
let nextToken = this.tokens[i];
546559

547560
let endIndex = i;
548561

549-
const isUDTF = tokenIs(nextToken, `function`, `TABLE`);
550-
const isLateral = tokenIs(nextToken, `function`, `LATERAL`);
562+
const isSubSelect = tokenIs(nextToken, `function`, `TABLE`) || tokenIs(nextToken, `function`, `LATERAL`) || (options.includeParameters && tokenIs(nextToken, `function`));
551563

552-
if (isUDTF) {
564+
if (isSubSelect) {
553565
sqlObj = this.getRefAtToken(i+2);
554566
if (sqlObj) {
555567
sqlObj.isUDTF = true;
@@ -563,14 +575,6 @@ export default class Statement {
563575
nextIndex = -1;
564576
nextToken = undefined;
565577
}
566-
} else if (isLateral) {
567-
const blockTokens = this.getBlockAt(nextToken.range.end+1);
568-
const newStatement = new Statement(blockTokens, {start: nextToken.range.start, end: blockTokens[blockTokens.length-1].range.end});
569-
[sqlObj] = newStatement.getObjectReferences();
570-
571-
sqlObj.fromLateral = true;
572-
nextIndex = i + 2 + blockTokens.length;
573-
nextToken = this.tokens[nextIndex];
574578

575579
} else {
576580
if (nextToken && NameTypes.includes(nextToken.type)) {
@@ -618,7 +622,7 @@ export default class Statement {
618622
}
619623
}
620624

621-
if (!isUDTF) {
625+
if (!isSubSelect && !sqlObj.isUDTF) {
622626
sqlObj.tokens = this.tokens.slice(i, endIndex+1);
623627
}
624628

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,7 +1105,29 @@ parserScenarios(`Object references`, ({newDoc}) => {
11051105

11061106
expect(refs[2].object.name).toBe(`object_statistics`);
11071107
expect(refs[2].object.schema).toBe(`qsys2`);
1108-
expect(refs[2].alias).toBe(`z`);
1108+
expect(refs[2].alias).toBe(undefined);
1109+
});
1110+
1111+
test('SELECT FROM LATERAL', () => {
1112+
const lines = [
1113+
`SELECT id, id_phone, t.phone_number`,
1114+
` FROM testlateral AS s,`,
1115+
` LATERAL(VALUES (1, S.phone1),`,
1116+
` (2, S.phone2),`,
1117+
` (3, S.phone3)) AS T(id_phone, phone_number)`,
1118+
].join(`\n`);
1119+
1120+
const document = new Document(lines);
1121+
1122+
expect(document.statements.length).toBe(1);
1123+
1124+
const statement = document.statements[0];
1125+
1126+
expect(statement.type).toBe(StatementType.Select);
1127+
1128+
const refs = statement.getObjectReferences();
1129+
console.log(refs);
1130+
expect(refs.length).toBe(1);
11091131
});
11101132

11111133
test(`Multiple UDTFs`, () => {
@@ -1407,7 +1429,7 @@ parserScenarios(`PL body tests`, ({newDoc}) => {
14071429

14081430
const refs = statement.getObjectReferences();
14091431
const ctes = statement.getCTEReferences();
1410-
1432+
14111433
expect(refs.length).toBe(10);
14121434
expect(refs[0].object.name).toBe(`shipments`);
14131435
expect(refs[0].alias).toBe(`s`);

0 commit comments

Comments
 (0)