dt-sql-parser 4.5.0-beta.0 → 4.5.0-beta.2

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.
@@ -12,3 +12,5 @@ export { TrinoSqlListener } from './trino/TrinoSqlListener';
12
12
  export { TrinoSqlVisitor } from './trino/TrinoSqlVisitor';
13
13
  export { ImpalaSqlParserListener } from './impala/ImpalaSqlParserListener';
14
14
  export { ImpalaSqlParserVisitor } from './impala/ImpalaSqlParserVisitor';
15
+ export { GenericSqlListener } from './generic/GenericSqlListener';
16
+ export { GenericSqlVisitor } from './generic/GenericSqlVisitor';
package/dist/lib/index.js CHANGED
@@ -12,3 +12,5 @@ export { TrinoSqlListener } from './trino/TrinoSqlListener';
12
12
  export { TrinoSqlVisitor } from './trino/TrinoSqlVisitor';
13
13
  export { ImpalaSqlParserListener } from './impala/ImpalaSqlParserListener';
14
14
  export { ImpalaSqlParserVisitor } from './impala/ImpalaSqlParserVisitor';
15
+ export { GenericSqlListener } from './generic/GenericSqlListener';
16
+ export { GenericSqlVisitor } from './generic/GenericSqlVisitor';
@@ -0,0 +1,29 @@
1
+ import type { GenericSqlListener } from '../../lib/generic/GenericSqlListener';
2
+ import { AlterTableContext, ColumnDefinitionContext, ColumnRefContext, CreateTableContext, DeleteContext, DropTableContext, InsertContext, QuerySpecificationContext, QueryStatementContext, SelectItemContext, SingleStatementContext, TableNameContext, TableNameCreateContext, UpdateContext } from '../../lib/generic/GenericSqlParser';
3
+ import { EntityCollector } from '../common/entityCollector';
4
+ export declare class GenericEntityCollector extends EntityCollector implements GenericSqlListener {
5
+ /** ====== Entity Begin */
6
+ exitTableName(ctx: TableNameContext): void;
7
+ exitTableNameCreate(ctx: TableNameCreateContext): void;
8
+ exitColumnRef(ctx: ColumnRefContext): void;
9
+ exitColumnDefinition(ctx: ColumnDefinitionContext): void;
10
+ exitQuerySpecification(ctx: QuerySpecificationContext): void;
11
+ exitSelectItem(ctx: SelectItemContext): void;
12
+ /** ===== Statement begin */
13
+ enterSingleStatement(ctx: SingleStatementContext): void;
14
+ exitSingleStatement(ctx: SingleStatementContext): void;
15
+ enterCreateTable(ctx: CreateTableContext): void;
16
+ exitCreateTable(ctx: CreateTableContext): void;
17
+ enterQueryStatement(ctx: QueryStatementContext): void;
18
+ exitQueryStatement(ctx: QueryStatementContext): void;
19
+ enterInsert(ctx: InsertContext): void;
20
+ exitInsert(ctx: InsertContext): void;
21
+ enterUpdate(ctx: UpdateContext): void;
22
+ exitUpdate(ctx: UpdateContext): void;
23
+ enterDelete(ctx: DeleteContext): void;
24
+ exitDelete(ctx: DeleteContext): void;
25
+ enterAlterTable(ctx: AlterTableContext): void;
26
+ exitAlterTable(ctx: AlterTableContext): void;
27
+ enterDropTable(ctx: DropTableContext): void;
28
+ exitDropTable(ctx: DropTableContext): void;
29
+ }
@@ -0,0 +1,103 @@
1
+ import { ColumnDefinitionContext, CreateTableStatementContext, SelectItemContext, } from '../../lib/generic/GenericSqlParser';
2
+ import { AttrName, ColumnDeclareType, EntityCollector, StmtContextType, TableDeclareType, } from '../common/entityCollector';
3
+ import { EntityContextType } from '../common/types';
4
+ export class GenericEntityCollector extends EntityCollector {
5
+ /** ====== Entity Begin */
6
+ exitTableName(ctx) {
7
+ this.pushEntity(ctx, EntityContextType.TABLE, [], {
8
+ declareType: TableDeclareType.LITERAL,
9
+ });
10
+ }
11
+ exitTableNameCreate(ctx) {
12
+ this.pushEntity(ctx, EntityContextType.TABLE_CREATE, [
13
+ {
14
+ attrName: AttrName.comment,
15
+ endContextList: [CreateTableStatementContext.name],
16
+ },
17
+ ]);
18
+ }
19
+ exitColumnRef(ctx) {
20
+ this.pushEntity(ctx, EntityContextType.COLUMN);
21
+ }
22
+ exitColumnDefinition(ctx) {
23
+ this.pushEntity(ctx, EntityContextType.COLUMN_CREATE, [
24
+ {
25
+ attrName: AttrName.colType,
26
+ endContextList: [ColumnDefinitionContext.name],
27
+ },
28
+ {
29
+ attrName: AttrName.comment,
30
+ endContextList: [ColumnDefinitionContext.name],
31
+ },
32
+ ]);
33
+ }
34
+ exitQuerySpecification(ctx) {
35
+ this.pushEntity(ctx, EntityContextType.QUERY_RESULT);
36
+ }
37
+ exitSelectItem(ctx) {
38
+ if (ctx.ASTERISK()) {
39
+ this.pushEntity(ctx, EntityContextType.COLUMN, [], {
40
+ declareType: ColumnDeclareType.ALL,
41
+ });
42
+ }
43
+ else {
44
+ this.pushEntity(ctx, EntityContextType.COLUMN, [
45
+ {
46
+ attrName: AttrName.alias,
47
+ endContextList: [SelectItemContext.name],
48
+ },
49
+ ], {
50
+ declareType: ColumnDeclareType.EXPRESSION,
51
+ });
52
+ }
53
+ }
54
+ /** ===== Statement begin */
55
+ enterSingleStatement(ctx) {
56
+ this.pushStmt(ctx, StmtContextType.COMMON_STMT);
57
+ }
58
+ exitSingleStatement(ctx) {
59
+ this.popStmt();
60
+ }
61
+ enterCreateTable(ctx) {
62
+ this.pushStmt(ctx, StmtContextType.CREATE_TABLE_STMT);
63
+ }
64
+ exitCreateTable(ctx) {
65
+ this.popStmt();
66
+ }
67
+ enterQueryStatement(ctx) {
68
+ this.pushStmt(ctx, StmtContextType.SELECT_STMT);
69
+ }
70
+ exitQueryStatement(ctx) {
71
+ this.popStmt();
72
+ }
73
+ enterInsert(ctx) {
74
+ this.pushStmt(ctx, StmtContextType.INSERT_STMT);
75
+ }
76
+ exitInsert(ctx) {
77
+ this.popStmt();
78
+ }
79
+ enterUpdate(ctx) {
80
+ this.pushStmt(ctx, StmtContextType.COMMON_STMT);
81
+ }
82
+ exitUpdate(ctx) {
83
+ this.popStmt();
84
+ }
85
+ enterDelete(ctx) {
86
+ this.pushStmt(ctx, StmtContextType.COMMON_STMT);
87
+ }
88
+ exitDelete(ctx) {
89
+ this.popStmt();
90
+ }
91
+ enterAlterTable(ctx) {
92
+ this.pushStmt(ctx, StmtContextType.ALTER_TABLE_STMT);
93
+ }
94
+ exitAlterTable(ctx) {
95
+ this.popStmt();
96
+ }
97
+ enterDropTable(ctx) {
98
+ this.pushStmt(ctx, StmtContextType.COMMON_STMT);
99
+ }
100
+ exitDropTable(ctx) {
101
+ this.popStmt();
102
+ }
103
+ }
@@ -0,0 +1,6 @@
1
+ import { Parser, Token } from 'antlr4ng';
2
+ import { ParseErrorListener } from '../common/parseErrorListener';
3
+ export declare class GenericErrorListener extends ParseErrorListener {
4
+ private objectNames;
5
+ getExpectedText(parser: Parser, token: Token): string;
6
+ }
@@ -0,0 +1,56 @@
1
+ import { CodeCompletionCore } from 'antlr4-c3';
2
+ import { GenericSqlParser } from '../../lib/generic/GenericSqlParser';
3
+ import { ParseErrorListener } from '../common/parseErrorListener';
4
+ export class GenericErrorListener extends ParseErrorListener {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.objectNames = new Map([
8
+ [GenericSqlParser.RULE_tableName, 'table'],
9
+ [GenericSqlParser.RULE_tableNameCreate, 'table'],
10
+ [GenericSqlParser.RULE_columnRef, 'column'],
11
+ ]);
12
+ }
13
+ getExpectedText(parser, token) {
14
+ var _a;
15
+ let expectedText = '';
16
+ const input = this.parserContext.getParsedInput();
17
+ let currentContext = (_a = parser.context) !== null && _a !== void 0 ? _a : undefined;
18
+ while (currentContext === null || currentContext === void 0 ? void 0 : currentContext.parent) {
19
+ currentContext = currentContext.parent;
20
+ }
21
+ const parserInfo = this.parserContext.getMinimumParserInfo(input, token.tokenIndex, currentContext);
22
+ if (!parserInfo)
23
+ return '';
24
+ const { parser: c3Parser, newTokenIndex, parseTree: c3Context } = parserInfo;
25
+ const core = new CodeCompletionCore(c3Parser);
26
+ core.preferredRules = this.preferredRules;
27
+ const candidates = core.collectCandidates(newTokenIndex, c3Context);
28
+ if (candidates.rules.size) {
29
+ const result = [];
30
+ for (const candidate of candidates.rules) {
31
+ const [ruleType] = candidate;
32
+ const name = this.objectNames.get(ruleType);
33
+ switch (ruleType) {
34
+ case GenericSqlParser.RULE_tableName:
35
+ case GenericSqlParser.RULE_columnRef: {
36
+ if (name && !result.includes(`{existing}${name}`)) {
37
+ result.push(`{existing}${name}`);
38
+ }
39
+ break;
40
+ }
41
+ case GenericSqlParser.RULE_tableNameCreate: {
42
+ if (name && !result.includes(`{new}${name}`)) {
43
+ result.push(`{new}${name}`);
44
+ }
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ expectedText = result.join('{or}');
50
+ }
51
+ if (candidates.tokens.size) {
52
+ expectedText += expectedText ? '{orKeyword}' : '{keyword}';
53
+ }
54
+ return expectedText;
55
+ }
56
+ }
@@ -0,0 +1,9 @@
1
+ import { GenericSqlListener } from '../../lib/generic/GenericSqlListener';
2
+ import { StatementsContext } from '../../lib/generic/GenericSqlParser';
3
+ import SemanticContextCollector from '../common/semanticContextCollector';
4
+ declare class GenericSemanticContextCollector extends SemanticContextCollector implements GenericSqlListener {
5
+ getWhiteSpaceRuleType(): number;
6
+ getStatementRuleType(): number;
7
+ enterStatements(ctx: StatementsContext): void;
8
+ }
9
+ export { GenericSemanticContextCollector };
@@ -0,0 +1,14 @@
1
+ import { GenericSqlParser } from '../../lib/generic/GenericSqlParser';
2
+ import SemanticContextCollector from '../common/semanticContextCollector';
3
+ class GenericSemanticContextCollector extends SemanticContextCollector {
4
+ getWhiteSpaceRuleType() {
5
+ return GenericSqlParser.WHITE_SPACE;
6
+ }
7
+ getStatementRuleType() {
8
+ return GenericSqlParser.RULE_statements;
9
+ }
10
+ enterStatements(ctx) {
11
+ this.visitStatement(ctx);
12
+ }
13
+ }
14
+ export { GenericSemanticContextCollector };
@@ -0,0 +1,6 @@
1
+ import { SingleStatementContext } from '../../lib/generic/GenericSqlParser';
2
+ import { GenericSqlListener } from '../../lib/generic/GenericSqlListener';
3
+ import { SplitListener } from '../common/splitListener';
4
+ export declare class GenericSplitListener extends SplitListener<SingleStatementContext> implements GenericSqlListener {
5
+ exitSingleStatement(ctx: SingleStatementContext): void;
6
+ }
@@ -0,0 +1,6 @@
1
+ import { SplitListener } from '../common/splitListener';
2
+ export class GenericSplitListener extends SplitListener {
3
+ exitSingleStatement(ctx) {
4
+ this._statementsContext.push(ctx);
5
+ }
6
+ }
@@ -0,0 +1,33 @@
1
+ import { CandidatesCollection } from 'antlr4-c3';
2
+ import { CharStream, CommonTokenStream, Token } from 'antlr4ng';
3
+ import { GenericSqlLexer } from '../../lib/generic/GenericSqlLexer';
4
+ import { GenericSqlParser, ProgramContext } from '../../lib/generic/GenericSqlParser';
5
+ import { BasicSQL } from '../common/basicSQL';
6
+ import { Suggestions, CaretPosition, SemanticCollectOptions } from '../common/types';
7
+ import { ErrorListener, ParseError } from '../common/parseErrorListener';
8
+ import { GenericEntityCollector } from './genericEntityCollector';
9
+ import { GenericErrorListener } from './genericErrorListener';
10
+ import { GenericSplitListener } from './genericSplitListener';
11
+ import { GenericSemanticContextCollector } from './genericSemanticContextCollector';
12
+ export { GenericEntityCollector, GenericSplitListener };
13
+ export interface GenericSQLOptions {
14
+ /** Enable or disable diagnostics (parse error collection). Defaults to true. */
15
+ diagnostics?: boolean;
16
+ }
17
+ export declare class GenericSQL extends BasicSQL<GenericSqlLexer, ProgramContext, GenericSqlParser> {
18
+ private _diagnostics;
19
+ constructor(options?: GenericSQLOptions);
20
+ protected createLexerFromCharStream(charStreams: CharStream): GenericSqlLexer;
21
+ validate(input: string): ParseError[];
22
+ protected createParserFromTokenStream(tokenStream: CommonTokenStream): GenericSqlParser;
23
+ /**
24
+ * The rules that keywords you don't want to be suggested.
25
+ */
26
+ protected excludeKeywordRules: Set<number>;
27
+ protected preferredRules: Set<number>;
28
+ protected get splitListener(): GenericSplitListener;
29
+ protected createErrorListener(_errorListener: ErrorListener): GenericErrorListener;
30
+ protected createEntityCollector(input: string, allTokens?: Token[], caretTokenIndex?: number): GenericEntityCollector;
31
+ protected createSemanticContextCollector(input: string, caretPosition: CaretPosition, allTokens: Token[], options?: SemanticCollectOptions): GenericSemanticContextCollector;
32
+ protected processCandidates(candidates: CandidatesCollection, allTokens: Token[], caretTokenIndex: number): Suggestions<Token>;
33
+ }
@@ -0,0 +1,94 @@
1
+ import { processTokenCandidates } from '../common/tokenUtils';
2
+ import { GenericSqlLexer } from '../../lib/generic/GenericSqlLexer';
3
+ import { GenericSqlParser } from '../../lib/generic/GenericSqlParser';
4
+ import { BasicSQL } from '../common/basicSQL';
5
+ import { EntityContextType, } from '../common/types';
6
+ import { GenericEntityCollector } from './genericEntityCollector';
7
+ import { GenericErrorListener } from './genericErrorListener';
8
+ import { GenericSplitListener } from './genericSplitListener';
9
+ import { GenericSemanticContextCollector } from './genericSemanticContextCollector';
10
+ export { GenericEntityCollector, GenericSplitListener };
11
+ export class GenericSQL extends BasicSQL {
12
+ constructor(options) {
13
+ super();
14
+ /**
15
+ * The rules that keywords you don't want to be suggested.
16
+ */
17
+ this.excludeKeywordRules = new Set([GenericSqlParser.RULE_nonReserved]);
18
+ this.preferredRules = new Set([
19
+ GenericSqlParser.RULE_tableName,
20
+ GenericSqlParser.RULE_tableNameCreate,
21
+ GenericSqlParser.RULE_columnRef,
22
+ ...this.excludeKeywordRules,
23
+ ]);
24
+ this._diagnostics = (options === null || options === void 0 ? void 0 : options.diagnostics) !== false;
25
+ }
26
+ createLexerFromCharStream(charStreams) {
27
+ return new GenericSqlLexer(charStreams);
28
+ }
29
+ validate(input) {
30
+ if (!this._diagnostics) {
31
+ return [];
32
+ }
33
+ return super.validate(input);
34
+ }
35
+ createParserFromTokenStream(tokenStream) {
36
+ return new GenericSqlParser(tokenStream);
37
+ }
38
+ get splitListener() {
39
+ return new GenericSplitListener();
40
+ }
41
+ createErrorListener(_errorListener) {
42
+ const parserContext = this;
43
+ return new GenericErrorListener(_errorListener, parserContext, this.preferredRules);
44
+ }
45
+ createEntityCollector(input, allTokens, caretTokenIndex) {
46
+ return new GenericEntityCollector(input, allTokens, caretTokenIndex);
47
+ }
48
+ createSemanticContextCollector(input, caretPosition, allTokens, options) {
49
+ return new GenericSemanticContextCollector(input, caretPosition, allTokens, options);
50
+ }
51
+ processCandidates(candidates, allTokens, caretTokenIndex) {
52
+ const originalSyntaxSuggestions = [];
53
+ const keywords = [];
54
+ for (const candidate of candidates.rules) {
55
+ const [ruleType, candidateRule] = candidate;
56
+ const tokenRanges = allTokens.slice(candidateRule.startTokenIndex, caretTokenIndex + 1);
57
+ let syntaxContextType = void 0;
58
+ switch (ruleType) {
59
+ case GenericSqlParser.RULE_tableName: {
60
+ syntaxContextType = EntityContextType.TABLE;
61
+ break;
62
+ }
63
+ case GenericSqlParser.RULE_tableNameCreate: {
64
+ syntaxContextType = EntityContextType.TABLE_CREATE;
65
+ break;
66
+ }
67
+ case GenericSqlParser.RULE_columnRef: {
68
+ syntaxContextType = EntityContextType.COLUMN;
69
+ break;
70
+ }
71
+ default:
72
+ break;
73
+ }
74
+ if (syntaxContextType &&
75
+ !originalSyntaxSuggestions.some((syn) => {
76
+ var _a, _b;
77
+ return syn.syntaxContextType === syntaxContextType &&
78
+ ((_a = syn.wordRanges.map((wordRange) => wordRange.text)) === null || _a === void 0 ? void 0 : _a.join(',')) ===
79
+ ((_b = tokenRanges.map((tokenRange) => tokenRange.text)) === null || _b === void 0 ? void 0 : _b.join(','));
80
+ })) {
81
+ originalSyntaxSuggestions.push({
82
+ syntaxContextType,
83
+ wordRanges: tokenRanges,
84
+ });
85
+ }
86
+ }
87
+ const processedKeywords = processTokenCandidates(this._parser, candidates.tokens);
88
+ keywords.push(...processedKeywords);
89
+ return {
90
+ syntax: originalSyntaxSuggestions,
91
+ keywords,
92
+ };
93
+ }
94
+ }
@@ -5,3 +5,4 @@ export { SparkSQL } from './spark';
5
5
  export { PostgreSQL } from './postgresql';
6
6
  export { TrinoSQL } from './trino';
7
7
  export { ImpalaSQL } from './impala';
8
+ export { GenericSQL } from './generic';
@@ -5,3 +5,4 @@ export { SparkSQL } from './spark';
5
5
  export { PostgreSQL } from './postgresql';
6
6
  export { TrinoSQL } from './trino';
7
7
  export { ImpalaSQL } from './impala';
8
+ export { GenericSQL } from './generic';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dt-sql-parser",
3
- "version": "4.5.0-beta.0",
3
+ "version": "4.5.0-beta.2",
4
4
  "authors": "DTStack Corporation",
5
5
  "description": "SQL Parsers for BigData, built with antlr4",
6
6
  "keywords": [