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.
Files changed (38) hide show
  1. package/dist/lib/SQLParserBase.d.ts +13 -1
  2. package/dist/lib/SQLParserBase.js +40 -5
  3. package/dist/lib/flink/FlinkSqlParser.d.ts +222 -179
  4. package/dist/lib/flink/FlinkSqlParser.js +3300 -2949
  5. package/dist/lib/flink/FlinkSqlParserListener.d.ts +33 -0
  6. package/dist/lib/flink/FlinkSqlParserVisitor.d.ts +21 -0
  7. package/dist/lib/hive/HiveSqlParser.d.ts +274 -228
  8. package/dist/lib/hive/HiveSqlParser.js +6304 -5912
  9. package/dist/lib/hive/HiveSqlParserListener.d.ts +33 -0
  10. package/dist/lib/hive/HiveSqlParserVisitor.d.ts +21 -0
  11. package/dist/lib/impala/ImpalaSqlParser.d.ts +145 -103
  12. package/dist/lib/impala/ImpalaSqlParser.js +3687 -3320
  13. package/dist/lib/impala/ImpalaSqlParserListener.d.ts +33 -0
  14. package/dist/lib/impala/ImpalaSqlParserVisitor.d.ts +21 -0
  15. package/dist/lib/mysql/MySqlParser.d.ts +161 -94
  16. package/dist/lib/mysql/MySqlParser.js +9959 -9499
  17. package/dist/lib/mysql/MySqlParserListener.d.ts +79 -5
  18. package/dist/lib/mysql/MySqlParserVisitor.d.ts +49 -3
  19. package/dist/lib/postgresql/PostgreSqlParser.d.ts +108 -71
  20. package/dist/lib/postgresql/PostgreSqlParser.js +13330 -10388
  21. package/dist/lib/postgresql/PostgreSqlParserListener.d.ts +48 -0
  22. package/dist/lib/postgresql/PostgreSqlParserVisitor.d.ts +30 -0
  23. package/dist/lib/spark/SparkSqlParser.d.ts +185 -145
  24. package/dist/lib/spark/SparkSqlParser.js +5463 -5152
  25. package/dist/lib/spark/SparkSqlParserListener.d.ts +33 -0
  26. package/dist/lib/spark/SparkSqlParserVisitor.d.ts +21 -0
  27. package/dist/parser/common/basicSQL.d.ts +5 -5
  28. package/dist/parser/common/basicSQL.js +3 -3
  29. package/dist/parser/common/entityCollector.js +14 -2
  30. package/dist/parser/flink/index.js +5 -2
  31. package/dist/parser/mysql/index.js +3 -1
  32. package/dist/parser/mysql/mysqlEntityCollector.d.ts +2 -1
  33. package/dist/parser/mysql/mysqlEntityCollector.js +13 -3
  34. package/dist/parser/mysql/mysqlErrorListener.js +2 -0
  35. package/dist/parser/postgresql/postgreEntityCollector.d.ts +3 -1
  36. package/dist/parser/postgresql/postgreEntityCollector.js +13 -0
  37. package/dist/parser/spark/index.js +3 -1
  38. 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
- // core.showResult = true;
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
- return entitiesInsideStmt.filter((entity) => entity.entityContextType !== EntityContextType.COLUMN &&
440
- entity.entityContextType !== EntityContextType.QUERY_RESULT);
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, SelectLiteralColumnNameContext, AtomSubQueryTableSourceContext, SelectElementsContext, PureAllColumnsContext } from '../../lib/mysql/MySqlParser';
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, SelectElementContext, TableSourceItemContext, AtomTableItemContext, SubqueryTableItemContext, } from '../../lib/mysql/MySqlParser';
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: [SelectElementContext.name],
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: [SelectElementContext.name],
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, type ViewNameContext, type ViewNameCreateContext, TargetListContext, SelectNoParensContext, XmlTableContext, FuncTableContext, SelectWithParensContext } 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, 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) ||
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.1",
4
4
  "authors": "DTStack Corporation",
5
5
  "description": "SQL Parsers for BigData, built with antlr4",
6
6
  "keywords": [