dt-sql-parser 4.5.0-beta.0 → 4.5.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/dist/lib/SQLParserBase.d.ts +13 -1
- package/dist/lib/SQLParserBase.js +40 -5
- package/dist/lib/flink/FlinkSqlParser.d.ts +222 -179
- package/dist/lib/flink/FlinkSqlParser.js +3300 -2949
- package/dist/lib/flink/FlinkSqlParserListener.d.ts +33 -0
- package/dist/lib/flink/FlinkSqlParserVisitor.d.ts +21 -0
- package/dist/lib/hive/HiveSqlParser.d.ts +274 -228
- package/dist/lib/hive/HiveSqlParser.js +6304 -5912
- package/dist/lib/hive/HiveSqlParserListener.d.ts +33 -0
- package/dist/lib/hive/HiveSqlParserVisitor.d.ts +21 -0
- package/dist/lib/impala/ImpalaSqlParser.d.ts +145 -103
- package/dist/lib/impala/ImpalaSqlParser.js +3687 -3320
- package/dist/lib/impala/ImpalaSqlParserListener.d.ts +33 -0
- package/dist/lib/impala/ImpalaSqlParserVisitor.d.ts +21 -0
- package/dist/lib/mysql/MySqlParser.d.ts +161 -94
- package/dist/lib/mysql/MySqlParser.js +9959 -9499
- package/dist/lib/mysql/MySqlParserListener.d.ts +79 -5
- package/dist/lib/mysql/MySqlParserVisitor.d.ts +49 -3
- package/dist/lib/postgresql/PostgreSqlParser.d.ts +108 -71
- package/dist/lib/postgresql/PostgreSqlParser.js +13330 -10388
- package/dist/lib/postgresql/PostgreSqlParserListener.d.ts +48 -0
- package/dist/lib/postgresql/PostgreSqlParserVisitor.d.ts +30 -0
- package/dist/lib/spark/SparkSqlParser.d.ts +185 -145
- package/dist/lib/spark/SparkSqlParser.js +5463 -5152
- package/dist/lib/spark/SparkSqlParserListener.d.ts +33 -0
- package/dist/lib/spark/SparkSqlParserVisitor.d.ts +21 -0
- package/dist/parser/common/basicSQL.d.ts +5 -5
- package/dist/parser/common/basicSQL.js +3 -3
- package/dist/parser/common/entityCollector.js +14 -2
- package/dist/parser/flink/index.js +5 -2
- package/dist/parser/mysql/index.js +3 -1
- package/dist/parser/mysql/mysqlEntityCollector.d.ts +2 -1
- package/dist/parser/mysql/mysqlEntityCollector.js +13 -3
- package/dist/parser/mysql/mysqlErrorListener.js +2 -0
- package/dist/parser/postgresql/postgreEntityCollector.d.ts +3 -1
- package/dist/parser/postgresql/postgreEntityCollector.js +13 -0
- package/dist/parser/spark/index.js +3 -1
- package/package.json +1 -1
|
@@ -131,8 +131,10 @@ 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";
|
|
134
135
|
import { ColumnNameContext } from "./SparkSqlParser.js";
|
|
135
136
|
import { ColumnNamePathContext } from "./SparkSqlParser.js";
|
|
137
|
+
import { ColumnNamePathAllowEmptyContext } from "./SparkSqlParser.js";
|
|
136
138
|
import { ColumnNameSeqContext } from "./SparkSqlParser.js";
|
|
137
139
|
import { ColumnNameCreateContext } from "./SparkSqlParser.js";
|
|
138
140
|
import { IdentifierReferenceContext } from "./SparkSqlParser.js";
|
|
@@ -206,6 +208,7 @@ import { TableAliasContext } from "./SparkSqlParser.js";
|
|
|
206
208
|
import { RowFormatContext } from "./SparkSqlParser.js";
|
|
207
209
|
import { MultipartIdentifierListContext } from "./SparkSqlParser.js";
|
|
208
210
|
import { MultipartIdentifierContext } from "./SparkSqlParser.js";
|
|
211
|
+
import { MultipartIdentifierAllowEmptyContext } from "./SparkSqlParser.js";
|
|
209
212
|
import { MultipartIdentifierPropertyListContext } from "./SparkSqlParser.js";
|
|
210
213
|
import { MultipartIdentifierPropertyContext } from "./SparkSqlParser.js";
|
|
211
214
|
import { TableIdentifierContext } from "./SparkSqlParser.js";
|
|
@@ -1796,6 +1799,16 @@ export declare class SparkSqlParserListener implements ParseTreeListener {
|
|
|
1796
1799
|
* @param ctx the parse tree
|
|
1797
1800
|
*/
|
|
1798
1801
|
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;
|
|
1799
1812
|
/**
|
|
1800
1813
|
* Enter a parse tree produced by `SparkSqlParser.columnName`.
|
|
1801
1814
|
* @param ctx the parse tree
|
|
@@ -1816,6 +1829,16 @@ export declare class SparkSqlParserListener implements ParseTreeListener {
|
|
|
1816
1829
|
* @param ctx the parse tree
|
|
1817
1830
|
*/
|
|
1818
1831
|
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;
|
|
1819
1842
|
/**
|
|
1820
1843
|
* Enter a parse tree produced by `SparkSqlParser.columnNameSeq`.
|
|
1821
1844
|
* @param ctx the parse tree
|
|
@@ -2556,6 +2579,16 @@ export declare class SparkSqlParserListener implements ParseTreeListener {
|
|
|
2556
2579
|
* @param ctx the parse tree
|
|
2557
2580
|
*/
|
|
2558
2581
|
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;
|
|
2559
2592
|
/**
|
|
2560
2593
|
* Enter a parse tree produced by `SparkSqlParser.multipartIdentifierPropertyList`.
|
|
2561
2594
|
* @param ctx the parse tree
|
|
@@ -131,8 +131,10 @@ 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";
|
|
134
135
|
import { ColumnNameContext } from "./SparkSqlParser.js";
|
|
135
136
|
import { ColumnNamePathContext } from "./SparkSqlParser.js";
|
|
137
|
+
import { ColumnNamePathAllowEmptyContext } from "./SparkSqlParser.js";
|
|
136
138
|
import { ColumnNameSeqContext } from "./SparkSqlParser.js";
|
|
137
139
|
import { ColumnNameCreateContext } from "./SparkSqlParser.js";
|
|
138
140
|
import { IdentifierReferenceContext } from "./SparkSqlParser.js";
|
|
@@ -206,6 +208,7 @@ import { TableAliasContext } from "./SparkSqlParser.js";
|
|
|
206
208
|
import { RowFormatContext } from "./SparkSqlParser.js";
|
|
207
209
|
import { MultipartIdentifierListContext } from "./SparkSqlParser.js";
|
|
208
210
|
import { MultipartIdentifierContext } from "./SparkSqlParser.js";
|
|
211
|
+
import { MultipartIdentifierAllowEmptyContext } from "./SparkSqlParser.js";
|
|
209
212
|
import { MultipartIdentifierPropertyListContext } from "./SparkSqlParser.js";
|
|
210
213
|
import { MultipartIdentifierPropertyContext } from "./SparkSqlParser.js";
|
|
211
214
|
import { TableIdentifierContext } from "./SparkSqlParser.js";
|
|
@@ -1175,6 +1178,12 @@ export declare class SparkSqlParserVisitor<Result> extends AbstractParseTreeVisi
|
|
|
1175
1178
|
* @return the visitor result
|
|
1176
1179
|
*/
|
|
1177
1180
|
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;
|
|
1178
1187
|
/**
|
|
1179
1188
|
* Visit a parse tree produced by `SparkSqlParser.columnName`.
|
|
1180
1189
|
* @param ctx the parse tree
|
|
@@ -1187,6 +1196,12 @@ export declare class SparkSqlParserVisitor<Result> extends AbstractParseTreeVisi
|
|
|
1187
1196
|
* @return the visitor result
|
|
1188
1197
|
*/
|
|
1189
1198
|
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;
|
|
1190
1205
|
/**
|
|
1191
1206
|
* Visit a parse tree produced by `SparkSqlParser.columnNameSeq`.
|
|
1192
1207
|
* @param ctx the parse tree
|
|
@@ -1630,6 +1645,12 @@ export declare class SparkSqlParserVisitor<Result> extends AbstractParseTreeVisi
|
|
|
1630
1645
|
* @return the visitor result
|
|
1631
1646
|
*/
|
|
1632
1647
|
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;
|
|
1633
1654
|
/**
|
|
1634
1655
|
* Visit a parse tree produced by `SparkSqlParser.multipartIdentifierPropertyList`.
|
|
1635
1656
|
* @param ctx the parse tree
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { Lexer, Token, CommonTokenStream, CharStream, ParserRuleContext, ParseTreeListener, ANTLRErrorListener, Parser } from 'antlr4ng';
|
|
2
1
|
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';
|
|
8
4
|
import type { EntityCollector } from './entityCollector';
|
|
9
5
|
import { EntityContext } from './entityCollector';
|
|
6
|
+
import { ErrorListener, ParseError } from './parseErrorListener';
|
|
10
7
|
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.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { CharStreams, CommonTokenStream, ParseTreeWalker, PredictionMode, } from 'antlr4ng';
|
|
2
1
|
import { CodeCompletionCore } from 'antlr4-c3';
|
|
2
|
+
import { CharStreams, CommonTokenStream, ParseTreeWalker, PredictionMode, } from 'antlr4ng';
|
|
3
|
+
import { ErrorStrategy } from './errorStrategy';
|
|
3
4
|
import { findCaretTokenIndex } from './findCaretTokenIndex';
|
|
4
5
|
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.
|
|
@@ -360,7 +360,7 @@ export class BasicSQL {
|
|
|
360
360
|
const core = new CodeCompletionCore(sqlParserIns);
|
|
361
361
|
core.preferredRules = this.preferredRules;
|
|
362
362
|
// core.showRuleStack = true;
|
|
363
|
-
//
|
|
363
|
+
// core.showResult = true;
|
|
364
364
|
const candidates = core.collectCandidates(caretTokenIndex, parseTree);
|
|
365
365
|
const originalSuggestions = this.processCandidates(candidates, allTokens, caretTokenIndex);
|
|
366
366
|
const syntaxSuggestions = originalSuggestions.syntax.map((syntaxCtx) => {
|
|
@@ -436,8 +436,20 @@ 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
|
-
|
|
439
|
+
// Exception: empty column entities (text === '') should be kept
|
|
440
|
+
return entitiesInsideStmt.filter((entity) => {
|
|
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
|
+
});
|
|
441
453
|
}
|
|
442
454
|
}
|
|
443
455
|
combineQueryResultStmtEntities(stmtContext, entitiesInsideStmt) {
|
|
@@ -36,6 +36,7 @@ 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,
|
|
39
40
|
FlinkSqlParser.RULE_columnNameCreate,
|
|
40
41
|
FlinkSqlParser.RULE_tablePropertyKey,
|
|
41
42
|
FlinkSqlParser.RULE_tablePropertyValue,
|
|
@@ -116,13 +117,15 @@ export class FlinkSQL extends BasicSQL {
|
|
|
116
117
|
syntaxContextType = EntityContextType.COLUMN_CREATE;
|
|
117
118
|
break;
|
|
118
119
|
}
|
|
119
|
-
case FlinkSqlParser.RULE_columnNamePath:
|
|
120
|
+
case FlinkSqlParser.RULE_columnNamePath:
|
|
121
|
+
case FlinkSqlParser.RULE_columnNamePathAllowEmpty: {
|
|
120
122
|
if (candidateRule.ruleList.includes(FlinkSqlParser.RULE_selectClause) ||
|
|
121
123
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_whereClause) ||
|
|
122
124
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_groupByClause) ||
|
|
123
125
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_limitClause) ||
|
|
124
126
|
candidateRule.ruleList.includes(FlinkSqlParser.RULE_whenClause) ||
|
|
125
|
-
candidateRule.ruleList.includes(FlinkSqlParser.RULE_havingClause)
|
|
127
|
+
candidateRule.ruleList.includes(FlinkSqlParser.RULE_havingClause) ||
|
|
128
|
+
candidateRule.ruleList.includes(FlinkSqlParser.RULE_joinCondition)) {
|
|
126
129
|
syntaxContextType = EntityContextType.COLUMN;
|
|
127
130
|
}
|
|
128
131
|
break;
|
|
@@ -25,6 +25,7 @@ export class MySQL extends BasicSQL {
|
|
|
25
25
|
MySqlParser.RULE_functionName,
|
|
26
26
|
MySqlParser.RULE_functionNameCreate,
|
|
27
27
|
MySqlParser.RULE_columnName,
|
|
28
|
+
MySqlParser.RULE_columnNamePath,
|
|
28
29
|
MySqlParser.RULE_columnNameCreate,
|
|
29
30
|
...this.excludeKeywordRules,
|
|
30
31
|
]);
|
|
@@ -88,7 +89,8 @@ export class MySQL extends BasicSQL {
|
|
|
88
89
|
syntaxContextType = EntityContextType.FUNCTION_CREATE;
|
|
89
90
|
break;
|
|
90
91
|
}
|
|
91
|
-
case MySqlParser.RULE_columnName:
|
|
92
|
+
case MySqlParser.RULE_columnName:
|
|
93
|
+
case MySqlParser.RULE_columnNamePath: {
|
|
92
94
|
syntaxContextType = EntityContextType.COLUMN;
|
|
93
95
|
break;
|
|
94
96
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ColumnCreateTableContext, ColumnNameCreateContext, CopyCreateTableContext, CreateDatabaseContext, CreateFunctionContext, CreateFunctionLoadableContext, CreateViewContext, DatabaseNameContext, DatabaseNameCreateContext, FunctionNameCreateContext, InsertStatementContext, QueryCreateTableContext, SelectExpressionElementContext, SelectStatementContext, SingleStatementContext, TableNameContext, TableNameCreateContext, ViewNameContext, ViewNameCreateContext, TableAllColumnsContext,
|
|
1
|
+
import { ColumnCreateTableContext, ColumnNameCreateContext, CopyCreateTableContext, CreateDatabaseContext, CreateFunctionContext, CreateFunctionLoadableContext, CreateViewContext, DatabaseNameContext, DatabaseNameCreateContext, FunctionNameCreateContext, InsertStatementContext, QueryCreateTableContext, SelectElementsContext, SelectExpressionElementContext, SelectLiteralColumnNameContext, SelectStatementContext, SingleStatementContext, TableNameContext, TableNameCreateContext, ViewNameContext, ViewNameCreateContext, TableAllColumnsContext, AtomSubQueryTableSourceContext, PureAllColumnsContext, SelectElement_dot_emptyContext } 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,6 +18,7 @@ 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;
|
|
21
22
|
exitSelectExpressionElement(ctx: SelectExpressionElementContext): void;
|
|
22
23
|
/** ===== Statement begin */
|
|
23
24
|
enterSingleStatement(ctx: SingleStatementContext): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ColumnCreateTableContext, CreateDefinitionContext, CreateFunctionContext,
|
|
1
|
+
import { ColumnCreateTableContext, CreateDefinitionContext, CreateFunctionContext, TableSourceItemContext, AtomTableItemContext, SubqueryTableItemContext, SelectElement_labelContext, SelectElement_exprContext, } 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,20 +79,30 @@ 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
|
+
}
|
|
82
87
|
this.pushEntity(ctx, EntityContextType.COLUMN, [
|
|
83
88
|
{
|
|
84
89
|
attrName: AttrName.alias,
|
|
85
|
-
endContextList: [
|
|
90
|
+
endContextList: [SelectElement_labelContext.name],
|
|
86
91
|
},
|
|
87
92
|
], {
|
|
88
93
|
declareType: ColumnDeclareType.LITERAL,
|
|
89
94
|
});
|
|
90
95
|
}
|
|
96
|
+
exitSelectElement_dot_empty(ctx) {
|
|
97
|
+
this.pushEntity(ctx, EntityContextType.COLUMN, [], {
|
|
98
|
+
declareType: ColumnDeclareType.LITERAL,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
91
101
|
exitSelectExpressionElement(ctx) {
|
|
92
102
|
this.pushEntity(ctx, EntityContextType.COLUMN, [
|
|
93
103
|
{
|
|
94
104
|
attrName: AttrName.alias,
|
|
95
|
-
endContextList: [
|
|
105
|
+
endContextList: [SelectElement_exprContext.name],
|
|
96
106
|
},
|
|
97
107
|
], {
|
|
98
108
|
declareType: ColumnDeclareType.EXPRESSION,
|
|
@@ -14,6 +14,7 @@ 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'],
|
|
17
18
|
[MySqlParser.RULE_columnNameCreate, 'column'],
|
|
18
19
|
]);
|
|
19
20
|
}
|
|
@@ -48,6 +49,7 @@ export class MysqlErrorListener extends ParseErrorListener {
|
|
|
48
49
|
case MySqlParser.RULE_tableName:
|
|
49
50
|
case MySqlParser.RULE_functionName:
|
|
50
51
|
case MySqlParser.RULE_viewName:
|
|
52
|
+
case MySqlParser.RULE_columnNamePath:
|
|
51
53
|
case MySqlParser.RULE_columnName: {
|
|
52
54
|
if (!result.includes(`{existing}${name}`)) {
|
|
53
55
|
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, type FunctionNameCreateContext, type InsertStatementContext, type ProcedureNameContext, type ProcedureNameCreateContext, type QueryCreateTableContext, SelectExpressionColumnNameContext, SelectLiteralColumnNameContext, type SelectStatementContext, type SingleStmtContext, TableAllColumnsContext, type TableNameContext, type TableNameCreateContext,
|
|
1
|
+
import { type AlterTableStmtContext, type ColumnCreateTableContext, type ColumnNameCreateContext, type CreateDatabaseContext, type CreateForeignTableContext, type CreateFunctionStmtContext, type CreateMaterializedViewContext, type CreatePartitionForeignTableContext, type CreateViewContext, type DatabaseNameContext, type DatabaseNameCreateContext, FuncTableContext, type FunctionNameCreateContext, type InsertStatementContext, type ProcedureNameContext, type ProcedureNameCreateContext, type QueryCreateTableContext, SelectExpressionColumnNameContext, SelectLiteralColumnNameContext, SelectNoParensContext, type SelectStatementContext, SelectWithParensContext, type SingleStmtContext, TableAllColumnsContext, type TableNameContext, type TableNameCreateContext, Target_dot_emptyContext, Target_emptyContext, TargetListContext, type ViewNameContext, type ViewNameCreateContext, XmlTableContext } 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,6 +16,8 @@ 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;
|
|
19
21
|
exitSelectExpressionColumnName(ctx: SelectExpressionColumnNameContext): void;
|
|
20
22
|
exitSelectLiteralColumnName(ctx: SelectLiteralColumnNameContext): void;
|
|
21
23
|
exitProcedureName(ctx: ProcedureNameContext): void;
|
|
@@ -81,6 +81,7 @@ 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
|
|
84
85
|
if (!isChildContextOf(ctx, PostgreSqlParser.RULE_simpleSelect))
|
|
85
86
|
return;
|
|
86
87
|
this.pushEntity(ctx, EntityContextType.QUERY_RESULT);
|
|
@@ -92,6 +93,18 @@ export class PostgreSqlEntityCollector extends EntityCollector {
|
|
|
92
93
|
declareType: ColumnDeclareType.ALL,
|
|
93
94
|
});
|
|
94
95
|
}
|
|
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
|
+
}
|
|
95
108
|
exitSelectExpressionColumnName(ctx) {
|
|
96
109
|
this.pushEntity(ctx, EntityContextType.COLUMN, [
|
|
97
110
|
{
|
|
@@ -30,6 +30,7 @@ export class SparkSQL extends BasicSQL {
|
|
|
30
30
|
SparkSqlParser.RULE_functionNameCreate,
|
|
31
31
|
SparkSqlParser.RULE_columnName,
|
|
32
32
|
SparkSqlParser.RULE_columnNamePath,
|
|
33
|
+
SparkSqlParser.RULE_columnNamePathAllowEmpty,
|
|
33
34
|
SparkSqlParser.RULE_columnNameCreate,
|
|
34
35
|
...this.excludeKeywordRules,
|
|
35
36
|
]);
|
|
@@ -101,7 +102,8 @@ export class SparkSQL extends BasicSQL {
|
|
|
101
102
|
syntaxContextType = EntityContextType.COLUMN_CREATE;
|
|
102
103
|
break;
|
|
103
104
|
}
|
|
104
|
-
case SparkSqlParser.RULE_columnNamePath:
|
|
105
|
+
case SparkSqlParser.RULE_columnNamePath:
|
|
106
|
+
case SparkSqlParser.RULE_columnNamePathAllowEmpty: {
|
|
105
107
|
if (candidateRule.ruleList.includes(SparkSqlParser.RULE_whenClause) ||
|
|
106
108
|
candidateRule.ruleList.includes(SparkSqlParser.RULE_whereClause) ||
|
|
107
109
|
candidateRule.ruleList.includes(SparkSqlParser.RULE_joinRelation) ||
|