Skip to content

Commit b308d03

Browse files
committed
test: complete after error syntax
1 parent a34e796 commit b308d03

File tree

7 files changed

+458
-0
lines changed

7 files changed

+458
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { FlinkSQL } from 'src/parser/flink';
2+
import { CaretPosition, EntityContextType } from 'src/parser/common/types';
3+
4+
describe('FlinkSQL Complete After Syntax Error', () => {
5+
const flink = new FlinkSQL();
6+
7+
const sql1 = `SELECT FROM tb2;\nINSERT INTO `;
8+
const sql2 = `SELECT FROM tb3;\nCREATE TABLE `;
9+
const sql3 = `SELECT FROM t1;\nSL`;
10+
11+
test('Syntax error but end with semi, should suggest tableName', () => {
12+
const pos: CaretPosition = {
13+
lineNumber: 2,
14+
column: 13,
15+
};
16+
const suggestion = flink.getSuggestionAtCaretPosition(sql1, pos);
17+
expect(suggestion).not.toBeUndefined();
18+
19+
// syntax
20+
const syntaxes = suggestion?.syntax;
21+
expect(syntaxes.length).toBe(1);
22+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE);
23+
24+
// keyword
25+
const keywords = suggestion?.keywords;
26+
expect(keywords.length).toBe(0);
27+
});
28+
29+
test('Syntax error but end with semi, should suggest tableNameCreate', () => {
30+
const pos: CaretPosition = {
31+
lineNumber: 2,
32+
column: 14,
33+
};
34+
const suggestion = flink.getSuggestionAtCaretPosition(sql2, pos);
35+
expect(suggestion).not.toBeUndefined();
36+
37+
// syntax
38+
const syntaxes = suggestion?.syntax;
39+
expect(syntaxes.length).toBe(1);
40+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE_CREATE);
41+
42+
// keyword
43+
const keywords = suggestion?.keywords;
44+
expect(keywords).toMatchUnorderedArray(['IF', 'IF NOT EXISTS']);
45+
});
46+
47+
test('Syntax error but end with semi, should suggest filter token', () => {
48+
const pos: CaretPosition = {
49+
lineNumber: 2,
50+
column: 2,
51+
};
52+
const suggestion = flink.getSuggestionAtCaretPosition(sql3, pos);
53+
expect(suggestion).not.toBeUndefined();
54+
55+
// syntax
56+
const syntaxes = suggestion?.syntax;
57+
expect(syntaxes.length).toBe(0);
58+
59+
// keyword
60+
const filterKeywords = suggestion?.keywords?.filter(
61+
(item) => item.startsWith('S') && /S(?=.*L)/.test(item)
62+
);
63+
expect(filterKeywords).toMatchUnorderedArray(['SELECT']);
64+
});
65+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { HiveSQL } from 'src/parser/hive';
2+
import { CaretPosition, EntityContextType } from 'src/parser/common/types';
3+
4+
describe('HiveSQL Complete After Syntax Error', () => {
5+
const hive = new HiveSQL();
6+
7+
const sql1 = `SELECT FROM tb2;\nINSERT INTO `;
8+
const sql2 = `SELECT FROM tb3;\nCREATE TABLE `;
9+
const sql3 = `SELECT FROM t1;\nSL`;
10+
11+
test('Syntax error but end with semi, should suggest tableName', () => {
12+
const pos: CaretPosition = {
13+
lineNumber: 2,
14+
column: 13,
15+
};
16+
const suggestion = hive.getSuggestionAtCaretPosition(sql1, pos);
17+
expect(suggestion).not.toBeUndefined();
18+
19+
// syntax
20+
const syntaxes = suggestion?.syntax;
21+
expect(syntaxes.length).toBe(1);
22+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE);
23+
24+
// keyword
25+
const keywords = suggestion?.keywords;
26+
expect(keywords.length).toBe(1);
27+
expect(keywords[0]).toBe('TABLE');
28+
});
29+
30+
test('Syntax error but end with semi, should suggest tableNameCreate', () => {
31+
const pos: CaretPosition = {
32+
lineNumber: 2,
33+
column: 14,
34+
};
35+
const suggestion = hive.getSuggestionAtCaretPosition(sql2, pos);
36+
expect(suggestion).not.toBeUndefined();
37+
38+
// syntax
39+
const syntaxes = suggestion?.syntax;
40+
expect(syntaxes.length).toBe(1);
41+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE_CREATE);
42+
43+
// keyword
44+
const keywords = suggestion?.keywords;
45+
expect(keywords).toMatchUnorderedArray(['IF', 'IF NOT EXISTS']);
46+
});
47+
48+
test('Syntax error but end with semi, should suggest filter token', () => {
49+
const pos: CaretPosition = {
50+
lineNumber: 2,
51+
column: 2,
52+
};
53+
const suggestion = hive.getSuggestionAtCaretPosition(sql3, pos);
54+
expect(suggestion).not.toBeUndefined();
55+
56+
// syntax
57+
const syntaxes = suggestion?.syntax;
58+
expect(syntaxes.length).toBe(0);
59+
60+
// keyword
61+
const filterKeywords = suggestion?.keywords?.filter(
62+
(item) => item.startsWith('S') && /S(?=.*L)/.test(item)
63+
);
64+
expect(filterKeywords).toMatchUnorderedArray(['SELECT']);
65+
});
66+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { ImpalaSQL } from 'src/parser/impala';
2+
import { CaretPosition, EntityContextType } from 'src/parser/common/types';
3+
4+
describe('ImpalaSQL Complete After Syntax Error', () => {
5+
const impala = new ImpalaSQL();
6+
7+
const sql1 = `SELECT FROM tb2;\nINSERT INTO `;
8+
const sql2 = `SELECT FROM tb3;\nCREATE TABLE `;
9+
const sql3 = `SELECT FROM t1;\nSL`;
10+
11+
test('Syntax error but end with semi, should suggest tableName', () => {
12+
const pos: CaretPosition = {
13+
lineNumber: 2,
14+
column: 13,
15+
};
16+
const suggestion = impala.getSuggestionAtCaretPosition(sql1, pos);
17+
expect(suggestion).not.toBeUndefined();
18+
19+
// syntax
20+
const syntaxes = suggestion?.syntax;
21+
expect(syntaxes.length).toBe(1);
22+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE);
23+
24+
// keyword
25+
const keywords = suggestion?.keywords;
26+
expect(keywords.length).toBe(1);
27+
expect(keywords[0]).toBe('TABLE');
28+
});
29+
30+
test('Syntax error but end with semi, should suggest tableNameCreate', () => {
31+
const pos: CaretPosition = {
32+
lineNumber: 2,
33+
column: 14,
34+
};
35+
const suggestion = impala.getSuggestionAtCaretPosition(sql2, pos);
36+
expect(suggestion).not.toBeUndefined();
37+
38+
// syntax
39+
const syntaxes = suggestion?.syntax;
40+
expect(syntaxes.length).toBe(1);
41+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE_CREATE);
42+
43+
// keyword
44+
const keywords = suggestion?.keywords;
45+
expect(keywords).toMatchUnorderedArray(['IF', 'IF NOT EXISTS']);
46+
});
47+
48+
test('Syntax error but end with semi, should suggest filter token', () => {
49+
const pos: CaretPosition = {
50+
lineNumber: 2,
51+
column: 2,
52+
};
53+
const suggestion = impala.getSuggestionAtCaretPosition(sql3, pos);
54+
expect(suggestion).not.toBeUndefined();
55+
56+
// syntax
57+
const syntaxes = suggestion?.syntax;
58+
expect(syntaxes.length).toBe(0);
59+
60+
// keyword
61+
const filterKeywords = suggestion?.keywords?.filter(
62+
(item) => item.startsWith('S') && /S(?=.*L)/.test(item)
63+
);
64+
expect(filterKeywords).toMatchUnorderedArray(['SELECT']);
65+
});
66+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { MySQL } from 'src/parser/mysql';
2+
import { CaretPosition, EntityContextType } from 'src/parser/common/types';
3+
4+
describe('MySQL Complete After Syntax Error', () => {
5+
const mysql = new MySQL();
6+
7+
const sql1 = `SELECT FROM tb2;\nINSERT INTO `;
8+
const sql2 = `SELECT FROM tb3;\nCREATE TABLE `;
9+
const sql3 = `SELECT FROM t1;\nSL`;
10+
11+
test('Syntax error but end with semi, should suggest tableName', () => {
12+
const pos: CaretPosition = {
13+
lineNumber: 2,
14+
column: 13,
15+
};
16+
const suggestion = mysql.getSuggestionAtCaretPosition(sql1, pos);
17+
expect(suggestion).not.toBeUndefined();
18+
19+
// syntax
20+
const syntaxes = suggestion?.syntax;
21+
expect(syntaxes.length).toBe(1);
22+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE);
23+
24+
// keyword
25+
const keywords = suggestion?.keywords;
26+
expect(keywords.length).toBe(0);
27+
});
28+
29+
test('Syntax error but end with semi, should suggest tableNameCreate', () => {
30+
const pos: CaretPosition = {
31+
lineNumber: 2,
32+
column: 14,
33+
};
34+
const suggestion = mysql.getSuggestionAtCaretPosition(sql2, pos);
35+
expect(suggestion).not.toBeUndefined();
36+
37+
// syntax
38+
const syntaxes = suggestion?.syntax;
39+
expect(syntaxes.length).toBe(1);
40+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE_CREATE);
41+
42+
// keyword
43+
const keywords = suggestion?.keywords;
44+
expect(keywords).toMatchUnorderedArray(['IF', 'IF NOT EXISTS']);
45+
});
46+
47+
test('Syntax error but end with semi, should suggest filter token', () => {
48+
const pos: CaretPosition = {
49+
lineNumber: 2,
50+
column: 2,
51+
};
52+
const suggestion = mysql.getSuggestionAtCaretPosition(sql3, pos);
53+
expect(suggestion).not.toBeUndefined();
54+
55+
// syntax
56+
const syntaxes = suggestion?.syntax;
57+
expect(syntaxes.length).toBe(0);
58+
59+
// keyword
60+
const filterKeywords = suggestion?.keywords?.filter(
61+
(item) => item.startsWith('S') && /S(?=.*L)/.test(item)
62+
);
63+
expect(filterKeywords).toMatchUnorderedArray(['SELECT', 'SIGNAL']);
64+
});
65+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { PostgreSQL } from 'src/parser/postgresql';
2+
import { CaretPosition, EntityContextType } from 'src/parser/common/types';
3+
4+
describe('PostgreSQL Complete After Syntax Error', () => {
5+
const postgresql = new PostgreSQL();
6+
7+
const sql1 = `SELECT FROM tb2;\nINSERT INTO `;
8+
const sql2 = `SELECT FROM tb3;\nCREATE TABLE `;
9+
const sql3 = `SELECT FROM t1;\nSL`;
10+
11+
test('Syntax error but end with semi, should suggest tableName', () => {
12+
const pos: CaretPosition = {
13+
lineNumber: 2,
14+
column: 13,
15+
};
16+
const suggestion = postgresql.getSuggestionAtCaretPosition(sql1, pos);
17+
expect(suggestion).not.toBeUndefined();
18+
19+
// syntax
20+
const syntaxes = suggestion?.syntax;
21+
expect(syntaxes.length).toBe(1);
22+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE);
23+
24+
// keyword
25+
const keywords = suggestion?.keywords;
26+
expect(keywords.length).toBe(0);
27+
});
28+
29+
test('Syntax error but end with semi, should suggest tableNameCreate', () => {
30+
const pos: CaretPosition = {
31+
lineNumber: 2,
32+
column: 14,
33+
};
34+
const suggestion = postgresql.getSuggestionAtCaretPosition(sql2, pos);
35+
expect(suggestion).not.toBeUndefined();
36+
37+
// syntax
38+
const syntaxes = suggestion?.syntax;
39+
expect(syntaxes.length).toBe(1);
40+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE_CREATE);
41+
42+
// keyword
43+
const keywords = suggestion?.keywords;
44+
expect(keywords).toMatchUnorderedArray(['IF', 'IF NOT EXISTS']);
45+
});
46+
47+
test('Syntax error but end with semi, should suggest filter token', () => {
48+
const pos: CaretPosition = {
49+
lineNumber: 2,
50+
column: 2,
51+
};
52+
const suggestion = postgresql.getSuggestionAtCaretPosition(sql3, pos);
53+
expect(suggestion).not.toBeUndefined();
54+
55+
// syntax
56+
const syntaxes = suggestion?.syntax;
57+
expect(syntaxes.length).toBe(0);
58+
59+
// keyword
60+
const filterKeywords = suggestion?.keywords?.filter(
61+
(item) => item.startsWith('SEL') && /S(?=.*L)/.test(item)
62+
);
63+
expect(filterKeywords).toMatchUnorderedArray(['SELECT']);
64+
});
65+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { SparkSQL } from 'src/parser/spark';
2+
import { CaretPosition, EntityContextType } from 'src/parser/common/types';
3+
4+
describe('SparkSQL Complete After Syntax Error', () => {
5+
const spark = new SparkSQL();
6+
7+
const sql1 = `SELECT FROM tb2;\nINSERT INTO `;
8+
const sql2 = `SELECT FROM tb3;\nCREATE TABLE `;
9+
const sql3 = `SELECT FROM t1;\nSL`;
10+
11+
test('Syntax error but end with semi, should suggest tableName', () => {
12+
const pos: CaretPosition = {
13+
lineNumber: 2,
14+
column: 13,
15+
};
16+
const suggestion = spark.getSuggestionAtCaretPosition(sql1, pos);
17+
expect(suggestion).not.toBeUndefined();
18+
19+
// syntax
20+
const syntaxes = suggestion?.syntax;
21+
expect(syntaxes.length).toBe(1);
22+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE);
23+
24+
// keyword
25+
const keywords = suggestion?.keywords;
26+
expect(keywords.length).toBe(1);
27+
expect(keywords[0]).toBe('TABLE');
28+
});
29+
30+
test('Syntax error but end with semi, should suggest tableNameCreate', () => {
31+
const pos: CaretPosition = {
32+
lineNumber: 2,
33+
column: 14,
34+
};
35+
const suggestion = spark.getSuggestionAtCaretPosition(sql2, pos);
36+
expect(suggestion).not.toBeUndefined();
37+
38+
// syntax
39+
const syntaxes = suggestion?.syntax;
40+
expect(syntaxes.length).toBe(1);
41+
expect(syntaxes[0].syntaxContextType).toBe(EntityContextType.TABLE_CREATE);
42+
43+
// keyword
44+
const keywords = suggestion?.keywords;
45+
expect(keywords).toMatchUnorderedArray(['IF', 'IF NOT EXISTS']);
46+
});
47+
48+
test('Syntax error but end with semi, should suggest filter token', () => {
49+
const pos: CaretPosition = {
50+
lineNumber: 2,
51+
column: 2,
52+
};
53+
const suggestion = spark.getSuggestionAtCaretPosition(sql3, pos);
54+
expect(suggestion).not.toBeUndefined();
55+
56+
// syntax
57+
const syntaxes = suggestion?.syntax;
58+
expect(syntaxes.length).toBe(0);
59+
60+
// keyword
61+
const filterKeywords = suggestion?.keywords?.filter(
62+
(item) => item.startsWith('S') && /S(?=.*L)/.test(item)
63+
);
64+
expect(filterKeywords).toMatchUnorderedArray(['SELECT']);
65+
});
66+
});

0 commit comments

Comments
 (0)