dt-sql-parser 4.0.0-beta.4.1 → 4.0.0-beta.4.3
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 +124 -43
- package/dist/index.d.ts +5 -5
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/flinksql/FlinkSqlLexer.d.ts +202 -201
- package/dist/lib/flinksql/FlinkSqlLexer.js +2003 -1996
- package/dist/lib/flinksql/FlinkSqlLexer.js.map +1 -1
- package/dist/lib/flinksql/FlinkSqlParser.d.ts +328 -265
- package/dist/lib/flinksql/FlinkSqlParser.js +3712 -3076
- package/dist/lib/flinksql/FlinkSqlParser.js.map +1 -1
- package/dist/lib/flinksql/FlinkSqlParserListener.d.ts +44 -0
- package/dist/lib/flinksql/FlinkSqlParserVisitor.d.ts +28 -0
- package/dist/lib/hive/HiveSqlLexer.d.ts +365 -351
- package/dist/lib/hive/HiveSqlLexer.js +2494 -2457
- package/dist/lib/hive/HiveSqlLexer.js.map +1 -1
- package/dist/lib/hive/{HiveSql.d.ts → HiveSqlParser.d.ts} +2791 -2463
- package/dist/lib/hive/{HiveSql.js → HiveSqlParser.js} +18554 -16800
- package/dist/lib/hive/HiveSqlParser.js.map +1 -0
- package/dist/lib/hive/{HiveSqlListener.d.ts → HiveSqlParserListener.d.ts} +1759 -1517
- package/dist/lib/hive/HiveSqlParserListener.js +3 -0
- package/dist/lib/hive/HiveSqlParserListener.js.map +1 -0
- package/dist/lib/hive/{HiveSqlVisitor.d.ts → HiveSqlParserVisitor.d.ts} +1165 -1011
- package/dist/lib/hive/HiveSqlParserVisitor.js +3 -0
- package/dist/lib/hive/HiveSqlParserVisitor.js.map +1 -0
- package/dist/lib/pgsql/PostgreSQLLexerBase.js +0 -4
- package/dist/lib/pgsql/PostgreSQLLexerBase.js.map +1 -1
- package/dist/lib/pgsql/PostgreSQLParserBase.js +0 -6
- package/dist/lib/pgsql/PostgreSQLParserBase.js.map +1 -1
- package/dist/lib/spark/SparkSqlLexer.d.ts +398 -322
- package/dist/lib/spark/SparkSqlLexer.js +2302 -1738
- package/dist/lib/spark/SparkSqlLexer.js.map +1 -1
- package/dist/lib/spark/SparkSqlParser.d.ts +3319 -3314
- package/dist/lib/spark/SparkSqlParser.js +18718 -16132
- package/dist/lib/spark/SparkSqlParser.js.map +1 -1
- package/dist/lib/spark/SparkSqlParserListener.d.ts +2130 -0
- package/dist/lib/spark/SparkSqlParserListener.js +3 -0
- package/dist/lib/spark/SparkSqlParserListener.js.map +1 -0
- package/dist/lib/spark/SparkSqlParserVisitor.d.ts +1361 -0
- package/dist/lib/spark/SparkSqlParserVisitor.js +3 -0
- package/dist/lib/spark/SparkSqlParserVisitor.js.map +1 -0
- package/dist/parser/common/basic-parser-types.d.ts +16 -3
- package/dist/parser/common/basic-parser-types.js +12 -2
- package/dist/parser/common/basic-parser-types.js.map +1 -1
- package/dist/parser/common/basicParser.d.ts +27 -28
- package/dist/parser/common/basicParser.js +76 -60
- package/dist/parser/common/basicParser.js.map +1 -1
- package/dist/parser/common/parseErrorListener.d.ts +33 -0
- package/dist/parser/common/parseErrorListener.js +28 -0
- package/dist/parser/common/parseErrorListener.js.map +1 -0
- package/dist/parser/flinksql.d.ts +1 -1
- package/dist/parser/flinksql.js +32 -13
- package/dist/parser/flinksql.js.map +1 -1
- package/dist/parser/generic.js +1 -1
- package/dist/parser/generic.js.map +1 -1
- package/dist/parser/hive.d.ts +12 -5
- package/dist/parser/hive.js +91 -7
- package/dist/parser/hive.js.map +1 -1
- package/dist/parser/index.d.ts +1 -0
- package/dist/parser/index.js +1 -0
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/pgsql.js +1 -1
- package/dist/parser/pgsql.js.map +1 -1
- package/dist/parser/plsql.js +1 -1
- package/dist/parser/plsql.js.map +1 -1
- package/dist/parser/spark.d.ts +10 -3
- package/dist/parser/spark.js +90 -7
- package/dist/parser/spark.js.map +1 -1
- package/dist/parser/trinosql.js +1 -1
- package/dist/parser/trinosql.js.map +1 -1
- package/dist/utils/findCaretTokenIndex.d.ts +2 -2
- package/dist/utils/findCaretTokenIndex.js +5 -4
- package/dist/utils/findCaretTokenIndex.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/token.d.ts +2 -2
- package/dist/utils/token.js +2 -2
- package/dist/utils/token.js.map +1 -1
- package/package.json +16 -9
- package/dist/lib/hive/HiveSql.js.map +0 -1
- package/dist/lib/hive/HiveSqlListener.js +0 -3
- package/dist/lib/hive/HiveSqlListener.js.map +0 -1
- package/dist/lib/hive/HiveSqlVisitor.js +0 -3
- package/dist/lib/hive/HiveSqlVisitor.js.map +0 -1
- package/dist/lib/spark/SparkSqlListener.d.ts +0 -3516
- package/dist/lib/spark/SparkSqlListener.js +0 -3
- package/dist/lib/spark/SparkSqlListener.js.map +0 -1
- package/dist/lib/spark/SparkSqlVisitor.d.ts +0 -2201
- package/dist/lib/spark/SparkSqlVisitor.js +0 -3
- package/dist/lib/spark/SparkSqlVisitor.js.map +0 -1
- package/dist/parser/common/parserErrorListener.d.ts +0 -30
- package/dist/parser/common/parserErrorListener.js +0 -62
- package/dist/parser/common/parserErrorListener.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SparkSqlParserVisitor.js","sourceRoot":"","sources":["../../../src/lib/spark/SparkSqlParserVisitor.ts"],"names":[],"mappings":"AAAA,iIAAiI"}
|
|
@@ -14,14 +14,24 @@ export interface CaretPosition {
|
|
|
14
14
|
export declare enum SyntaxContextType {
|
|
15
15
|
/** catalog name */
|
|
16
16
|
CATALOG = "catalog",
|
|
17
|
+
/** catalog name that will be created */
|
|
18
|
+
CATALOG_CREATE = "catalogCreate",
|
|
17
19
|
/** database name path, such as catalog.db */
|
|
18
20
|
DATABASE = "database",
|
|
19
|
-
/** database name path will be created */
|
|
21
|
+
/** database name path that will be created */
|
|
20
22
|
DATABASE_CREATE = "databaseCreate",
|
|
21
23
|
/** table name path, such as catalog.db.tb */
|
|
22
24
|
TABLE = "table",
|
|
23
|
-
/** table name path will be created */
|
|
24
|
-
TABLE_CREATE = "tableCreate"
|
|
25
|
+
/** table name path that will be created */
|
|
26
|
+
TABLE_CREATE = "tableCreate",
|
|
27
|
+
/** view name path, such as db.tb.view */
|
|
28
|
+
VIEW = "view",
|
|
29
|
+
/** view name path that will be created */
|
|
30
|
+
VIEW_CREATE = "viewCreate",
|
|
31
|
+
/** function name */
|
|
32
|
+
FUNCTION = "function",
|
|
33
|
+
/** function name that will be created */
|
|
34
|
+
FUNCTION_CREATE = "functionCreate"
|
|
25
35
|
}
|
|
26
36
|
export interface WordRange {
|
|
27
37
|
/** content of word */
|
|
@@ -56,10 +66,13 @@ export interface Suggestions<T = WordRange> {
|
|
|
56
66
|
keywords: string[];
|
|
57
67
|
}
|
|
58
68
|
export interface TextSlice {
|
|
69
|
+
/** start at 0 */
|
|
59
70
|
startIndex: number;
|
|
60
71
|
endIndex: number;
|
|
72
|
+
/** start at 1 */
|
|
61
73
|
startLine: number;
|
|
62
74
|
endLine: number;
|
|
75
|
+
/** start at 1 */
|
|
63
76
|
startColumn: number;
|
|
64
77
|
endColumn: number;
|
|
65
78
|
text: string;
|
|
@@ -5,13 +5,23 @@ export var SyntaxContextType;
|
|
|
5
5
|
(function (SyntaxContextType) {
|
|
6
6
|
/** catalog name */
|
|
7
7
|
SyntaxContextType["CATALOG"] = "catalog";
|
|
8
|
+
/** catalog name that will be created */
|
|
9
|
+
SyntaxContextType["CATALOG_CREATE"] = "catalogCreate";
|
|
8
10
|
/** database name path, such as catalog.db */
|
|
9
11
|
SyntaxContextType["DATABASE"] = "database";
|
|
10
|
-
/** database name path will be created */
|
|
12
|
+
/** database name path that will be created */
|
|
11
13
|
SyntaxContextType["DATABASE_CREATE"] = "databaseCreate";
|
|
12
14
|
/** table name path, such as catalog.db.tb */
|
|
13
15
|
SyntaxContextType["TABLE"] = "table";
|
|
14
|
-
/** table name path will be created */
|
|
16
|
+
/** table name path that will be created */
|
|
15
17
|
SyntaxContextType["TABLE_CREATE"] = "tableCreate";
|
|
18
|
+
/** view name path, such as db.tb.view */
|
|
19
|
+
SyntaxContextType["VIEW"] = "view";
|
|
20
|
+
/** view name path that will be created */
|
|
21
|
+
SyntaxContextType["VIEW_CREATE"] = "viewCreate";
|
|
22
|
+
/** function name */
|
|
23
|
+
SyntaxContextType["FUNCTION"] = "function";
|
|
24
|
+
/** function name that will be created */
|
|
25
|
+
SyntaxContextType["FUNCTION_CREATE"] = "functionCreate";
|
|
16
26
|
})(SyntaxContextType || (SyntaxContextType = {}));
|
|
17
27
|
//# sourceMappingURL=basic-parser-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basic-parser-types.js","sourceRoot":"","sources":["../../../src/parser/common/basic-parser-types.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"basic-parser-types.js","sourceRoot":"","sources":["../../../src/parser/common/basic-parser-types.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,CAAN,IAAY,iBAqBX;AArBD,WAAY,iBAAiB;IACzB,mBAAmB;IACnB,wCAAmB,CAAA;IACnB,yCAAyC;IACzC,qDAAgC,CAAA;IAChC,6CAA6C;IAC7C,0CAAqB,CAAA;IACrB,+CAA+C;IAC/C,uDAAkC,CAAA;IAClC,6CAA6C;IAC7C,oCAAe,CAAA;IACf,2CAA2C;IAC3C,iDAA4B,CAAA;IAC5B,yCAAyC;IACzC,kCAAa,CAAA;IACb,0CAA0C;IAC1C,+CAA0B,CAAA;IAC1B,oBAAoB;IACpB,0CAAqB,CAAA;IACrB,yCAAyC;IACzC,uDAAkC,CAAA;AACtC,CAAC,EArBW,iBAAiB,KAAjB,iBAAiB,QAqB5B"}
|
|
@@ -2,7 +2,7 @@ import { Parser, Lexer, Token, CommonTokenStream, CodePointCharStream, ParserRul
|
|
|
2
2
|
import { ParseTreeListener } from 'antlr4ts/tree';
|
|
3
3
|
import { CandidatesCollection } from 'antlr4-c3';
|
|
4
4
|
import { CaretPosition, Suggestions, TextSlice } from './basic-parser-types';
|
|
5
|
-
import {
|
|
5
|
+
import { ParseError, ErrorHandler } from './parseErrorListener';
|
|
6
6
|
interface IParser<IParserRuleContext extends ParserRuleContext> extends Parser {
|
|
7
7
|
program(): IParserRuleContext;
|
|
8
8
|
}
|
|
@@ -13,19 +13,22 @@ interface SplitListener extends ParseTreeListener {
|
|
|
13
13
|
* Custom Parser class, subclass needs extends it.
|
|
14
14
|
*/
|
|
15
15
|
export default abstract class BasicParser<L extends Lexer = Lexer, PRC extends ParserRuleContext = ParserRuleContext, P extends IParser<PRC> = IParser<PRC>> {
|
|
16
|
+
/** members for cache start */
|
|
16
17
|
protected _charStreams: CodePointCharStream;
|
|
17
18
|
protected _lexer: L;
|
|
18
19
|
protected _tokenStream: CommonTokenStream;
|
|
19
20
|
protected _parser: P;
|
|
20
|
-
protected
|
|
21
|
-
protected _errorCollector: ParserErrorCollector;
|
|
21
|
+
protected _parseTree: PRC;
|
|
22
22
|
protected _parsedInput: string;
|
|
23
|
+
protected _parseErrors: ParseError[];
|
|
24
|
+
/** members for cache end */
|
|
25
|
+
private _errorHandler;
|
|
23
26
|
/**
|
|
24
27
|
* PreferredRules for antlr4-c3
|
|
25
28
|
*/
|
|
26
29
|
protected abstract preferredRules: Set<number>;
|
|
27
30
|
/**
|
|
28
|
-
* Create a
|
|
31
|
+
* Create a antlr4 Lexer instance.
|
|
29
32
|
* @param input source string
|
|
30
33
|
*/
|
|
31
34
|
protected abstract createLexerFormCharStream(charStreams: CodePointCharStream): L;
|
|
@@ -39,8 +42,7 @@ export default abstract class BasicParser<L extends Lexer = Lexer, PRC extends P
|
|
|
39
42
|
* @param candidates candidate list
|
|
40
43
|
* @param allTokens all tokens from input
|
|
41
44
|
* @param caretTokenIndex tokenIndex of caretPosition
|
|
42
|
-
* @param tokenIndexOffset offset of the tokenIndex in the candidates
|
|
43
|
-
* compared to the tokenIndex in allTokens
|
|
45
|
+
* @param tokenIndexOffset offset of the tokenIndex in the candidates compared to the tokenIndex in allTokens
|
|
44
46
|
*/
|
|
45
47
|
protected abstract processCandidates(candidates: CandidatesCollection, allTokens: Token[], caretTokenIndex: number, tokenIndexOffset: number): Suggestions<Token>;
|
|
46
48
|
/**
|
|
@@ -48,57 +50,54 @@ export default abstract class BasicParser<L extends Lexer = Lexer, PRC extends P
|
|
|
48
50
|
*/
|
|
49
51
|
protected abstract get splitListener(): SplitListener;
|
|
50
52
|
/**
|
|
51
|
-
* Create an
|
|
53
|
+
* Create an antlr4 lexer from input.
|
|
52
54
|
* @param input string
|
|
53
55
|
*/
|
|
54
|
-
createLexer(input: string): L;
|
|
56
|
+
createLexer(input: string, errorListener?: ErrorHandler<any>): L;
|
|
55
57
|
/**
|
|
56
|
-
* Create an
|
|
58
|
+
* Create an antlr4 parser from input.
|
|
57
59
|
* @param input string
|
|
58
60
|
*/
|
|
59
|
-
createParser(input: string): P;
|
|
61
|
+
createParser(input: string, errorListener?: ErrorHandler<any>): P;
|
|
60
62
|
/**
|
|
61
|
-
*
|
|
63
|
+
* Parse input string and return parseTree.
|
|
64
|
+
* @param input string
|
|
65
|
+
* @param errorListener listen parse errors and lexer errors.
|
|
66
|
+
* @returns parseTree
|
|
67
|
+
*/
|
|
68
|
+
parse(input: string, errorListener?: ErrorHandler<any>): PRC;
|
|
69
|
+
/**
|
|
70
|
+
* Create an antlr4 parser from input.
|
|
62
71
|
* And the instances will be cache.
|
|
63
72
|
* @param input string
|
|
64
73
|
*/
|
|
65
|
-
|
|
74
|
+
private createParserWithCache;
|
|
66
75
|
/**
|
|
67
76
|
* If it is invoked multiple times in a row and the input parameters is the same,
|
|
68
77
|
* this method returns the parsing result directly for the first time
|
|
69
78
|
* unless the errorListener parameter is passed.
|
|
70
79
|
* @param input source string
|
|
71
80
|
* @param errorListener listen errors
|
|
72
|
-
* @returns
|
|
81
|
+
* @returns parseTree
|
|
73
82
|
*/
|
|
74
|
-
|
|
83
|
+
private parseWithCache;
|
|
75
84
|
/**
|
|
76
85
|
* Validate input string and return syntax errors if exists.
|
|
77
86
|
* @param input source string
|
|
78
87
|
* @returns syntax errors
|
|
79
88
|
*/
|
|
80
|
-
validate(input: string):
|
|
89
|
+
validate(input: string): ParseError[];
|
|
81
90
|
/**
|
|
82
|
-
* Get all Tokens of input string,'<EOF>' is not included
|
|
91
|
+
* Get all Tokens of input string,'<EOF>' is not included.
|
|
83
92
|
* @param input source string
|
|
84
93
|
* @returns Token[]
|
|
85
94
|
*/
|
|
86
95
|
getAllTokens(input: string): Token[];
|
|
87
|
-
/**
|
|
88
|
-
* It convert tree to string, it's convenient to use in unit test.
|
|
89
|
-
* @param string input
|
|
90
|
-
*/
|
|
91
|
-
parserTreeToString(input: string): string;
|
|
92
|
-
/**
|
|
93
|
-
* Get List-like style tree string
|
|
94
|
-
* @param parserTree ProgramRuleContext
|
|
95
|
-
*/
|
|
96
|
-
toString(parserTree: PRC): string;
|
|
97
96
|
/**
|
|
98
97
|
* @param listener Listener instance extends ParserListener
|
|
99
|
-
* @param
|
|
98
|
+
* @param parseTree parser Tree
|
|
100
99
|
*/
|
|
101
|
-
listen<PTL extends ParseTreeListener = ParseTreeListener>(listener: PTL,
|
|
100
|
+
listen<PTL extends ParseTreeListener = ParseTreeListener>(listener: PTL, parseTree: PRC): void;
|
|
102
101
|
/**
|
|
103
102
|
* Split input into statements.
|
|
104
103
|
* If exist syntax error it will return null.
|
|
@@ -1,45 +1,75 @@
|
|
|
1
|
-
import { CharStreams, CommonTokenStream } from 'antlr4ts';
|
|
1
|
+
import { CharStreams, CommonTokenStream, } from 'antlr4ts';
|
|
2
2
|
import { ParseTreeWalker } from 'antlr4ts/tree';
|
|
3
3
|
import { CodeCompletionCore } from 'antlr4-c3';
|
|
4
4
|
import { findCaretTokenIndex } from '../../utils/findCaretTokenIndex';
|
|
5
|
-
import
|
|
5
|
+
import ParseErrorListener from './parseErrorListener';
|
|
6
6
|
/**
|
|
7
7
|
* Custom Parser class, subclass needs extends it.
|
|
8
8
|
*/
|
|
9
9
|
export default class BasicParser {
|
|
10
10
|
constructor() {
|
|
11
|
-
this._errorCollector = new ParserErrorCollector();
|
|
12
11
|
this._parsedInput = null;
|
|
12
|
+
this._parseErrors = [];
|
|
13
|
+
/** members for cache end */
|
|
14
|
+
this._errorHandler = (error) => {
|
|
15
|
+
this._parseErrors.push(error);
|
|
16
|
+
};
|
|
13
17
|
}
|
|
14
18
|
/**
|
|
15
|
-
* Create an
|
|
19
|
+
* Create an antlr4 lexer from input.
|
|
16
20
|
* @param input string
|
|
17
21
|
*/
|
|
18
|
-
createLexer(input) {
|
|
22
|
+
createLexer(input, errorListener) {
|
|
19
23
|
const charStreams = CharStreams.fromString(input.toUpperCase());
|
|
20
24
|
const lexer = this.createLexerFormCharStream(charStreams);
|
|
25
|
+
if (errorListener) {
|
|
26
|
+
lexer.removeErrorListeners();
|
|
27
|
+
lexer.addErrorListener(new ParseErrorListener(errorListener));
|
|
28
|
+
}
|
|
21
29
|
return lexer;
|
|
22
30
|
}
|
|
23
31
|
/**
|
|
24
|
-
* Create an
|
|
32
|
+
* Create an antlr4 parser from input.
|
|
25
33
|
* @param input string
|
|
26
34
|
*/
|
|
27
|
-
createParser(input) {
|
|
28
|
-
const lexer = this.createLexer(input);
|
|
35
|
+
createParser(input, errorListener) {
|
|
36
|
+
const lexer = this.createLexer(input, errorListener);
|
|
29
37
|
const tokenStream = new CommonTokenStream(lexer);
|
|
30
38
|
const parser = this.createParserFromTokenStream(tokenStream);
|
|
39
|
+
if (errorListener) {
|
|
40
|
+
parser.removeErrorListeners();
|
|
41
|
+
parser.addErrorListener(new ParseErrorListener(errorListener));
|
|
42
|
+
}
|
|
31
43
|
return parser;
|
|
32
44
|
}
|
|
33
45
|
/**
|
|
34
|
-
*
|
|
46
|
+
* Parse input string and return parseTree.
|
|
47
|
+
* @param input string
|
|
48
|
+
* @param errorListener listen parse errors and lexer errors.
|
|
49
|
+
* @returns parseTree
|
|
50
|
+
*/
|
|
51
|
+
parse(input, errorListener) {
|
|
52
|
+
const parser = this.createParser(input, errorListener);
|
|
53
|
+
parser.buildParseTree = true;
|
|
54
|
+
return parser.program();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create an antlr4 parser from input.
|
|
35
58
|
* And the instances will be cache.
|
|
36
59
|
* @param input string
|
|
37
60
|
*/
|
|
38
61
|
createParserWithCache(input) {
|
|
39
|
-
this.
|
|
62
|
+
this._parseTree = null;
|
|
40
63
|
this._charStreams = CharStreams.fromString(input.toUpperCase());
|
|
41
64
|
this._lexer = this.createLexerFormCharStream(this._charStreams);
|
|
65
|
+
this._lexer.removeErrorListeners();
|
|
66
|
+
this._lexer.addErrorListener(new ParseErrorListener(this._errorHandler));
|
|
42
67
|
this._tokenStream = new CommonTokenStream(this._lexer);
|
|
68
|
+
/**
|
|
69
|
+
* All tokens are generated in advance.
|
|
70
|
+
* This can cause performance degradation, but it seems necessary for now.
|
|
71
|
+
* Because the tokens will be used multiple times.
|
|
72
|
+
*/
|
|
43
73
|
this._tokenStream.fill();
|
|
44
74
|
this._parser = this.createParserFromTokenStream(this._tokenStream);
|
|
45
75
|
this._parser.buildParseTree = true;
|
|
@@ -51,23 +81,20 @@ export default class BasicParser {
|
|
|
51
81
|
* unless the errorListener parameter is passed.
|
|
52
82
|
* @param input source string
|
|
53
83
|
* @param errorListener listen errors
|
|
54
|
-
* @returns
|
|
84
|
+
* @returns parseTree
|
|
55
85
|
*/
|
|
56
|
-
|
|
86
|
+
parseWithCache(input, errorListener) {
|
|
57
87
|
// Avoid parsing the same input repeatedly.
|
|
58
88
|
if (this._parsedInput === input && !errorListener) {
|
|
59
|
-
return;
|
|
89
|
+
return this._parseTree;
|
|
60
90
|
}
|
|
91
|
+
this._parseErrors = [];
|
|
61
92
|
const parser = this.createParserWithCache(input);
|
|
62
93
|
this._parsedInput = input;
|
|
63
94
|
parser.removeErrorListeners();
|
|
64
|
-
this.
|
|
65
|
-
parser.
|
|
66
|
-
|
|
67
|
-
parser.addErrorListener(new ParserErrorListener(errorListener));
|
|
68
|
-
}
|
|
69
|
-
this._parserTree = parser.program();
|
|
70
|
-
return this._parserTree;
|
|
95
|
+
parser.addErrorListener(new ParseErrorListener(this._errorHandler));
|
|
96
|
+
this._parseTree = parser.program();
|
|
97
|
+
return this._parseTree;
|
|
71
98
|
}
|
|
72
99
|
/**
|
|
73
100
|
* Validate input string and return syntax errors if exists.
|
|
@@ -75,45 +102,28 @@ export default class BasicParser {
|
|
|
75
102
|
* @returns syntax errors
|
|
76
103
|
*/
|
|
77
104
|
validate(input) {
|
|
78
|
-
this.
|
|
79
|
-
|
|
80
|
-
return lexerError.concat(this._errorCollector.parserErrors);
|
|
105
|
+
this.parseWithCache(input);
|
|
106
|
+
return this._parseErrors;
|
|
81
107
|
}
|
|
82
108
|
/**
|
|
83
|
-
* Get all Tokens of input string,'<EOF>' is not included
|
|
109
|
+
* Get all Tokens of input string,'<EOF>' is not included.
|
|
84
110
|
* @param input source string
|
|
85
111
|
* @returns Token[]
|
|
86
112
|
*/
|
|
87
113
|
getAllTokens(input) {
|
|
88
|
-
this.
|
|
114
|
+
this.parseWithCache(input);
|
|
89
115
|
let allTokens = this._tokenStream.getTokens();
|
|
90
116
|
if (allTokens[allTokens.length - 1].text === '<EOF>') {
|
|
91
117
|
allTokens = allTokens.slice(0, -1);
|
|
92
118
|
}
|
|
93
119
|
return allTokens;
|
|
94
120
|
}
|
|
95
|
-
;
|
|
96
|
-
/**
|
|
97
|
-
* It convert tree to string, it's convenient to use in unit test.
|
|
98
|
-
* @param string input
|
|
99
|
-
*/
|
|
100
|
-
parserTreeToString(input) {
|
|
101
|
-
this.parse(input);
|
|
102
|
-
return this._parserTree.toStringTree(this._parser.ruleNames);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Get List-like style tree string
|
|
106
|
-
* @param parserTree ProgramRuleContext
|
|
107
|
-
*/
|
|
108
|
-
toString(parserTree) {
|
|
109
|
-
return parserTree.toStringTree(this._parser.ruleNames);
|
|
110
|
-
}
|
|
111
121
|
/**
|
|
112
122
|
* @param listener Listener instance extends ParserListener
|
|
113
|
-
* @param
|
|
123
|
+
* @param parseTree parser Tree
|
|
114
124
|
*/
|
|
115
|
-
listen(listener,
|
|
116
|
-
ParseTreeWalker.DEFAULT.walk(listener,
|
|
125
|
+
listen(listener, parseTree) {
|
|
126
|
+
ParseTreeWalker.DEFAULT.walk(listener, parseTree);
|
|
117
127
|
}
|
|
118
128
|
/**
|
|
119
129
|
* Split input into statements.
|
|
@@ -121,10 +131,16 @@ export default class BasicParser {
|
|
|
121
131
|
* @param input source string
|
|
122
132
|
*/
|
|
123
133
|
splitSQLByStatement(input) {
|
|
124
|
-
this.
|
|
134
|
+
const errors = this.validate(input);
|
|
135
|
+
if (errors.length) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
125
138
|
const splitListener = this.splitListener;
|
|
126
|
-
|
|
127
|
-
|
|
139
|
+
// TODO: add splitListener to all sqlParser implements add remove following if
|
|
140
|
+
if (!splitListener)
|
|
141
|
+
return null;
|
|
142
|
+
this.listen(splitListener, this._parseTree);
|
|
143
|
+
const res = splitListener.statementsContext.map((context) => {
|
|
128
144
|
const { start, stop } = context;
|
|
129
145
|
return {
|
|
130
146
|
startIndex: start.startIndex,
|
|
@@ -149,11 +165,11 @@ export default class BasicParser {
|
|
|
149
165
|
// TODO: add splitListener to all sqlParser implements add remove following if
|
|
150
166
|
if (!splitListener)
|
|
151
167
|
return null;
|
|
152
|
-
this.
|
|
168
|
+
this.parseWithCache(input);
|
|
153
169
|
let sqlParserIns = this._parser;
|
|
154
170
|
const allTokens = this.getAllTokens(input);
|
|
155
171
|
let caretTokenIndex = findCaretTokenIndex(caretPosition, allTokens);
|
|
156
|
-
let c3Context = this.
|
|
172
|
+
let c3Context = this._parseTree;
|
|
157
173
|
let tokenIndexOffset = 0;
|
|
158
174
|
if (!caretTokenIndex && caretTokenIndex !== 0)
|
|
159
175
|
return null;
|
|
@@ -161,25 +177,25 @@ export default class BasicParser {
|
|
|
161
177
|
* Split sql by statement.
|
|
162
178
|
* Try to collect candidates from the caret statement only.
|
|
163
179
|
*/
|
|
164
|
-
this.listen(splitListener, this.
|
|
180
|
+
this.listen(splitListener, this._parseTree);
|
|
165
181
|
// If there are multiple statements.
|
|
166
182
|
if (splitListener.statementsContext.length > 1) {
|
|
167
183
|
// find statement rule context where caretPosition is located.
|
|
168
|
-
const caretStatementContext = splitListener === null || splitListener === void 0 ? void 0 : splitListener.statementsContext.find(ctx => {
|
|
184
|
+
const caretStatementContext = splitListener === null || splitListener === void 0 ? void 0 : splitListener.statementsContext.find((ctx) => {
|
|
169
185
|
var _a;
|
|
170
|
-
return caretTokenIndex <= ((_a = ctx.stop) === null || _a === void 0 ? void 0 : _a.tokenIndex) &&
|
|
186
|
+
return (caretTokenIndex <= ((_a = ctx.stop) === null || _a === void 0 ? void 0 : _a.tokenIndex) &&
|
|
187
|
+
caretTokenIndex >= ctx.start.tokenIndex);
|
|
171
188
|
});
|
|
172
189
|
if (caretStatementContext) {
|
|
173
190
|
c3Context = caretStatementContext;
|
|
174
191
|
}
|
|
175
192
|
else {
|
|
176
|
-
const lastStatementToken = splitListener
|
|
177
|
-
.statementsContext[(splitListener === null || splitListener === void 0 ? void 0 : splitListener.statementsContext.length) - 1]
|
|
193
|
+
const lastStatementToken = splitListener.statementsContext[(splitListener === null || splitListener === void 0 ? void 0 : splitListener.statementsContext.length) - 1]
|
|
178
194
|
.start;
|
|
179
195
|
/**
|
|
180
196
|
* If caretStatementContext is not found and it follows all statements.
|
|
181
197
|
* Reparses part of the input following the penultimate statement.
|
|
182
|
-
* And c3 will collect candidates in the new
|
|
198
|
+
* And c3 will collect candidates in the new parseTreeContext.
|
|
183
199
|
*/
|
|
184
200
|
if (caretTokenIndex > (lastStatementToken === null || lastStatementToken === void 0 ? void 0 : lastStatementToken.tokenIndex)) {
|
|
185
201
|
/**
|
|
@@ -191,6 +207,7 @@ export default class BasicParser {
|
|
|
191
207
|
caretTokenIndex = caretTokenIndex - tokenIndexOffset;
|
|
192
208
|
const inputSlice = input.slice(lastStatementToken.startIndex);
|
|
193
209
|
const lexer = this.createLexer(inputSlice);
|
|
210
|
+
lexer.removeErrorListeners();
|
|
194
211
|
const tokenStream = new CommonTokenStream(lexer);
|
|
195
212
|
tokenStream.fill();
|
|
196
213
|
const parser = this.createParserFromTokenStream(tokenStream);
|
|
@@ -205,16 +222,15 @@ export default class BasicParser {
|
|
|
205
222
|
core.preferredRules = this.preferredRules;
|
|
206
223
|
const candidates = core.collectCandidates(caretTokenIndex, c3Context);
|
|
207
224
|
const originalSuggestions = this.processCandidates(candidates, allTokens, caretTokenIndex, tokenIndexOffset);
|
|
208
|
-
const syntaxSuggestions = originalSuggestions.syntax
|
|
209
|
-
.map(
|
|
210
|
-
const wordRanges = syntaxCtx.wordRanges.map(token => {
|
|
225
|
+
const syntaxSuggestions = originalSuggestions.syntax.map((syntaxCtx) => {
|
|
226
|
+
const wordRanges = syntaxCtx.wordRanges.map((token) => {
|
|
211
227
|
return {
|
|
212
228
|
text: this._parsedInput.slice(token.startIndex, token.stopIndex + 1),
|
|
213
229
|
startIndex: token.startIndex,
|
|
214
230
|
stopIndex: token.stopIndex,
|
|
215
231
|
line: token.line,
|
|
216
232
|
startColumn: token.charPositionInLine + 1,
|
|
217
|
-
stopColumn: token.charPositionInLine + token.text.length
|
|
233
|
+
stopColumn: token.charPositionInLine + token.text.length,
|
|
218
234
|
};
|
|
219
235
|
});
|
|
220
236
|
return {
|
|
@@ -224,7 +240,7 @@ export default class BasicParser {
|
|
|
224
240
|
});
|
|
225
241
|
return {
|
|
226
242
|
syntax: syntaxSuggestions,
|
|
227
|
-
keywords: originalSuggestions.keywords
|
|
243
|
+
keywords: originalSuggestions.keywords,
|
|
228
244
|
};
|
|
229
245
|
}
|
|
230
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicParser.js","sourceRoot":"","sources":["../../../src/parser/common/basicParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,WAAW,EACX,iBAAiB,
|
|
1
|
+
{"version":3,"file":"basicParser.js","sourceRoot":"","sources":["../../../src/parser/common/basicParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Token, Recognizer, ANTLRErrorListener, RecognitionException } from 'antlr4ts';
|
|
2
|
+
import { ATNSimulator } from 'antlr4ts/atn/ATNSimulator';
|
|
3
|
+
/**
|
|
4
|
+
* Converted from {@link SyntaxError}.
|
|
5
|
+
*/
|
|
6
|
+
export interface ParseError {
|
|
7
|
+
startLine: number;
|
|
8
|
+
endLine: number;
|
|
9
|
+
startCol: number;
|
|
10
|
+
endCol: number;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The type of error resulting from lexical parsing and parsing.
|
|
15
|
+
*/
|
|
16
|
+
export interface SyntaxError<T> {
|
|
17
|
+
recognizer: Recognizer<T, ATNSimulator>;
|
|
18
|
+
offendingSymbol: Token;
|
|
19
|
+
line: number;
|
|
20
|
+
charPositionInLine: number;
|
|
21
|
+
msg: string;
|
|
22
|
+
e: RecognitionException;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ErrorHandler will be invoked when it encounters a parsing error.
|
|
26
|
+
* Includes lexical errors and parsing errors.
|
|
27
|
+
*/
|
|
28
|
+
export type ErrorHandler<T> = (parseError: ParseError, originalError: SyntaxError<T>) => void;
|
|
29
|
+
export default class ParseErrorListener implements ANTLRErrorListener<Token> {
|
|
30
|
+
private _errorHandler;
|
|
31
|
+
constructor(errorListener: ErrorHandler<Token>);
|
|
32
|
+
syntaxError(recognizer: Recognizer<Token, ATNSimulator>, offendingSymbol: any, line: number, charPositionInLine: number, msg: string, e: RecognitionException): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export default class ParseErrorListener {
|
|
2
|
+
constructor(errorListener) {
|
|
3
|
+
this._errorHandler = errorListener;
|
|
4
|
+
}
|
|
5
|
+
syntaxError(recognizer, offendingSymbol, line, charPositionInLine, msg, e) {
|
|
6
|
+
let endCol = charPositionInLine + 1;
|
|
7
|
+
if (offendingSymbol && offendingSymbol.text !== null) {
|
|
8
|
+
endCol = charPositionInLine + offendingSymbol.text.length;
|
|
9
|
+
}
|
|
10
|
+
if (this._errorHandler) {
|
|
11
|
+
this._errorHandler({
|
|
12
|
+
startLine: line,
|
|
13
|
+
endLine: line,
|
|
14
|
+
startCol: charPositionInLine,
|
|
15
|
+
endCol: endCol,
|
|
16
|
+
message: msg,
|
|
17
|
+
}, {
|
|
18
|
+
e,
|
|
19
|
+
line,
|
|
20
|
+
msg,
|
|
21
|
+
recognizer,
|
|
22
|
+
offendingSymbol,
|
|
23
|
+
charPositionInLine,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=parseErrorListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseErrorListener.js","sourceRoot":"","sources":["../../../src/parser/common/parseErrorListener.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAGnC,YAAY,aAAkC;QAC1C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,WAAW,CACP,UAA2C,EAC3C,eAAe,EACf,IAAY,EACZ,kBAA0B,EAC1B,GAAW,EACX,CAAuB;QAEvB,IAAI,MAAM,GAAG,kBAAkB,GAAG,CAAC,CAAC;QACpC,IAAI,eAAe,IAAI,eAAe,CAAC,IAAI,KAAK,IAAI,EAAE;YAClD,MAAM,GAAG,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;SAC7D;QACD,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,aAAa,CACd;gBACI,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,kBAAkB;gBAC5B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG;aACf,EACD;gBACI,CAAC;gBACD,IAAI;gBACJ,GAAG;gBACH,UAAU;gBACV,eAAe;gBACf,kBAAkB;aACrB,CACJ,CAAC;SACL;IACL,CAAC;CACJ"}
|
|
@@ -2,7 +2,7 @@ import { Token } from 'antlr4ts';
|
|
|
2
2
|
import { CandidatesCollection } from 'antlr4-c3';
|
|
3
3
|
import { FlinkSqlLexer } from '../lib/flinksql/FlinkSqlLexer';
|
|
4
4
|
import { FlinkSqlParser, ProgramContext, SqlStatementContext, SqlStatementsContext } from '../lib/flinksql/FlinkSqlParser';
|
|
5
|
-
import { FlinkSqlParserListener } from '
|
|
5
|
+
import { FlinkSqlParserListener } from '../lib/flinksql/FlinkSqlParserListener';
|
|
6
6
|
import { Suggestions } from './common/basic-parser-types';
|
|
7
7
|
import BasicParser from './common/basicParser';
|
|
8
8
|
export default class FlinkSQL extends BasicParser<FlinkSqlLexer, ProgramContext, FlinkSqlParser> {
|