dt-sql-parser 4.5.0-beta.1 → 4.5.0-beta.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/dist/lib/SQLParserBase.d.ts +1 -13
- package/dist/lib/SQLParserBase.js +5 -40
- package/dist/lib/flink/FlinkSqlLexer.d.ts +399 -397
- package/dist/lib/flink/FlinkSqlLexer.js +2504 -2489
- package/dist/lib/flink/FlinkSqlParser.d.ts +726 -617
- package/dist/lib/flink/FlinkSqlParser.js +4861 -3558
- package/dist/lib/flink/FlinkSqlParserListener.d.ts +90 -33
- package/dist/lib/flink/FlinkSqlParserVisitor.d.ts +57 -21
- package/dist/lib/hive/HiveSqlParser.d.ts +228 -274
- package/dist/lib/hive/HiveSqlParser.js +5912 -6304
- package/dist/lib/hive/HiveSqlParserListener.d.ts +0 -33
- package/dist/lib/hive/HiveSqlParserVisitor.d.ts +0 -21
- package/dist/lib/impala/ImpalaSqlParser.d.ts +103 -145
- package/dist/lib/impala/ImpalaSqlParser.js +3320 -3687
- package/dist/lib/impala/ImpalaSqlParserListener.d.ts +0 -33
- package/dist/lib/impala/ImpalaSqlParserVisitor.d.ts +0 -21
- package/dist/lib/mysql/MySqlParser.d.ts +94 -161
- package/dist/lib/mysql/MySqlParser.js +9499 -9959
- package/dist/lib/mysql/MySqlParserListener.d.ts +5 -79
- package/dist/lib/mysql/MySqlParserVisitor.d.ts +3 -49
- package/dist/lib/postgresql/PostgreSqlParser.d.ts +71 -108
- package/dist/lib/postgresql/PostgreSqlParser.js +10388 -13330
- package/dist/lib/postgresql/PostgreSqlParserListener.d.ts +0 -48
- package/dist/lib/postgresql/PostgreSqlParserVisitor.d.ts +0 -30
- package/dist/lib/spark/SparkSqlParser.d.ts +145 -185
- package/dist/lib/spark/SparkSqlParser.js +5109 -5420
- package/dist/lib/spark/SparkSqlParserListener.d.ts +0 -33
- package/dist/lib/spark/SparkSqlParserVisitor.d.ts +0 -21
- package/dist/parser/common/basicSQL.d.ts +17 -5
- package/dist/parser/common/basicSQL.js +74 -3
- package/dist/parser/common/entityCollector.js +2 -14
- package/dist/parser/flink/index.js +2 -5
- package/dist/parser/mysql/index.js +1 -3
- package/dist/parser/mysql/mysqlEntityCollector.d.ts +1 -2
- package/dist/parser/mysql/mysqlEntityCollector.js +3 -13
- package/dist/parser/mysql/mysqlErrorListener.js +0 -2
- package/dist/parser/postgresql/postgreEntityCollector.d.ts +1 -3
- package/dist/parser/postgresql/postgreEntityCollector.js +0 -13
- package/dist/parser/spark/index.js +1 -3
- package/package.json +1 -1
|
@@ -131,10 +131,8 @@ import { TableNameCreateContext } from "./SparkSqlParser.js";
|
|
|
131
131
|
import { TableNameContext } from "./SparkSqlParser.js";
|
|
132
132
|
import { ViewNameCreateContext } from "./SparkSqlParser.js";
|
|
133
133
|
import { ViewNameContext } from "./SparkSqlParser.js";
|
|
134
|
-
import { EmptyColumnContext } from "./SparkSqlParser.js";
|
|
135
134
|
import { ColumnNameContext } from "./SparkSqlParser.js";
|
|
136
135
|
import { ColumnNamePathContext } from "./SparkSqlParser.js";
|
|
137
|
-
import { ColumnNamePathAllowEmptyContext } from "./SparkSqlParser.js";
|
|
138
136
|
import { ColumnNameSeqContext } from "./SparkSqlParser.js";
|
|
139
137
|
import { ColumnNameCreateContext } from "./SparkSqlParser.js";
|
|
140
138
|
import { IdentifierReferenceContext } from "./SparkSqlParser.js";
|
|
@@ -208,7 +206,6 @@ import { TableAliasContext } from "./SparkSqlParser.js";
|
|
|
208
206
|
import { RowFormatContext } from "./SparkSqlParser.js";
|
|
209
207
|
import { MultipartIdentifierListContext } from "./SparkSqlParser.js";
|
|
210
208
|
import { MultipartIdentifierContext } from "./SparkSqlParser.js";
|
|
211
|
-
import { MultipartIdentifierAllowEmptyContext } from "./SparkSqlParser.js";
|
|
212
209
|
import { MultipartIdentifierPropertyListContext } from "./SparkSqlParser.js";
|
|
213
210
|
import { MultipartIdentifierPropertyContext } from "./SparkSqlParser.js";
|
|
214
211
|
import { TableIdentifierContext } from "./SparkSqlParser.js";
|
|
@@ -1799,16 +1796,6 @@ export declare class SparkSqlParserListener implements ParseTreeListener {
|
|
|
1799
1796
|
* @param ctx the parse tree
|
|
1800
1797
|
*/
|
|
1801
1798
|
exitViewName?: (ctx: ViewNameContext) => void;
|
|
1802
|
-
/**
|
|
1803
|
-
* Enter a parse tree produced by `SparkSqlParser.emptyColumn`.
|
|
1804
|
-
* @param ctx the parse tree
|
|
1805
|
-
*/
|
|
1806
|
-
enterEmptyColumn?: (ctx: EmptyColumnContext) => void;
|
|
1807
|
-
/**
|
|
1808
|
-
* Exit a parse tree produced by `SparkSqlParser.emptyColumn`.
|
|
1809
|
-
* @param ctx the parse tree
|
|
1810
|
-
*/
|
|
1811
|
-
exitEmptyColumn?: (ctx: EmptyColumnContext) => void;
|
|
1812
1799
|
/**
|
|
1813
1800
|
* Enter a parse tree produced by `SparkSqlParser.columnName`.
|
|
1814
1801
|
* @param ctx the parse tree
|
|
@@ -1829,16 +1816,6 @@ export declare class SparkSqlParserListener implements ParseTreeListener {
|
|
|
1829
1816
|
* @param ctx the parse tree
|
|
1830
1817
|
*/
|
|
1831
1818
|
exitColumnNamePath?: (ctx: ColumnNamePathContext) => void;
|
|
1832
|
-
/**
|
|
1833
|
-
* Enter a parse tree produced by `SparkSqlParser.columnNamePathAllowEmpty`.
|
|
1834
|
-
* @param ctx the parse tree
|
|
1835
|
-
*/
|
|
1836
|
-
enterColumnNamePathAllowEmpty?: (ctx: ColumnNamePathAllowEmptyContext) => void;
|
|
1837
|
-
/**
|
|
1838
|
-
* Exit a parse tree produced by `SparkSqlParser.columnNamePathAllowEmpty`.
|
|
1839
|
-
* @param ctx the parse tree
|
|
1840
|
-
*/
|
|
1841
|
-
exitColumnNamePathAllowEmpty?: (ctx: ColumnNamePathAllowEmptyContext) => void;
|
|
1842
1819
|
/**
|
|
1843
1820
|
* Enter a parse tree produced by `SparkSqlParser.columnNameSeq`.
|
|
1844
1821
|
* @param ctx the parse tree
|
|
@@ -2579,16 +2556,6 @@ export declare class SparkSqlParserListener implements ParseTreeListener {
|
|
|
2579
2556
|
* @param ctx the parse tree
|
|
2580
2557
|
*/
|
|
2581
2558
|
exitMultipartIdentifier?: (ctx: MultipartIdentifierContext) => void;
|
|
2582
|
-
/**
|
|
2583
|
-
* Enter a parse tree produced by `SparkSqlParser.multipartIdentifierAllowEmpty`.
|
|
2584
|
-
* @param ctx the parse tree
|
|
2585
|
-
*/
|
|
2586
|
-
enterMultipartIdentifierAllowEmpty?: (ctx: MultipartIdentifierAllowEmptyContext) => void;
|
|
2587
|
-
/**
|
|
2588
|
-
* Exit a parse tree produced by `SparkSqlParser.multipartIdentifierAllowEmpty`.
|
|
2589
|
-
* @param ctx the parse tree
|
|
2590
|
-
*/
|
|
2591
|
-
exitMultipartIdentifierAllowEmpty?: (ctx: MultipartIdentifierAllowEmptyContext) => void;
|
|
2592
2559
|
/**
|
|
2593
2560
|
* Enter a parse tree produced by `SparkSqlParser.multipartIdentifierPropertyList`.
|
|
2594
2561
|
* @param ctx the parse tree
|
|
@@ -131,10 +131,8 @@ import { TableNameCreateContext } from "./SparkSqlParser.js";
|
|
|
131
131
|
import { TableNameContext } from "./SparkSqlParser.js";
|
|
132
132
|
import { ViewNameCreateContext } from "./SparkSqlParser.js";
|
|
133
133
|
import { ViewNameContext } from "./SparkSqlParser.js";
|
|
134
|
-
import { EmptyColumnContext } from "./SparkSqlParser.js";
|
|
135
134
|
import { ColumnNameContext } from "./SparkSqlParser.js";
|
|
136
135
|
import { ColumnNamePathContext } from "./SparkSqlParser.js";
|
|
137
|
-
import { ColumnNamePathAllowEmptyContext } from "./SparkSqlParser.js";
|
|
138
136
|
import { ColumnNameSeqContext } from "./SparkSqlParser.js";
|
|
139
137
|
import { ColumnNameCreateContext } from "./SparkSqlParser.js";
|
|
140
138
|
import { IdentifierReferenceContext } from "./SparkSqlParser.js";
|
|
@@ -208,7 +206,6 @@ import { TableAliasContext } from "./SparkSqlParser.js";
|
|
|
208
206
|
import { RowFormatContext } from "./SparkSqlParser.js";
|
|
209
207
|
import { MultipartIdentifierListContext } from "./SparkSqlParser.js";
|
|
210
208
|
import { MultipartIdentifierContext } from "./SparkSqlParser.js";
|
|
211
|
-
import { MultipartIdentifierAllowEmptyContext } from "./SparkSqlParser.js";
|
|
212
209
|
import { MultipartIdentifierPropertyListContext } from "./SparkSqlParser.js";
|
|
213
210
|
import { MultipartIdentifierPropertyContext } from "./SparkSqlParser.js";
|
|
214
211
|
import { TableIdentifierContext } from "./SparkSqlParser.js";
|
|
@@ -1178,12 +1175,6 @@ export declare class SparkSqlParserVisitor<Result> extends AbstractParseTreeVisi
|
|
|
1178
1175
|
* @return the visitor result
|
|
1179
1176
|
*/
|
|
1180
1177
|
visitViewName?: (ctx: ViewNameContext) => Result;
|
|
1181
|
-
/**
|
|
1182
|
-
* Visit a parse tree produced by `SparkSqlParser.emptyColumn`.
|
|
1183
|
-
* @param ctx the parse tree
|
|
1184
|
-
* @return the visitor result
|
|
1185
|
-
*/
|
|
1186
|
-
visitEmptyColumn?: (ctx: EmptyColumnContext) => Result;
|
|
1187
1178
|
/**
|
|
1188
1179
|
* Visit a parse tree produced by `SparkSqlParser.columnName`.
|
|
1189
1180
|
* @param ctx the parse tree
|
|
@@ -1196,12 +1187,6 @@ export declare class SparkSqlParserVisitor<Result> extends AbstractParseTreeVisi
|
|
|
1196
1187
|
* @return the visitor result
|
|
1197
1188
|
*/
|
|
1198
1189
|
visitColumnNamePath?: (ctx: ColumnNamePathContext) => Result;
|
|
1199
|
-
/**
|
|
1200
|
-
* Visit a parse tree produced by `SparkSqlParser.columnNamePathAllowEmpty`.
|
|
1201
|
-
* @param ctx the parse tree
|
|
1202
|
-
* @return the visitor result
|
|
1203
|
-
*/
|
|
1204
|
-
visitColumnNamePathAllowEmpty?: (ctx: ColumnNamePathAllowEmptyContext) => Result;
|
|
1205
1190
|
/**
|
|
1206
1191
|
* Visit a parse tree produced by `SparkSqlParser.columnNameSeq`.
|
|
1207
1192
|
* @param ctx the parse tree
|
|
@@ -1645,12 +1630,6 @@ export declare class SparkSqlParserVisitor<Result> extends AbstractParseTreeVisi
|
|
|
1645
1630
|
* @return the visitor result
|
|
1646
1631
|
*/
|
|
1647
1632
|
visitMultipartIdentifier?: (ctx: MultipartIdentifierContext) => Result;
|
|
1648
|
-
/**
|
|
1649
|
-
* Visit a parse tree produced by `SparkSqlParser.multipartIdentifierAllowEmpty`.
|
|
1650
|
-
* @param ctx the parse tree
|
|
1651
|
-
* @return the visitor result
|
|
1652
|
-
*/
|
|
1653
|
-
visitMultipartIdentifierAllowEmpty?: (ctx: MultipartIdentifierAllowEmptyContext) => Result;
|
|
1654
1633
|
/**
|
|
1655
1634
|
* Visit a parse tree produced by `SparkSqlParser.multipartIdentifierPropertyList`.
|
|
1656
1635
|
* @param ctx the parse tree
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { Lexer, Token, CommonTokenStream, CharStream, ParserRuleContext, ParseTreeListener, ANTLRErrorListener, Parser } from 'antlr4ng';
|
|
1
2
|
import { CandidatesCollection } from 'antlr4-c3';
|
|
2
|
-
import { ANTLRErrorListener, CharStream, CommonTokenStream, Lexer, Parser, ParserRuleContext, ParseTreeListener, Token } from 'antlr4ng';
|
|
3
3
|
import { SQLParserBase } from '../../lib/SQLParserBase';
|
|
4
|
+
import { TextSlice } from './textAndWord';
|
|
5
|
+
import { CaretPosition, LOCALE_TYPE, SemanticCollectOptions, Suggestions } from './types';
|
|
6
|
+
import { ParseError, ErrorListener } from './parseErrorListener';
|
|
7
|
+
import type { SplitListener } from './splitListener';
|
|
4
8
|
import type { EntityCollector } from './entityCollector';
|
|
5
9
|
import { EntityContext } from './entityCollector';
|
|
6
|
-
import { ErrorListener, ParseError } from './parseErrorListener';
|
|
7
10
|
import SemanticContextCollector from './semanticContextCollector';
|
|
8
|
-
import type { SplitListener } from './splitListener';
|
|
9
|
-
import { TextSlice } from './textAndWord';
|
|
10
|
-
import { CaretPosition, LOCALE_TYPE, SemanticCollectOptions, Suggestions } from './types';
|
|
11
11
|
export declare const SQL_SPLIT_SYMBOL_TEXT = ";";
|
|
12
12
|
/**
|
|
13
13
|
* Basic SQL class, every sql needs extends it.
|
|
@@ -95,10 +95,22 @@ export declare abstract class BasicSQL<L extends Lexer = Lexer, PRC extends Pars
|
|
|
95
95
|
private parseWithCache;
|
|
96
96
|
/**
|
|
97
97
|
* Validate input string and return syntax errors if exists.
|
|
98
|
+
* When input contains multiple statements separated by semicolons
|
|
99
|
+
* and the initial parse doesn't capture all errors, each statement
|
|
100
|
+
* is validated independently to collect all errors.
|
|
98
101
|
* @param input source string
|
|
99
102
|
* @returns syntax errors
|
|
100
103
|
*/
|
|
101
104
|
validate(input: string): ParseError[];
|
|
105
|
+
/**
|
|
106
|
+
* Validate each statement fragment independently and collect all errors.
|
|
107
|
+
*/
|
|
108
|
+
private validateStatements;
|
|
109
|
+
/**
|
|
110
|
+
* Split input into individual statement strings by semicolons.
|
|
111
|
+
* Handles semicolons inside quoted strings correctly.
|
|
112
|
+
*/
|
|
113
|
+
private splitStatements;
|
|
102
114
|
/**
|
|
103
115
|
* Get the input string that has been parsed.
|
|
104
116
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { CodeCompletionCore } from 'antlr4-c3';
|
|
2
1
|
import { CharStreams, CommonTokenStream, ParseTreeWalker, PredictionMode, } from 'antlr4ng';
|
|
3
|
-
import {
|
|
2
|
+
import { CodeCompletionCore } from 'antlr4-c3';
|
|
4
3
|
import { findCaretTokenIndex } from './findCaretTokenIndex';
|
|
5
4
|
import { ctxToText, tokenToWord } from './textAndWord';
|
|
5
|
+
import { ErrorStrategy } from './errorStrategy';
|
|
6
6
|
export const SQL_SPLIT_SYMBOL_TEXT = ';';
|
|
7
7
|
/**
|
|
8
8
|
* Basic SQL class, every sql needs extends it.
|
|
@@ -104,13 +104,84 @@ export class BasicSQL {
|
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
106
|
* Validate input string and return syntax errors if exists.
|
|
107
|
+
* When input contains multiple statements separated by semicolons
|
|
108
|
+
* and the initial parse doesn't capture all errors, each statement
|
|
109
|
+
* is validated independently to collect all errors.
|
|
107
110
|
* @param input source string
|
|
108
111
|
* @returns syntax errors
|
|
109
112
|
*/
|
|
110
113
|
validate(input) {
|
|
111
114
|
this.parseWithCache(input);
|
|
115
|
+
if (this._parseErrors.length > 0) {
|
|
116
|
+
const statements = this.splitStatements(input);
|
|
117
|
+
if (statements.length > 1) {
|
|
118
|
+
const splitErrors = this.validateStatements(statements);
|
|
119
|
+
if (splitErrors.length > this._parseErrors.length) {
|
|
120
|
+
this._parseErrors = splitErrors;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
112
124
|
return this._parseErrors;
|
|
113
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate each statement fragment independently and collect all errors.
|
|
128
|
+
*/
|
|
129
|
+
validateStatements(statements) {
|
|
130
|
+
const allErrors = [];
|
|
131
|
+
let lineOffset = 0;
|
|
132
|
+
for (const statement of statements) {
|
|
133
|
+
if (!statement.text.trim()) {
|
|
134
|
+
const newlines = (statement.text.match(/\n/g) || []).length;
|
|
135
|
+
lineOffset += newlines;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const parser = this.createParser(statement.text);
|
|
139
|
+
const errors = [];
|
|
140
|
+
parser.removeErrorListeners();
|
|
141
|
+
parser.addErrorListener(this.createErrorListener((error) => {
|
|
142
|
+
errors.push({
|
|
143
|
+
startLine: error.startLine + lineOffset,
|
|
144
|
+
endLine: error.endLine + lineOffset,
|
|
145
|
+
startColumn: error.startColumn,
|
|
146
|
+
endColumn: error.endColumn,
|
|
147
|
+
message: error.message,
|
|
148
|
+
});
|
|
149
|
+
}));
|
|
150
|
+
parser.errorHandler = new ErrorStrategy();
|
|
151
|
+
parser.program();
|
|
152
|
+
allErrors.push(...errors);
|
|
153
|
+
const newlines = (statement.text.match(/\n/g) || []).length;
|
|
154
|
+
lineOffset += newlines;
|
|
155
|
+
}
|
|
156
|
+
return allErrors;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Split input into individual statement strings by semicolons.
|
|
160
|
+
* Handles semicolons inside quoted strings correctly.
|
|
161
|
+
*/
|
|
162
|
+
splitStatements(input) {
|
|
163
|
+
const statements = [];
|
|
164
|
+
let inSingleQuote = false;
|
|
165
|
+
let inDoubleQuote = false;
|
|
166
|
+
let lastSplit = 0;
|
|
167
|
+
for (let i = 0; i < input.length; i++) {
|
|
168
|
+
const ch = input[i];
|
|
169
|
+
if (ch === "'" && !inDoubleQuote) {
|
|
170
|
+
inSingleQuote = !inSingleQuote;
|
|
171
|
+
}
|
|
172
|
+
else if (ch === '"' && !inSingleQuote) {
|
|
173
|
+
inDoubleQuote = !inDoubleQuote;
|
|
174
|
+
}
|
|
175
|
+
else if (ch === ';' && !inSingleQuote && !inDoubleQuote) {
|
|
176
|
+
statements.push({ text: input.slice(lastSplit, i + 1), start: lastSplit });
|
|
177
|
+
lastSplit = i + 1;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (lastSplit < input.length) {
|
|
181
|
+
statements.push({ text: input.slice(lastSplit), start: lastSplit });
|
|
182
|
+
}
|
|
183
|
+
return statements;
|
|
184
|
+
}
|
|
114
185
|
/**
|
|
115
186
|
* Get the input string that has been parsed.
|
|
116
187
|
*/
|
|
@@ -360,7 +431,7 @@ export class BasicSQL {
|
|
|
360
431
|
const core = new CodeCompletionCore(sqlParserIns);
|
|
361
432
|
core.preferredRules = this.preferredRules;
|
|
362
433
|
// core.showRuleStack = true;
|
|
363
|
-
//
|
|
434
|
+
// core.showResult = true;
|
|
364
435
|
const candidates = core.collectCandidates(caretTokenIndex, parseTree);
|
|
365
436
|
const originalSuggestions = this.processCandidates(candidates, allTokens, caretTokenIndex);
|
|
366
437
|
const syntaxSuggestions = originalSuggestions.syntax.map((syntaxCtx) => {
|
|
@@ -436,20 +436,8 @@ export class EntityCollector {
|
|
|
436
436
|
}
|
|
437
437
|
else {
|
|
438
438
|
// Do not collect column and queryResult entities if they are not inside a select statement
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
// Keep non-COLUMN and non-QUERY_RESULT entities
|
|
442
|
-
if (entity.entityContextType !== EntityContextType.COLUMN &&
|
|
443
|
-
entity.entityContextType !== EntityContextType.QUERY_RESULT) {
|
|
444
|
-
return true;
|
|
445
|
-
}
|
|
446
|
-
// Also keep empty QUERY_RESULT entities (text === '')
|
|
447
|
-
if (entity.entityContextType === EntityContextType.QUERY_RESULT &&
|
|
448
|
-
entity.text === '') {
|
|
449
|
-
return true;
|
|
450
|
-
}
|
|
451
|
-
return false;
|
|
452
|
-
});
|
|
439
|
+
return entitiesInsideStmt.filter((entity) => entity.entityContextType !== EntityContextType.COLUMN &&
|
|
440
|
+
entity.entityContextType !== EntityContextType.QUERY_RESULT);
|
|
453
441
|
}
|
|
454
442
|
}
|
|
455
443
|
combineQueryResultStmtEntities(stmtContext, entitiesInsideStmt) {
|
|
@@ -36,7 +36,6 @@ export class FlinkSQL extends BasicSQL {
|
|
|
36
36
|
FlinkSqlParser.RULE_functionNameCreate, // functionName that will be created
|
|
37
37
|
FlinkSqlParser.RULE_columnName,
|
|
38
38
|
FlinkSqlParser.RULE_columnNamePath,
|
|
39
|
-
FlinkSqlParser.RULE_columnNamePathAllowEmpty,
|
|
40
39
|
FlinkSqlParser.RULE_columnNameCreate,
|
|
41
40
|
FlinkSqlParser.RULE_tablePropertyKey,
|
|
42
41
|
FlinkSqlParser.RULE_tablePropertyValue,
|
|
@@ -117,15 +116,13 @@ export class FlinkSQL extends BasicSQL {
|
|
|
117
116
|
syntaxContextType = EntityContextType.COLUMN_CREATE;
|
|
118
117
|
break;
|
|
119
118
|
}
|
|
120
|
-
case FlinkSqlParser.RULE_columnNamePath:
|
|
121
|
-
case FlinkSqlParser.RULE_columnNamePathAllowEmpty: {
|
|
119
|
+
case FlinkSqlParser.RULE_columnNamePath: {
|
|
122
120
|
if (candidateRule.ruleList.includes(FlinkSqlParser.RULE_selectClause) ||
|
|
123
121
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_whereClause) ||
|
|
124
122
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_groupByClause) ||
|
|
125
123
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_limitClause) ||
|
|
126
124
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_whenClause) ||
|
|
127
|
-
candidateRule.ruleList.includes(FlinkSqlParser.RULE_havingClause)
|
|
128
|
-
candidateRule.ruleList.includes(FlinkSqlParser.RULE_joinCondition)) {
|
|
125
|
+
candidateRule.ruleList.includes(FlinkSqlParser.RULE_havingClause)) {
|
|
129
126
|
syntaxContextType = EntityContextType.COLUMN;
|
|
130
127
|
}
|
|
131
128
|
break;
|
|
@@ -25,7 +25,6 @@ export class MySQL extends BasicSQL {
|
|
|
25
25
|
MySqlParser.RULE_functionName,
|
|
26
26
|
MySqlParser.RULE_functionNameCreate,
|
|
27
27
|
MySqlParser.RULE_columnName,
|
|
28
|
-
MySqlParser.RULE_columnNamePath,
|
|
29
28
|
MySqlParser.RULE_columnNameCreate,
|
|
30
29
|
...this.excludeKeywordRules,
|
|
31
30
|
]);
|
|
@@ -89,8 +88,7 @@ export class MySQL extends BasicSQL {
|
|
|
89
88
|
syntaxContextType = EntityContextType.FUNCTION_CREATE;
|
|
90
89
|
break;
|
|
91
90
|
}
|
|
92
|
-
case MySqlParser.RULE_columnName:
|
|
93
|
-
case MySqlParser.RULE_columnNamePath: {
|
|
91
|
+
case MySqlParser.RULE_columnName: {
|
|
94
92
|
syntaxContextType = EntityContextType.COLUMN;
|
|
95
93
|
break;
|
|
96
94
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ColumnCreateTableContext, ColumnNameCreateContext, CopyCreateTableContext, CreateDatabaseContext, CreateFunctionContext, CreateFunctionLoadableContext, CreateViewContext, DatabaseNameContext, DatabaseNameCreateContext, FunctionNameCreateContext, InsertStatementContext, QueryCreateTableContext,
|
|
1
|
+
import { ColumnCreateTableContext, ColumnNameCreateContext, CopyCreateTableContext, CreateDatabaseContext, CreateFunctionContext, CreateFunctionLoadableContext, CreateViewContext, DatabaseNameContext, DatabaseNameCreateContext, FunctionNameCreateContext, InsertStatementContext, QueryCreateTableContext, SelectExpressionElementContext, SelectStatementContext, SingleStatementContext, TableNameContext, TableNameCreateContext, ViewNameContext, ViewNameCreateContext, TableAllColumnsContext, SelectLiteralColumnNameContext, AtomSubQueryTableSourceContext, SelectElementsContext, PureAllColumnsContext } from '../../lib/mysql/MySqlParser';
|
|
2
2
|
import type { MySqlParserListener } from '../../lib/mysql/MySqlParserListener';
|
|
3
3
|
import { EntityCollector } from '../common/entityCollector';
|
|
4
4
|
export declare class MySqlEntityCollector extends EntityCollector implements MySqlParserListener {
|
|
@@ -18,7 +18,6 @@ export declare class MySqlEntityCollector extends EntityCollector implements MyS
|
|
|
18
18
|
exitTableAllColumns(ctx: TableAllColumnsContext): void;
|
|
19
19
|
exitPureAllColumns(ctx: PureAllColumnsContext): void;
|
|
20
20
|
exitSelectLiteralColumnName(ctx: SelectLiteralColumnNameContext): void;
|
|
21
|
-
exitSelectElement_dot_empty(ctx: SelectElement_dot_emptyContext): void;
|
|
22
21
|
exitSelectExpressionElement(ctx: SelectExpressionElementContext): void;
|
|
23
22
|
/** ===== Statement begin */
|
|
24
23
|
enterSingleStatement(ctx: SingleStatementContext): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ColumnCreateTableContext, CreateDefinitionContext, CreateFunctionContext, TableSourceItemContext, AtomTableItemContext, SubqueryTableItemContext,
|
|
1
|
+
import { ColumnCreateTableContext, CreateDefinitionContext, CreateFunctionContext, SelectElementContext, TableSourceItemContext, AtomTableItemContext, SubqueryTableItemContext, } from '../../lib/mysql/MySqlParser';
|
|
2
2
|
import { AttrName, ColumnDeclareType, EntityCollector, StmtContextType, TableDeclareType, } from '../common/entityCollector';
|
|
3
3
|
import { EntityContextType } from '../common/types';
|
|
4
4
|
export class MySqlEntityCollector extends EntityCollector {
|
|
@@ -79,30 +79,20 @@ export class MySqlEntityCollector extends EntityCollector {
|
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
exitSelectLiteralColumnName(ctx) {
|
|
82
|
-
// Handle empty column case (e.g., "select from")
|
|
83
|
-
// When emptyColumn matches, the context has no actual tokens
|
|
84
|
-
if (!ctx.start || !ctx.stop || ctx.start.start > ctx.stop.stop) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
82
|
this.pushEntity(ctx, EntityContextType.COLUMN, [
|
|
88
83
|
{
|
|
89
84
|
attrName: AttrName.alias,
|
|
90
|
-
endContextList: [
|
|
85
|
+
endContextList: [SelectElementContext.name],
|
|
91
86
|
},
|
|
92
87
|
], {
|
|
93
88
|
declareType: ColumnDeclareType.LITERAL,
|
|
94
89
|
});
|
|
95
90
|
}
|
|
96
|
-
exitSelectElement_dot_empty(ctx) {
|
|
97
|
-
this.pushEntity(ctx, EntityContextType.COLUMN, [], {
|
|
98
|
-
declareType: ColumnDeclareType.LITERAL,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
91
|
exitSelectExpressionElement(ctx) {
|
|
102
92
|
this.pushEntity(ctx, EntityContextType.COLUMN, [
|
|
103
93
|
{
|
|
104
94
|
attrName: AttrName.alias,
|
|
105
|
-
endContextList: [
|
|
95
|
+
endContextList: [SelectElementContext.name],
|
|
106
96
|
},
|
|
107
97
|
], {
|
|
108
98
|
declareType: ColumnDeclareType.EXPRESSION,
|
|
@@ -14,7 +14,6 @@ export class MysqlErrorListener extends ParseErrorListener {
|
|
|
14
14
|
[MySqlParser.RULE_functionName, 'function'],
|
|
15
15
|
[MySqlParser.RULE_functionNameCreate, 'function'],
|
|
16
16
|
[MySqlParser.RULE_columnName, 'column'],
|
|
17
|
-
[MySqlParser.RULE_columnNamePath, 'column'],
|
|
18
17
|
[MySqlParser.RULE_columnNameCreate, 'column'],
|
|
19
18
|
]);
|
|
20
19
|
}
|
|
@@ -49,7 +48,6 @@ export class MysqlErrorListener extends ParseErrorListener {
|
|
|
49
48
|
case MySqlParser.RULE_tableName:
|
|
50
49
|
case MySqlParser.RULE_functionName:
|
|
51
50
|
case MySqlParser.RULE_viewName:
|
|
52
|
-
case MySqlParser.RULE_columnNamePath:
|
|
53
51
|
case MySqlParser.RULE_columnName: {
|
|
54
52
|
if (!result.includes(`{existing}${name}`)) {
|
|
55
53
|
result.push(`{existing}${name}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AlterTableStmtContext, type ColumnCreateTableContext, type ColumnNameCreateContext, type CreateDatabaseContext, type CreateForeignTableContext, type CreateFunctionStmtContext, type CreateMaterializedViewContext, type CreatePartitionForeignTableContext, type CreateViewContext, type DatabaseNameContext, type DatabaseNameCreateContext,
|
|
1
|
+
import { type AlterTableStmtContext, type ColumnCreateTableContext, type ColumnNameCreateContext, type CreateDatabaseContext, type CreateForeignTableContext, type CreateFunctionStmtContext, type CreateMaterializedViewContext, type CreatePartitionForeignTableContext, type CreateViewContext, type DatabaseNameContext, type DatabaseNameCreateContext, type FunctionNameCreateContext, type InsertStatementContext, type ProcedureNameContext, type ProcedureNameCreateContext, type QueryCreateTableContext, SelectExpressionColumnNameContext, SelectLiteralColumnNameContext, type SelectStatementContext, type SingleStmtContext, TableAllColumnsContext, type TableNameContext, type TableNameCreateContext, type ViewNameContext, type ViewNameCreateContext, TargetListContext, SelectNoParensContext, XmlTableContext, FuncTableContext, SelectWithParensContext } from '../../lib/postgresql/PostgreSqlParser';
|
|
2
2
|
import type { PostgreSqlParserListener } from '../../lib/postgresql/PostgreSqlParserListener';
|
|
3
3
|
import { EntityCollector } from '../common/entityCollector';
|
|
4
4
|
export declare class PostgreSqlEntityCollector extends EntityCollector implements PostgreSqlParserListener {
|
|
@@ -16,8 +16,6 @@ export declare class PostgreSqlEntityCollector extends EntityCollector implement
|
|
|
16
16
|
exitColumnNameCreate(ctx: ColumnNameCreateContext): void;
|
|
17
17
|
exitTargetList(ctx: TargetListContext): void;
|
|
18
18
|
exitTableAllColumns(ctx: TableAllColumnsContext): void;
|
|
19
|
-
exitTarget_empty(ctx: Target_emptyContext): void;
|
|
20
|
-
exitTarget_dot_empty(ctx: Target_dot_emptyContext): void;
|
|
21
19
|
exitSelectExpressionColumnName(ctx: SelectExpressionColumnNameContext): void;
|
|
22
20
|
exitSelectLiteralColumnName(ctx: SelectLiteralColumnNameContext): void;
|
|
23
21
|
exitProcedureName(ctx: ProcedureNameContext): void;
|
|
@@ -81,7 +81,6 @@ export class PostgreSqlEntityCollector extends EntityCollector {
|
|
|
81
81
|
]);
|
|
82
82
|
}
|
|
83
83
|
exitTargetList(ctx) {
|
|
84
|
-
// Only create QUERY_RESULT for targetList that is direct child of simpleSelect
|
|
85
84
|
if (!isChildContextOf(ctx, PostgreSqlParser.RULE_simpleSelect))
|
|
86
85
|
return;
|
|
87
86
|
this.pushEntity(ctx, EntityContextType.QUERY_RESULT);
|
|
@@ -93,18 +92,6 @@ export class PostgreSqlEntityCollector extends EntityCollector {
|
|
|
93
92
|
declareType: ColumnDeclareType.ALL,
|
|
94
93
|
});
|
|
95
94
|
}
|
|
96
|
-
exitTarget_empty(ctx) {
|
|
97
|
-
// Don't create entity for empty column here
|
|
98
|
-
// The targetList will create QUERY_RESULT entity
|
|
99
|
-
// Empty targetEl means the QUERY_RESULT has no columns
|
|
100
|
-
}
|
|
101
|
-
exitTarget_dot_empty(ctx) {
|
|
102
|
-
// Create COLUMN entity for incomplete column reference (e.g., "tb.|")
|
|
103
|
-
// This allows completion to suggest columns from table "tb"
|
|
104
|
-
this.pushEntity(ctx, EntityContextType.COLUMN, [], {
|
|
105
|
-
declareType: ColumnDeclareType.LITERAL,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
95
|
exitSelectExpressionColumnName(ctx) {
|
|
109
96
|
this.pushEntity(ctx, EntityContextType.COLUMN, [
|
|
110
97
|
{
|
|
@@ -30,7 +30,6 @@ export class SparkSQL extends BasicSQL {
|
|
|
30
30
|
SparkSqlParser.RULE_functionNameCreate,
|
|
31
31
|
SparkSqlParser.RULE_columnName,
|
|
32
32
|
SparkSqlParser.RULE_columnNamePath,
|
|
33
|
-
SparkSqlParser.RULE_columnNamePathAllowEmpty,
|
|
34
33
|
SparkSqlParser.RULE_columnNameCreate,
|
|
35
34
|
...this.excludeKeywordRules,
|
|
36
35
|
]);
|
|
@@ -102,8 +101,7 @@ export class SparkSQL extends BasicSQL {
|
|
|
102
101
|
syntaxContextType = EntityContextType.COLUMN_CREATE;
|
|
103
102
|
break;
|
|
104
103
|
}
|
|
105
|
-
case SparkSqlParser.RULE_columnNamePath:
|
|
106
|
-
case SparkSqlParser.RULE_columnNamePathAllowEmpty: {
|
|
104
|
+
case SparkSqlParser.RULE_columnNamePath: {
|
|
107
105
|
if (candidateRule.ruleList.includes(SparkSqlParser.RULE_whenClause) ||
|
|
108
106
|
candidateRule.ruleList.includes(SparkSqlParser.RULE_whereClause) ||
|
|
109
107
|
candidateRule.ruleList.includes(SparkSqlParser.RULE_joinRelation) ||
|