dt-sql-parser 4.0.2 → 4.1.0-beta.1
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 +6 -1
- package/dist/lib/flink/FlinkSqlLexer.js +1 -2
- package/dist/lib/flink/FlinkSqlParser.d.ts +175 -174
- package/dist/lib/flink/FlinkSqlParser.js +2315 -2388
- package/dist/lib/flink/FlinkSqlParserListener.d.ts +5 -16
- package/dist/lib/flink/FlinkSqlParserVisitor.d.ts +3 -10
- package/dist/lib/hive/HiveSqlLexer.js +1 -2
- package/dist/lib/hive/HiveSqlParser.d.ts +3 -1
- package/dist/lib/hive/HiveSqlParser.js +8 -9
- package/dist/lib/impala/ImpalaSqlLexer.js +1 -2
- package/dist/lib/impala/ImpalaSqlParser.d.ts +123 -107
- package/dist/lib/impala/ImpalaSqlParser.js +3223 -3155
- package/dist/lib/impala/ImpalaSqlParserListener.d.ts +22 -0
- package/dist/lib/impala/ImpalaSqlParserVisitor.d.ts +14 -0
- package/dist/lib/mysql/MySqlLexer.js +1 -2
- package/dist/lib/mysql/MySqlParser.d.ts +469 -422
- package/dist/lib/mysql/MySqlParser.js +11460 -10509
- package/dist/lib/mysql/MySqlParserListener.d.ts +33 -11
- package/dist/lib/mysql/MySqlParserVisitor.d.ts +21 -7
- package/dist/lib/postgresql/PostgreSqlLexer.js +1 -2
- package/dist/lib/postgresql/PostgreSqlParser.d.ts +2025 -6265
- package/dist/lib/postgresql/PostgreSqlParser.js +60092 -88368
- package/dist/lib/postgresql/PostgreSqlParserListener.d.ts +1688 -6083
- package/dist/lib/postgresql/PostgreSqlParserVisitor.d.ts +712 -3511
- package/dist/lib/spark/SparkSqlLexer.js +1 -2
- package/dist/lib/spark/SparkSqlParser.d.ts +16 -13
- package/dist/lib/spark/SparkSqlParser.js +50 -51
- package/dist/lib/spark/SparkSqlParserListener.d.ts +10 -10
- package/dist/lib/spark/SparkSqlParserVisitor.d.ts +6 -6
- package/dist/lib/trino/TrinoSqlLexer.d.ts +323 -260
- package/dist/lib/trino/TrinoSqlLexer.js +1610 -1264
- package/dist/lib/trino/TrinoSqlListener.d.ts +1311 -200
- package/dist/lib/trino/TrinoSqlParser.d.ts +1908 -562
- package/dist/lib/trino/TrinoSqlParser.js +22629 -13412
- package/dist/lib/trino/TrinoSqlVisitor.d.ts +761 -69
- package/dist/locale/locale.d.ts +41 -0
- package/dist/locale/locale.js +43 -0
- package/dist/parser/common/basicSQL.d.ts +9 -4
- package/dist/parser/common/basicSQL.js +64 -21
- package/dist/parser/common/entityCollector.d.ts +60 -12
- package/dist/parser/common/entityCollector.js +141 -17
- package/dist/parser/common/parseErrorListener.d.ts +6 -3
- package/dist/parser/common/parseErrorListener.js +83 -2
- package/dist/parser/common/textAndWord.d.ts +6 -9
- package/dist/parser/common/textAndWord.js +9 -20
- package/dist/parser/common/transform.d.ts +8 -0
- package/dist/parser/common/transform.js +11 -0
- package/dist/parser/common/types.d.ts +1 -0
- package/dist/parser/flink/flinkEntityCollector.js +40 -6
- package/dist/parser/flink/flinkErrorListener.d.ts +9 -0
- package/dist/parser/flink/flinkErrorListener.js +67 -0
- package/dist/parser/flink/index.d.ts +4 -1
- package/dist/parser/flink/index.js +16 -12
- package/dist/parser/hive/hiveEntityCollector.js +40 -6
- package/dist/parser/hive/hiveErrorListener.d.ts +9 -0
- package/dist/parser/hive/hiveErrorListener.js +65 -0
- package/dist/parser/hive/index.d.ts +4 -1
- package/dist/parser/hive/index.js +16 -12
- package/dist/parser/impala/ImpalaErrorListener.d.ts +9 -0
- package/dist/parser/impala/ImpalaErrorListener.js +63 -0
- package/dist/parser/impala/impalaEntityCollector.js +51 -6
- package/dist/parser/impala/index.d.ts +4 -1
- package/dist/parser/impala/index.js +7 -3
- package/dist/parser/mysql/index.d.ts +4 -1
- package/dist/parser/mysql/index.js +7 -3
- package/dist/parser/mysql/mysqlEntityCollector.d.ts +3 -1
- package/dist/parser/mysql/mysqlEntityCollector.js +40 -5
- package/dist/parser/mysql/mysqlErrorListener.d.ts +9 -0
- package/dist/parser/mysql/mysqlErrorListener.js +63 -0
- package/dist/parser/postgresql/index.d.ts +4 -1
- package/dist/parser/postgresql/index.js +20 -16
- package/dist/parser/postgresql/postgreEntityCollector.d.ts +5 -1
- package/dist/parser/postgresql/postgreEntityCollector.js +44 -4
- package/dist/parser/postgresql/postgreErrorListener.d.ts +9 -0
- package/dist/parser/postgresql/postgreErrorListener.js +71 -0
- package/dist/parser/spark/index.d.ts +4 -1
- package/dist/parser/spark/index.js +7 -3
- package/dist/parser/spark/sparkEntityCollector.d.ts +1 -1
- package/dist/parser/spark/sparkEntityCollector.js +43 -6
- package/dist/parser/spark/sparkErrorListener.d.ts +9 -0
- package/dist/parser/spark/sparkErrorListener.js +63 -0
- package/dist/parser/trino/index.d.ts +4 -1
- package/dist/parser/trino/index.js +26 -13
- package/dist/parser/trino/trinoEntityCollector.d.ts +6 -4
- package/dist/parser/trino/trinoEntityCollector.js +44 -9
- package/dist/parser/trino/trinoErrorListener.d.ts +9 -0
- package/dist/parser/trino/trinoErrorListener.js +65 -0
- package/package.json +35 -11
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { CodeCompletionCore } from 'antlr4-c3';
|
|
2
|
+
import { ParseErrorListener } from '../common/parseErrorListener';
|
|
3
|
+
import { PostgreSqlParser } from '../../lib/postgresql/PostgreSqlParser';
|
|
4
|
+
export class PostgreSqlErrorListener extends ParseErrorListener {
|
|
5
|
+
constructor(errorListener, preferredRules, locale) {
|
|
6
|
+
super(errorListener, locale);
|
|
7
|
+
this.objectNames = new Map([
|
|
8
|
+
[PostgreSqlParser.RULE_database_name, 'database'],
|
|
9
|
+
[PostgreSqlParser.RULE_database_name_create, 'database'],
|
|
10
|
+
[PostgreSqlParser.RULE_table_name, 'table'],
|
|
11
|
+
[PostgreSqlParser.RULE_table_name_create, 'table'],
|
|
12
|
+
[PostgreSqlParser.RULE_view_name, 'view'],
|
|
13
|
+
[PostgreSqlParser.RULE_view_name_create, 'view'],
|
|
14
|
+
[PostgreSqlParser.RULE_function_name, 'function'],
|
|
15
|
+
[PostgreSqlParser.RULE_function_name_create, 'function'],
|
|
16
|
+
[PostgreSqlParser.RULE_column_name, 'column'],
|
|
17
|
+
[PostgreSqlParser.RULE_column_name_create, 'column'],
|
|
18
|
+
[PostgreSqlParser.RULE_schema_name_create, 'schema'],
|
|
19
|
+
[PostgreSqlParser.RULE_schema_name, 'schema'],
|
|
20
|
+
[PostgreSqlParser.RULE_procedure_name_create, 'procedure'],
|
|
21
|
+
[PostgreSqlParser.RULE_procedure_name, 'procedure'],
|
|
22
|
+
]);
|
|
23
|
+
this.preferredRules = preferredRules;
|
|
24
|
+
}
|
|
25
|
+
getExpectedText(parser, token) {
|
|
26
|
+
var _a;
|
|
27
|
+
let expectedText = '';
|
|
28
|
+
let currentContext = (_a = parser.context) !== null && _a !== void 0 ? _a : undefined;
|
|
29
|
+
while (currentContext === null || currentContext === void 0 ? void 0 : currentContext.parent) {
|
|
30
|
+
currentContext = currentContext.parent;
|
|
31
|
+
}
|
|
32
|
+
const core = new CodeCompletionCore(parser);
|
|
33
|
+
core.preferredRules = this.preferredRules;
|
|
34
|
+
const candidates = core.collectCandidates(token.tokenIndex, currentContext);
|
|
35
|
+
if (candidates.rules.size) {
|
|
36
|
+
const result = [];
|
|
37
|
+
// get expectedText as collect rules first
|
|
38
|
+
for (const candidate of candidates.rules) {
|
|
39
|
+
const [ruleType] = candidate;
|
|
40
|
+
const name = this.objectNames.get(ruleType);
|
|
41
|
+
switch (ruleType) {
|
|
42
|
+
case PostgreSqlParser.RULE_table_name:
|
|
43
|
+
case PostgreSqlParser.RULE_function_name:
|
|
44
|
+
case PostgreSqlParser.RULE_schema_name:
|
|
45
|
+
case PostgreSqlParser.RULE_view_name:
|
|
46
|
+
case PostgreSqlParser.RULE_database_name:
|
|
47
|
+
case PostgreSqlParser.RULE_procedure_name:
|
|
48
|
+
case PostgreSqlParser.RULE_column_name: {
|
|
49
|
+
result.push(`{existing}${name}`);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case PostgreSqlParser.RULE_table_name_create:
|
|
53
|
+
case PostgreSqlParser.RULE_function_name_create:
|
|
54
|
+
case PostgreSqlParser.RULE_schema_name_create:
|
|
55
|
+
case PostgreSqlParser.RULE_view_name_create:
|
|
56
|
+
case PostgreSqlParser.RULE_database_name_create:
|
|
57
|
+
case PostgreSqlParser.RULE_procedure_name_create:
|
|
58
|
+
case PostgreSqlParser.RULE_column_name_create: {
|
|
59
|
+
result.push(`{new}${name}`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
expectedText = result.join('{or}');
|
|
65
|
+
}
|
|
66
|
+
if (candidates.tokens.size) {
|
|
67
|
+
expectedText += expectedText ? '{orKeyword}' : '{keyword}';
|
|
68
|
+
}
|
|
69
|
+
return expectedText;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -6,12 +6,15 @@ import { BasicSQL } from '../common/basicSQL';
|
|
|
6
6
|
import { Suggestions } from '../common/types';
|
|
7
7
|
import { SparkSqlSplitListener } from './sparkSplitListener';
|
|
8
8
|
import { SparkEntityCollector } from './sparkEntityCollector';
|
|
9
|
+
import { SparkErrorListener } from './sparkErrorListener';
|
|
10
|
+
import { ErrorListener } from '../common/parseErrorListener';
|
|
9
11
|
export { SparkSqlSplitListener, SparkEntityCollector };
|
|
10
12
|
export declare class SparkSQL extends BasicSQL<SparkSqlLexer, ProgramContext, SparkSqlParser> {
|
|
11
13
|
protected createLexerFromCharStream(charStreams: CharStream): SparkSqlLexer;
|
|
12
14
|
protected createParserFromTokenStream(tokenStream: CommonTokenStream): SparkSqlParser;
|
|
13
15
|
protected preferredRules: Set<number>;
|
|
14
16
|
protected get splitListener(): SparkSqlSplitListener;
|
|
17
|
+
protected createErrorListener(_errorListener: ErrorListener): SparkErrorListener;
|
|
15
18
|
protected createEntityCollector(input: string, caretTokenIndex?: number): SparkEntityCollector;
|
|
16
|
-
protected processCandidates(candidates: CandidatesCollection, allTokens: Token[], caretTokenIndex: number
|
|
19
|
+
protected processCandidates(candidates: CandidatesCollection, allTokens: Token[], caretTokenIndex: number): Suggestions<Token>;
|
|
17
20
|
}
|
|
@@ -4,6 +4,7 @@ import { BasicSQL } from '../common/basicSQL';
|
|
|
4
4
|
import { EntityContextType } from '../common/types';
|
|
5
5
|
import { SparkSqlSplitListener } from './sparkSplitListener';
|
|
6
6
|
import { SparkEntityCollector } from './sparkEntityCollector';
|
|
7
|
+
import { SparkErrorListener } from './sparkErrorListener';
|
|
7
8
|
export { SparkSqlSplitListener, SparkEntityCollector };
|
|
8
9
|
export class SparkSQL extends BasicSQL {
|
|
9
10
|
constructor() {
|
|
@@ -30,16 +31,19 @@ export class SparkSQL extends BasicSQL {
|
|
|
30
31
|
get splitListener() {
|
|
31
32
|
return new SparkSqlSplitListener();
|
|
32
33
|
}
|
|
34
|
+
createErrorListener(_errorListener) {
|
|
35
|
+
return new SparkErrorListener(_errorListener, this.preferredRules, this.locale);
|
|
36
|
+
}
|
|
33
37
|
createEntityCollector(input, caretTokenIndex) {
|
|
34
38
|
return new SparkEntityCollector(input, caretTokenIndex);
|
|
35
39
|
}
|
|
36
|
-
processCandidates(candidates, allTokens, caretTokenIndex
|
|
40
|
+
processCandidates(candidates, allTokens, caretTokenIndex) {
|
|
37
41
|
const originalSyntaxSuggestions = [];
|
|
38
42
|
const keywords = [];
|
|
39
43
|
for (const candidate of candidates.rules) {
|
|
40
44
|
const [ruleType, candidateRule] = candidate;
|
|
41
|
-
const startTokenIndex = candidateRule.startTokenIndex
|
|
42
|
-
const tokenRanges = allTokens.slice(startTokenIndex, caretTokenIndex +
|
|
45
|
+
const startTokenIndex = candidateRule.startTokenIndex;
|
|
46
|
+
const tokenRanges = allTokens.slice(startTokenIndex, caretTokenIndex + 1);
|
|
43
47
|
let syntaxContextType = void 0;
|
|
44
48
|
switch (ruleType) {
|
|
45
49
|
case SparkSqlParser.RULE_namespaceName: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ColumnNameCreateContext, CreateFunctionContext, CreateNamespaceContext, CreateTableContext, CreateTableLikeContext, CreateTempViewUsingContext, CreateViewContext, FunctionNameCreateContext, InsertFromQueryContext, MultipleInsertContext, NamespaceNameContext, NamespaceNameCreateContext, QueryStatementContext, ReplaceTableContext, SingleStatementContext, TableNameContext, TableNameCreateContext, ViewNameContext, ViewNameCreateContext } from '../../lib/spark/SparkSqlParser';
|
|
2
2
|
import type { SparkSqlParserListener } from '../../lib/spark/SparkSqlParserListener';
|
|
3
3
|
import { EntityCollector } from '../common/entityCollector';
|
|
4
4
|
export declare class SparkEntityCollector extends EntityCollector implements SparkSqlParserListener {
|
|
@@ -1,30 +1,67 @@
|
|
|
1
|
+
import { CreateNamespaceContext, CreateOrReplaceTableColTypeContext, CreateTableContext, CreateViewContext, IdentifierCommentContext, RelationPrimaryContext, } from '../../lib/spark/SparkSqlParser';
|
|
2
|
+
import { AttrName, EntityCollector, StmtContextType } from '../common/entityCollector';
|
|
1
3
|
import { EntityContextType } from '../common/types';
|
|
2
|
-
import { StmtContextType, EntityCollector } from '../common/entityCollector';
|
|
3
4
|
export class SparkEntityCollector extends EntityCollector {
|
|
4
5
|
/** ====== Entity Begin */
|
|
5
6
|
exitNamespaceName(ctx) {
|
|
6
7
|
this.pushEntity(ctx, EntityContextType.DATABASE);
|
|
7
8
|
}
|
|
8
9
|
exitNamespaceNameCreate(ctx) {
|
|
9
|
-
this.pushEntity(ctx, EntityContextType.DATABASE_CREATE
|
|
10
|
+
this.pushEntity(ctx, EntityContextType.DATABASE_CREATE, [
|
|
11
|
+
{
|
|
12
|
+
attrName: AttrName.comment,
|
|
13
|
+
endContextList: [CreateNamespaceContext.name],
|
|
14
|
+
},
|
|
15
|
+
]);
|
|
10
16
|
}
|
|
11
17
|
exitTableName(ctx) {
|
|
12
|
-
|
|
18
|
+
var _a;
|
|
19
|
+
const needCollectAttr = ((_a = this.getRootStmt()) === null || _a === void 0 ? void 0 : _a.stmtContextType) === StmtContextType.SELECT_STMT;
|
|
20
|
+
this.pushEntity(ctx, EntityContextType.TABLE, needCollectAttr
|
|
21
|
+
? [
|
|
22
|
+
{
|
|
23
|
+
attrName: AttrName.alias,
|
|
24
|
+
endContextList: [RelationPrimaryContext.name],
|
|
25
|
+
},
|
|
26
|
+
]
|
|
27
|
+
: undefined);
|
|
13
28
|
}
|
|
14
29
|
exitTableNameCreate(ctx) {
|
|
15
|
-
this.pushEntity(ctx, EntityContextType.TABLE_CREATE
|
|
30
|
+
this.pushEntity(ctx, EntityContextType.TABLE_CREATE, [
|
|
31
|
+
{
|
|
32
|
+
attrName: AttrName.comment,
|
|
33
|
+
endContextList: [CreateTableContext.name],
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
16
36
|
}
|
|
17
37
|
exitViewName(ctx) {
|
|
18
38
|
this.pushEntity(ctx, EntityContextType.VIEW);
|
|
19
39
|
}
|
|
20
40
|
exitViewNameCreate(ctx) {
|
|
21
|
-
this.pushEntity(ctx, EntityContextType.VIEW_CREATE
|
|
41
|
+
this.pushEntity(ctx, EntityContextType.VIEW_CREATE, [
|
|
42
|
+
{
|
|
43
|
+
attrName: AttrName.comment,
|
|
44
|
+
endContextList: [CreateViewContext.name],
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
22
47
|
}
|
|
23
48
|
exitFunctionNameCreate(ctx) {
|
|
24
49
|
this.pushEntity(ctx, EntityContextType.FUNCTION_CREATE);
|
|
25
50
|
}
|
|
26
51
|
exitColumnNameCreate(ctx) {
|
|
27
|
-
this.pushEntity(ctx, EntityContextType.COLUMN_CREATE
|
|
52
|
+
this.pushEntity(ctx, EntityContextType.COLUMN_CREATE, [
|
|
53
|
+
{
|
|
54
|
+
attrName: AttrName.comment,
|
|
55
|
+
endContextList: [
|
|
56
|
+
CreateOrReplaceTableColTypeContext.name,
|
|
57
|
+
IdentifierCommentContext.name,
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
attrName: AttrName.colType,
|
|
62
|
+
endContextList: [CreateOrReplaceTableColTypeContext.name],
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
28
65
|
}
|
|
29
66
|
/** ===== Statement begin */
|
|
30
67
|
enterSingleStatement(ctx) {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ErrorListener, ParseErrorListener } from '../common/parseErrorListener';
|
|
2
|
+
import { Parser, Token } from 'antlr4ng';
|
|
3
|
+
import { LOCALE_TYPE } from '../common/types';
|
|
4
|
+
export declare class SparkErrorListener extends ParseErrorListener {
|
|
5
|
+
private preferredRules;
|
|
6
|
+
private objectNames;
|
|
7
|
+
constructor(errorListener: ErrorListener, preferredRules: Set<number>, locale: LOCALE_TYPE);
|
|
8
|
+
getExpectedText(parser: Parser, token: Token): string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CodeCompletionCore } from 'antlr4-c3';
|
|
2
|
+
import { ParseErrorListener } from '../common/parseErrorListener';
|
|
3
|
+
import { SparkSqlParser } from '../../lib/spark/SparkSqlParser';
|
|
4
|
+
export class SparkErrorListener extends ParseErrorListener {
|
|
5
|
+
constructor(errorListener, preferredRules, locale) {
|
|
6
|
+
super(errorListener, locale);
|
|
7
|
+
this.objectNames = new Map([
|
|
8
|
+
[SparkSqlParser.RULE_namespaceName, 'namespace'],
|
|
9
|
+
[SparkSqlParser.RULE_namespaceNameCreate, 'namespace'],
|
|
10
|
+
[SparkSqlParser.RULE_tableName, 'table'],
|
|
11
|
+
[SparkSqlParser.RULE_tableNameCreate, 'table'],
|
|
12
|
+
[SparkSqlParser.RULE_viewName, 'view'],
|
|
13
|
+
[SparkSqlParser.RULE_viewNameCreate, 'view'],
|
|
14
|
+
[SparkSqlParser.RULE_functionName, 'function'],
|
|
15
|
+
[SparkSqlParser.RULE_functionNameCreate, 'function'],
|
|
16
|
+
[SparkSqlParser.RULE_columnName, 'column'],
|
|
17
|
+
[SparkSqlParser.RULE_columnNameCreate, 'column'],
|
|
18
|
+
]);
|
|
19
|
+
this.preferredRules = preferredRules;
|
|
20
|
+
}
|
|
21
|
+
getExpectedText(parser, token) {
|
|
22
|
+
var _a;
|
|
23
|
+
let expectedText = '';
|
|
24
|
+
let currentContext = (_a = parser.context) !== null && _a !== void 0 ? _a : undefined;
|
|
25
|
+
while (currentContext === null || currentContext === void 0 ? void 0 : currentContext.parent) {
|
|
26
|
+
currentContext = currentContext.parent;
|
|
27
|
+
}
|
|
28
|
+
const core = new CodeCompletionCore(parser);
|
|
29
|
+
core.preferredRules = this.preferredRules;
|
|
30
|
+
const candidates = core.collectCandidates(token.tokenIndex, currentContext);
|
|
31
|
+
if (candidates.rules.size) {
|
|
32
|
+
const result = [];
|
|
33
|
+
// get expectedText as collect rules first
|
|
34
|
+
for (const candidate of candidates.rules) {
|
|
35
|
+
const [ruleType] = candidate;
|
|
36
|
+
const name = this.objectNames.get(ruleType);
|
|
37
|
+
switch (ruleType) {
|
|
38
|
+
case SparkSqlParser.RULE_namespaceName:
|
|
39
|
+
case SparkSqlParser.RULE_tableName:
|
|
40
|
+
case SparkSqlParser.RULE_viewName:
|
|
41
|
+
case SparkSqlParser.RULE_functionName:
|
|
42
|
+
case SparkSqlParser.RULE_columnName: {
|
|
43
|
+
result.push(`{existing}${name}`);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case SparkSqlParser.RULE_namespaceNameCreate:
|
|
47
|
+
case SparkSqlParser.RULE_tableNameCreate:
|
|
48
|
+
case SparkSqlParser.RULE_functionNameCreate:
|
|
49
|
+
case SparkSqlParser.RULE_viewNameCreate:
|
|
50
|
+
case SparkSqlParser.RULE_columnNameCreate: {
|
|
51
|
+
result.push(`{new}${name}`);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
expectedText = result.join('{or}');
|
|
57
|
+
}
|
|
58
|
+
if (candidates.tokens.size) {
|
|
59
|
+
expectedText += expectedText ? '{orKeyword}' : '{keyword}';
|
|
60
|
+
}
|
|
61
|
+
return expectedText;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -6,12 +6,15 @@ import { BasicSQL } from '../common/basicSQL';
|
|
|
6
6
|
import { Suggestions } from '../common/types';
|
|
7
7
|
import { TrinoSqlSplitListener } from './trinoSplitListener';
|
|
8
8
|
import { TrinoEntityCollector } from './trinoEntityCollector';
|
|
9
|
+
import { ErrorListener } from '../common/parseErrorListener';
|
|
10
|
+
import { TrinoErrorListener } from './trinoErrorListener';
|
|
9
11
|
export { TrinoSqlSplitListener, TrinoEntityCollector };
|
|
10
12
|
export declare class TrinoSQL extends BasicSQL<TrinoSqlLexer, ProgramContext, TrinoSqlParser> {
|
|
11
13
|
protected createLexerFromCharStream(charStreams: CharStream): TrinoSqlLexer;
|
|
12
14
|
protected createParserFromTokenStream(tokenStream: CommonTokenStream): TrinoSqlParser;
|
|
13
15
|
protected get splitListener(): TrinoSqlSplitListener;
|
|
16
|
+
protected createErrorListener(_errorListener: ErrorListener): TrinoErrorListener;
|
|
14
17
|
protected createEntityCollector(input: string, caretTokenIndex?: number): TrinoEntityCollector;
|
|
15
18
|
protected preferredRules: Set<number>;
|
|
16
|
-
protected processCandidates(candidates: CandidatesCollection, allTokens: Token[], caretTokenIndex: number
|
|
19
|
+
protected processCandidates(candidates: CandidatesCollection, allTokens: Token[], caretTokenIndex: number): Suggestions<Token>;
|
|
17
20
|
}
|
|
@@ -4,21 +4,23 @@ import { BasicSQL } from '../common/basicSQL';
|
|
|
4
4
|
import { EntityContextType } from '../common/types';
|
|
5
5
|
import { TrinoSqlSplitListener } from './trinoSplitListener';
|
|
6
6
|
import { TrinoEntityCollector } from './trinoEntityCollector';
|
|
7
|
+
import { TrinoErrorListener } from './trinoErrorListener';
|
|
7
8
|
export { TrinoSqlSplitListener, TrinoEntityCollector };
|
|
8
9
|
export class TrinoSQL extends BasicSQL {
|
|
9
10
|
constructor() {
|
|
10
11
|
super(...arguments);
|
|
11
12
|
this.preferredRules = new Set([
|
|
12
|
-
TrinoSqlParser.
|
|
13
|
+
TrinoSqlParser.RULE_catalogRef,
|
|
13
14
|
TrinoSqlParser.RULE_catalogNameCreate,
|
|
14
|
-
TrinoSqlParser.
|
|
15
|
+
TrinoSqlParser.RULE_schemaRef,
|
|
15
16
|
TrinoSqlParser.RULE_schemaNameCreate,
|
|
16
|
-
TrinoSqlParser.
|
|
17
|
+
TrinoSqlParser.RULE_tableRef,
|
|
17
18
|
TrinoSqlParser.RULE_tableNameCreate,
|
|
18
|
-
TrinoSqlParser.
|
|
19
|
+
TrinoSqlParser.RULE_viewRef,
|
|
19
20
|
TrinoSqlParser.RULE_viewNameCreate,
|
|
20
21
|
TrinoSqlParser.RULE_functionName,
|
|
21
|
-
TrinoSqlParser.
|
|
22
|
+
TrinoSqlParser.RULE_functionNameCreate,
|
|
23
|
+
TrinoSqlParser.RULE_columnRef,
|
|
22
24
|
TrinoSqlParser.RULE_columnNameCreate,
|
|
23
25
|
]);
|
|
24
26
|
}
|
|
@@ -31,23 +33,30 @@ export class TrinoSQL extends BasicSQL {
|
|
|
31
33
|
get splitListener() {
|
|
32
34
|
return new TrinoSqlSplitListener();
|
|
33
35
|
}
|
|
36
|
+
createErrorListener(_errorListener) {
|
|
37
|
+
return new TrinoErrorListener(_errorListener, this.preferredRules, this.locale);
|
|
38
|
+
}
|
|
34
39
|
createEntityCollector(input, caretTokenIndex) {
|
|
35
40
|
return new TrinoEntityCollector(input, caretTokenIndex);
|
|
36
41
|
}
|
|
37
|
-
processCandidates(candidates, allTokens, caretTokenIndex
|
|
42
|
+
processCandidates(candidates, allTokens, caretTokenIndex) {
|
|
38
43
|
const originalSyntaxSuggestions = [];
|
|
39
44
|
const keywords = [];
|
|
40
45
|
for (let candidate of candidates.rules) {
|
|
41
46
|
const [ruleType, candidateRule] = candidate;
|
|
42
|
-
const startTokenIndex = candidateRule.startTokenIndex
|
|
43
|
-
const tokenRanges = allTokens.slice(startTokenIndex, caretTokenIndex +
|
|
47
|
+
const startTokenIndex = candidateRule.startTokenIndex;
|
|
48
|
+
const tokenRanges = allTokens.slice(startTokenIndex, caretTokenIndex + 1);
|
|
44
49
|
let syntaxContextType = void 0;
|
|
45
50
|
switch (ruleType) {
|
|
46
|
-
case TrinoSqlParser.
|
|
51
|
+
case TrinoSqlParser.RULE_catalogRef: {
|
|
47
52
|
syntaxContextType = EntityContextType.CATALOG;
|
|
48
53
|
break;
|
|
49
54
|
}
|
|
50
|
-
case TrinoSqlParser.
|
|
55
|
+
case TrinoSqlParser.RULE_catalogNameCreate: {
|
|
56
|
+
syntaxContextType = EntityContextType.CATALOG_CREATE;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case TrinoSqlParser.RULE_schemaRef: {
|
|
51
60
|
syntaxContextType = EntityContextType.DATABASE;
|
|
52
61
|
break;
|
|
53
62
|
}
|
|
@@ -55,7 +64,7 @@ export class TrinoSQL extends BasicSQL {
|
|
|
55
64
|
syntaxContextType = EntityContextType.DATABASE_CREATE;
|
|
56
65
|
break;
|
|
57
66
|
}
|
|
58
|
-
case TrinoSqlParser.
|
|
67
|
+
case TrinoSqlParser.RULE_tableRef: {
|
|
59
68
|
syntaxContextType = EntityContextType.TABLE;
|
|
60
69
|
break;
|
|
61
70
|
}
|
|
@@ -63,7 +72,7 @@ export class TrinoSQL extends BasicSQL {
|
|
|
63
72
|
syntaxContextType = EntityContextType.TABLE_CREATE;
|
|
64
73
|
break;
|
|
65
74
|
}
|
|
66
|
-
case TrinoSqlParser.
|
|
75
|
+
case TrinoSqlParser.RULE_viewRef: {
|
|
67
76
|
syntaxContextType = EntityContextType.VIEW;
|
|
68
77
|
break;
|
|
69
78
|
}
|
|
@@ -75,11 +84,15 @@ export class TrinoSQL extends BasicSQL {
|
|
|
75
84
|
syntaxContextType = EntityContextType.FUNCTION;
|
|
76
85
|
break;
|
|
77
86
|
}
|
|
87
|
+
case TrinoSqlParser.RULE_functionNameCreate: {
|
|
88
|
+
syntaxContextType = EntityContextType.FUNCTION_CREATE;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
78
91
|
case TrinoSqlParser.RULE_columnNameCreate: {
|
|
79
92
|
syntaxContextType = EntityContextType.COLUMN_CREATE;
|
|
80
93
|
break;
|
|
81
94
|
}
|
|
82
|
-
case TrinoSqlParser.
|
|
95
|
+
case TrinoSqlParser.RULE_columnRef: {
|
|
83
96
|
syntaxContextType = EntityContextType.COLUMN;
|
|
84
97
|
break;
|
|
85
98
|
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import type { ColumnNameCreateContext, CreateMaterializedViewContext, CreateSchemaContext, CreateTableAsSelectContext, CreateTableContext, CreateViewContext, InsertIntoContext, QueryStatementContext, SchemaNameContext, SchemaNameCreateContext, SingleStatementContext, TableNameContext, TableNameCreateContext, ViewNameContext, ViewNameCreateContext } from '../../lib/trino/TrinoSqlParser';
|
|
2
1
|
import type { TrinoSqlListener } from '../../lib/trino/TrinoSqlListener';
|
|
2
|
+
import { CatalogNameCreateContext, CatalogRefContext, ColumnNameCreateContext, CreateMaterializedViewContext, CreateSchemaContext, CreateTableAsSelectContext, CreateTableContext, CreateViewContext, InsertIntoContext, QueryStatementContext, SchemaNameCreateContext, SchemaRefContext, SingleStatementContext, TableNameCreateContext, TableRefContext, ViewNameCreateContext, ViewRefContext } from '../../lib/trino/TrinoSqlParser';
|
|
3
3
|
import { EntityCollector } from '../common/entityCollector';
|
|
4
4
|
export declare class TrinoEntityCollector extends EntityCollector implements TrinoSqlListener {
|
|
5
5
|
/** ====== Entity Begin */
|
|
6
|
-
|
|
6
|
+
exitCatalogRef(ctx: CatalogRefContext): void;
|
|
7
|
+
exitCatalogNameCreate(ctx: CatalogNameCreateContext): void;
|
|
8
|
+
exitSchemaRef(ctx: SchemaRefContext): void;
|
|
7
9
|
exitSchemaNameCreate(ctx: SchemaNameCreateContext): void;
|
|
8
|
-
|
|
10
|
+
exitTableRef(ctx: TableRefContext): void;
|
|
9
11
|
exitTableNameCreate(ctx: TableNameCreateContext): void;
|
|
10
|
-
|
|
12
|
+
exitViewRef(ctx: ViewRefContext): void;
|
|
11
13
|
exitViewNameCreate(ctx: ViewNameCreateContext): void;
|
|
12
14
|
exitColumnNameCreate(ctx: ColumnNameCreateContext): void;
|
|
13
15
|
/** ===== Statement begin */
|
|
@@ -1,27 +1,62 @@
|
|
|
1
|
+
import { AliasedRelationContext, ColumnDefinitionContext, CreateMaterializedViewContext, CreateTableAsSelectContext, CreateTableContext, CreateViewContext, } from '../../lib/trino/TrinoSqlParser';
|
|
2
|
+
import { AttrName, EntityCollector, StmtContextType } from '../common/entityCollector';
|
|
1
3
|
import { EntityContextType } from '../common/types';
|
|
2
|
-
import { StmtContextType, EntityCollector } from '../common/entityCollector';
|
|
3
4
|
export class TrinoEntityCollector extends EntityCollector {
|
|
4
5
|
/** ====== Entity Begin */
|
|
5
|
-
|
|
6
|
+
exitCatalogRef(ctx) {
|
|
7
|
+
this.pushEntity(ctx, EntityContextType.CATALOG);
|
|
8
|
+
}
|
|
9
|
+
exitCatalogNameCreate(ctx) {
|
|
10
|
+
this.pushEntity(ctx, EntityContextType.CATALOG_CREATE);
|
|
11
|
+
}
|
|
12
|
+
exitSchemaRef(ctx) {
|
|
6
13
|
this.pushEntity(ctx, EntityContextType.DATABASE);
|
|
7
14
|
}
|
|
8
15
|
exitSchemaNameCreate(ctx) {
|
|
9
16
|
this.pushEntity(ctx, EntityContextType.DATABASE_CREATE);
|
|
10
17
|
}
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
exitTableRef(ctx) {
|
|
19
|
+
var _a;
|
|
20
|
+
const needCollectAttr = ((_a = this.getRootStmt()) === null || _a === void 0 ? void 0 : _a.stmtContextType) === StmtContextType.SELECT_STMT;
|
|
21
|
+
this.pushEntity(ctx, EntityContextType.TABLE, needCollectAttr
|
|
22
|
+
? [
|
|
23
|
+
{
|
|
24
|
+
attrName: AttrName.alias,
|
|
25
|
+
endContextList: [AliasedRelationContext.name],
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
: undefined);
|
|
13
29
|
}
|
|
14
30
|
exitTableNameCreate(ctx) {
|
|
15
|
-
this.pushEntity(ctx, EntityContextType.TABLE_CREATE
|
|
16
|
-
|
|
17
|
-
|
|
31
|
+
this.pushEntity(ctx, EntityContextType.TABLE_CREATE, [
|
|
32
|
+
{
|
|
33
|
+
attrName: AttrName.comment,
|
|
34
|
+
endContextList: [CreateTableContext.name, CreateTableAsSelectContext.name],
|
|
35
|
+
},
|
|
36
|
+
]);
|
|
37
|
+
}
|
|
38
|
+
exitViewRef(ctx) {
|
|
18
39
|
this.pushEntity(ctx, EntityContextType.VIEW);
|
|
19
40
|
}
|
|
20
41
|
exitViewNameCreate(ctx) {
|
|
21
|
-
this.pushEntity(ctx, EntityContextType.VIEW_CREATE
|
|
42
|
+
this.pushEntity(ctx, EntityContextType.VIEW_CREATE, [
|
|
43
|
+
{
|
|
44
|
+
attrName: AttrName.comment,
|
|
45
|
+
endContextList: [CreateMaterializedViewContext.name, CreateViewContext.name],
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
22
48
|
}
|
|
23
49
|
exitColumnNameCreate(ctx) {
|
|
24
|
-
this.pushEntity(ctx, EntityContextType.COLUMN_CREATE
|
|
50
|
+
this.pushEntity(ctx, EntityContextType.COLUMN_CREATE, [
|
|
51
|
+
{
|
|
52
|
+
attrName: AttrName.colType,
|
|
53
|
+
endContextList: [ColumnDefinitionContext.name],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
attrName: AttrName.comment,
|
|
57
|
+
endContextList: [ColumnDefinitionContext.name],
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
25
60
|
}
|
|
26
61
|
/** ===== Statement begin */
|
|
27
62
|
enterSingleStatement(ctx) {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Parser, Token } from 'antlr4ng';
|
|
2
|
+
import { ErrorListener, ParseErrorListener } from '../common/parseErrorListener';
|
|
3
|
+
import { LOCALE_TYPE } from '../common/types';
|
|
4
|
+
export declare class TrinoErrorListener extends ParseErrorListener {
|
|
5
|
+
private preferredRules;
|
|
6
|
+
private objectNames;
|
|
7
|
+
constructor(errorListener: ErrorListener, preferredRules: Set<number>, locale: LOCALE_TYPE);
|
|
8
|
+
getExpectedText(parser: Parser, token: Token): string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { CodeCompletionCore } from 'antlr4-c3';
|
|
2
|
+
import { TrinoSqlParser } from '../../lib/trino/TrinoSqlParser';
|
|
3
|
+
import { ParseErrorListener } from '../common/parseErrorListener';
|
|
4
|
+
export class TrinoErrorListener extends ParseErrorListener {
|
|
5
|
+
constructor(errorListener, preferredRules, locale) {
|
|
6
|
+
super(errorListener, locale);
|
|
7
|
+
this.objectNames = new Map([
|
|
8
|
+
[TrinoSqlParser.RULE_catalogRef, 'catalog'],
|
|
9
|
+
[TrinoSqlParser.RULE_catalogNameCreate, 'catalog'],
|
|
10
|
+
[TrinoSqlParser.RULE_tableRef, 'table'],
|
|
11
|
+
[TrinoSqlParser.RULE_tableNameCreate, 'table'],
|
|
12
|
+
[TrinoSqlParser.RULE_viewRef, 'view'],
|
|
13
|
+
[TrinoSqlParser.RULE_viewNameCreate, 'view'],
|
|
14
|
+
[TrinoSqlParser.RULE_schemaRef, 'schema'],
|
|
15
|
+
[TrinoSqlParser.RULE_schemaNameCreate, 'schema'],
|
|
16
|
+
[TrinoSqlParser.RULE_functionName, 'function'],
|
|
17
|
+
[TrinoSqlParser.RULE_columnRef, 'column'],
|
|
18
|
+
[TrinoSqlParser.RULE_columnNameCreate, 'column'],
|
|
19
|
+
]);
|
|
20
|
+
this.preferredRules = preferredRules;
|
|
21
|
+
}
|
|
22
|
+
getExpectedText(parser, token) {
|
|
23
|
+
var _a;
|
|
24
|
+
let expectedText = '';
|
|
25
|
+
let currentContext = (_a = parser.context) !== null && _a !== void 0 ? _a : undefined;
|
|
26
|
+
while (currentContext === null || currentContext === void 0 ? void 0 : currentContext.parent) {
|
|
27
|
+
currentContext = currentContext.parent;
|
|
28
|
+
}
|
|
29
|
+
const core = new CodeCompletionCore(parser);
|
|
30
|
+
core.preferredRules = this.preferredRules;
|
|
31
|
+
const candidates = core.collectCandidates(token.tokenIndex, currentContext);
|
|
32
|
+
if (candidates.rules.size) {
|
|
33
|
+
const result = [];
|
|
34
|
+
// get expectedText as collect rules first
|
|
35
|
+
for (const candidate of candidates.rules) {
|
|
36
|
+
const [ruleType] = candidate;
|
|
37
|
+
const name = this.objectNames.get(ruleType);
|
|
38
|
+
switch (ruleType) {
|
|
39
|
+
case TrinoSqlParser.RULE_catalogRef:
|
|
40
|
+
case TrinoSqlParser.RULE_schemaRef:
|
|
41
|
+
case TrinoSqlParser.RULE_tableRef:
|
|
42
|
+
case TrinoSqlParser.RULE_viewRef:
|
|
43
|
+
case TrinoSqlParser.RULE_functionName:
|
|
44
|
+
case TrinoSqlParser.RULE_columnRef: {
|
|
45
|
+
result.push(`{existing}${name}`);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case TrinoSqlParser.RULE_catalogNameCreate:
|
|
49
|
+
case TrinoSqlParser.RULE_tableNameCreate:
|
|
50
|
+
case TrinoSqlParser.RULE_schemaNameCreate:
|
|
51
|
+
case TrinoSqlParser.RULE_viewNameCreate:
|
|
52
|
+
case TrinoSqlParser.RULE_tableNameCreate: {
|
|
53
|
+
result.push(`{new}${name}`);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
expectedText = result.join('{or}');
|
|
59
|
+
}
|
|
60
|
+
if (candidates.tokens.size) {
|
|
61
|
+
expectedText += expectedText ? '{orKeyword}' : '{keyword}';
|
|
62
|
+
}
|
|
63
|
+
return expectedText;
|
|
64
|
+
}
|
|
65
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dt-sql-parser",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.1.0-beta.1",
|
|
4
4
|
"authors": "DTStack Corporation",
|
|
5
5
|
"description": "SQL Parsers for BigData, built with antlr4",
|
|
6
6
|
"keywords": [
|
|
7
|
+
"antlr4",
|
|
7
8
|
"sql",
|
|
8
9
|
"parser",
|
|
9
|
-
"
|
|
10
|
+
"code-completion",
|
|
10
11
|
"hive",
|
|
11
12
|
"spark",
|
|
12
13
|
"flink",
|
|
13
|
-
"
|
|
14
|
+
"mysql",
|
|
15
|
+
"postgresql",
|
|
16
|
+
"trino",
|
|
17
|
+
"impala"
|
|
14
18
|
],
|
|
15
19
|
"main": "dist/index.js",
|
|
16
20
|
"module": "dist/index.js",
|
|
@@ -26,13 +30,17 @@
|
|
|
26
30
|
"check-types": "tsc -p ./tsconfig.json && tsc -p ./test/tsconfig.json",
|
|
27
31
|
"test": "NODE_OPTIONS=--max_old_space_size=4096 && jest",
|
|
28
32
|
"release": "node ./scripts/release.js",
|
|
29
|
-
"
|
|
30
|
-
"
|
|
33
|
+
"prettier-check": "prettier --check .",
|
|
34
|
+
"format": "prettier --write .",
|
|
31
35
|
"format-g4": "antlr-format -c ./antlr.format.json -v ./src/grammar/**/*.g4",
|
|
32
36
|
"cleanComment": "node ./scripts/cleanCommentCli.js",
|
|
33
37
|
"benchmark": "node --no-warnings ./scripts/benchmark.js"
|
|
34
38
|
},
|
|
35
39
|
"license": "MIT",
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"antlr4-c3": "3.3.7",
|
|
42
|
+
"antlr4ng": "2.0.11"
|
|
43
|
+
},
|
|
36
44
|
"devDependencies": {
|
|
37
45
|
"@commitlint/cli": "^17.7.2",
|
|
38
46
|
"@commitlint/config-conventional": "^17.7.0",
|
|
@@ -53,19 +61,35 @@
|
|
|
53
61
|
"jest": "^29.5.0",
|
|
54
62
|
"lint-staged": "12.5.0",
|
|
55
63
|
"prettier": "^3.0.3",
|
|
64
|
+
"semver": "^7.6.2",
|
|
56
65
|
"standard-version": "^9.5.0",
|
|
57
66
|
"tsx": "^4.7.1",
|
|
58
67
|
"typescript": "^5.0.4",
|
|
59
68
|
"yargs-parser": "^21.1.1"
|
|
60
69
|
},
|
|
61
|
-
"
|
|
62
|
-
|
|
70
|
+
"repository": {
|
|
71
|
+
"type": "git",
|
|
72
|
+
"url": "https://github.com/DTStack/dt-sql-parser.git"
|
|
73
|
+
},
|
|
63
74
|
"publishConfig": {
|
|
64
75
|
"registry": "https://registry.npmjs.org/"
|
|
65
76
|
},
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
"
|
|
77
|
+
"sideEffects": false,
|
|
78
|
+
"engines": {
|
|
79
|
+
"node": ">=18"
|
|
80
|
+
},
|
|
81
|
+
"packageManager": "pnpm@9.7.0",
|
|
82
|
+
"config": {
|
|
83
|
+
"commitizen": {
|
|
84
|
+
"path": "./node_modules/@commitlint/cz-commitlint"
|
|
85
|
+
}
|
|
69
86
|
},
|
|
70
|
-
"
|
|
87
|
+
"lint-staged": {
|
|
88
|
+
"*": [
|
|
89
|
+
"prettier --write --ignore-unknown"
|
|
90
|
+
],
|
|
91
|
+
"*.g4": [
|
|
92
|
+
"antlr-format -c ./antlr.format.json -v"
|
|
93
|
+
]
|
|
94
|
+
}
|
|
71
95
|
}
|