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.
Files changed (40) hide show
  1. package/dist/lib/SQLParserBase.d.ts +1 -13
  2. package/dist/lib/SQLParserBase.js +5 -40
  3. package/dist/lib/flink/FlinkSqlLexer.d.ts +399 -397
  4. package/dist/lib/flink/FlinkSqlLexer.js +2504 -2489
  5. package/dist/lib/flink/FlinkSqlParser.d.ts +726 -617
  6. package/dist/lib/flink/FlinkSqlParser.js +4861 -3558
  7. package/dist/lib/flink/FlinkSqlParserListener.d.ts +90 -33
  8. package/dist/lib/flink/FlinkSqlParserVisitor.d.ts +57 -21
  9. package/dist/lib/hive/HiveSqlParser.d.ts +228 -274
  10. package/dist/lib/hive/HiveSqlParser.js +5912 -6304
  11. package/dist/lib/hive/HiveSqlParserListener.d.ts +0 -33
  12. package/dist/lib/hive/HiveSqlParserVisitor.d.ts +0 -21
  13. package/dist/lib/impala/ImpalaSqlParser.d.ts +103 -145
  14. package/dist/lib/impala/ImpalaSqlParser.js +3320 -3687
  15. package/dist/lib/impala/ImpalaSqlParserListener.d.ts +0 -33
  16. package/dist/lib/impala/ImpalaSqlParserVisitor.d.ts +0 -21
  17. package/dist/lib/mysql/MySqlParser.d.ts +94 -161
  18. package/dist/lib/mysql/MySqlParser.js +9499 -9959
  19. package/dist/lib/mysql/MySqlParserListener.d.ts +5 -79
  20. package/dist/lib/mysql/MySqlParserVisitor.d.ts +3 -49
  21. package/dist/lib/postgresql/PostgreSqlParser.d.ts +71 -108
  22. package/dist/lib/postgresql/PostgreSqlParser.js +10388 -13330
  23. package/dist/lib/postgresql/PostgreSqlParserListener.d.ts +0 -48
  24. package/dist/lib/postgresql/PostgreSqlParserVisitor.d.ts +0 -30
  25. package/dist/lib/spark/SparkSqlParser.d.ts +145 -185
  26. package/dist/lib/spark/SparkSqlParser.js +5109 -5420
  27. package/dist/lib/spark/SparkSqlParserListener.d.ts +0 -33
  28. package/dist/lib/spark/SparkSqlParserVisitor.d.ts +0 -21
  29. package/dist/parser/common/basicSQL.d.ts +17 -5
  30. package/dist/parser/common/basicSQL.js +74 -3
  31. package/dist/parser/common/entityCollector.js +2 -14
  32. package/dist/parser/flink/index.js +2 -5
  33. package/dist/parser/mysql/index.js +1 -3
  34. package/dist/parser/mysql/mysqlEntityCollector.d.ts +1 -2
  35. package/dist/parser/mysql/mysqlEntityCollector.js +3 -13
  36. package/dist/parser/mysql/mysqlErrorListener.js +0 -2
  37. package/dist/parser/postgresql/postgreEntityCollector.d.ts +1 -3
  38. package/dist/parser/postgresql/postgreEntityCollector.js +0 -13
  39. package/dist/parser/spark/index.js +1 -3
  40. 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 { ErrorStrategy } from './errorStrategy';
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
- // core.showResult = true;
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
- // 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
- });
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, SelectElementsContext, SelectExpressionElementContext, SelectLiteralColumnNameContext, SelectStatementContext, SingleStatementContext, TableNameContext, TableNameCreateContext, ViewNameContext, ViewNameCreateContext, TableAllColumnsContext, AtomSubQueryTableSourceContext, PureAllColumnsContext, SelectElement_dot_emptyContext } from '../../lib/mysql/MySqlParser';
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, SelectElement_labelContext, SelectElement_exprContext, } from '../../lib/mysql/MySqlParser';
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: [SelectElement_labelContext.name],
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: [SelectElement_exprContext.name],
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, 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';
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) ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dt-sql-parser",
3
- "version": "4.5.0-beta.1",
3
+ "version": "4.5.0-beta.3",
4
4
  "authors": "DTStack Corporation",
5
5
  "description": "SQL Parsers for BigData, built with antlr4",
6
6
  "keywords": [