dt-sql-parser 4.5.0-beta.3 → 4.5.1-beta.0
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/README.md +2 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -2
- package/dist/lib/SQLParserBase.d.ts +13 -1
- package/dist/lib/SQLParserBase.js +40 -5
- package/dist/lib/flink/FlinkSqlLexer.d.ts +397 -399
- package/dist/lib/flink/FlinkSqlLexer.js +2489 -2504
- package/dist/lib/flink/FlinkSqlParser.d.ts +617 -726
- package/dist/lib/flink/FlinkSqlParser.js +3605 -4908
- package/dist/lib/flink/FlinkSqlParserListener.d.ts +33 -90
- package/dist/lib/flink/FlinkSqlParserVisitor.d.ts +21 -57
- package/dist/lib/generic/GenericSqlLexer.d.ts +143 -0
- package/dist/lib/generic/GenericSqlLexer.js +603 -0
- package/dist/lib/generic/GenericSqlListener.d.ts +1174 -0
- package/dist/lib/generic/GenericSqlListener.js +11 -0
- package/dist/lib/generic/GenericSqlParser.d.ts +1341 -0
- package/dist/lib/generic/GenericSqlParser.js +8041 -0
- package/dist/lib/generic/GenericSqlVisitor.d.ts +737 -0
- package/dist/lib/generic/GenericSqlVisitor.js +12 -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/index.d.ts +2 -0
- package/dist/lib/index.js +2 -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 -17
- package/dist/parser/common/basicSQL.js +3 -74
- package/dist/parser/common/entityCollector.js +14 -2
- package/dist/parser/flink/index.js +5 -2
- package/dist/parser/generic/genericEntityCollector.d.ts +33 -0
- package/dist/parser/generic/genericEntityCollector.js +124 -0
- package/dist/parser/generic/genericErrorListener.d.ts +6 -0
- package/dist/parser/generic/genericErrorListener.js +56 -0
- package/dist/parser/generic/genericSemanticContextCollector.d.ts +9 -0
- package/dist/parser/generic/genericSemanticContextCollector.js +14 -0
- package/dist/parser/generic/genericSplitListener.d.ts +6 -0
- package/dist/parser/generic/genericSplitListener.js +6 -0
- package/dist/parser/generic/index.d.ts +33 -0
- package/dist/parser/generic/index.js +109 -0
- package/dist/parser/index.d.ts +1 -0
- package/dist/parser/index.js +1 -0
- 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
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { processTokenCandidates } from '../common/tokenUtils';
|
|
2
|
+
import { GenericSqlLexer } from '../../lib/generic/GenericSqlLexer';
|
|
3
|
+
import { GenericSqlParser } from '../../lib/generic/GenericSqlParser';
|
|
4
|
+
import { BasicSQL } from '../common/basicSQL';
|
|
5
|
+
import { EntityContextType, } from '../common/types';
|
|
6
|
+
import { GenericEntityCollector } from './genericEntityCollector';
|
|
7
|
+
import { GenericErrorListener } from './genericErrorListener';
|
|
8
|
+
import { GenericSplitListener } from './genericSplitListener';
|
|
9
|
+
import { GenericSemanticContextCollector } from './genericSemanticContextCollector';
|
|
10
|
+
export { GenericEntityCollector, GenericSplitListener };
|
|
11
|
+
export class GenericSQL extends BasicSQL {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super();
|
|
14
|
+
/**
|
|
15
|
+
* The rules that keywords you don't want to be suggested.
|
|
16
|
+
*/
|
|
17
|
+
this.excludeKeywordRules = new Set([GenericSqlParser.RULE_nonReserved]);
|
|
18
|
+
this.preferredRules = new Set([
|
|
19
|
+
GenericSqlParser.RULE_tableName,
|
|
20
|
+
GenericSqlParser.RULE_tableNameCreate,
|
|
21
|
+
GenericSqlParser.RULE_columnRef,
|
|
22
|
+
GenericSqlParser.RULE_columnRefCreate,
|
|
23
|
+
GenericSqlParser.RULE_columnName,
|
|
24
|
+
GenericSqlParser.RULE_functionName,
|
|
25
|
+
...this.excludeKeywordRules,
|
|
26
|
+
]);
|
|
27
|
+
this._diagnostics = (options === null || options === void 0 ? void 0 : options.diagnostics) !== false;
|
|
28
|
+
}
|
|
29
|
+
createLexerFromCharStream(charStreams) {
|
|
30
|
+
return new GenericSqlLexer(charStreams);
|
|
31
|
+
}
|
|
32
|
+
validate(input) {
|
|
33
|
+
if (!this._diagnostics) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
return super.validate(input);
|
|
37
|
+
}
|
|
38
|
+
createParserFromTokenStream(tokenStream) {
|
|
39
|
+
return new GenericSqlParser(tokenStream);
|
|
40
|
+
}
|
|
41
|
+
get splitListener() {
|
|
42
|
+
return new GenericSplitListener();
|
|
43
|
+
}
|
|
44
|
+
createErrorListener(_errorListener) {
|
|
45
|
+
const parserContext = this;
|
|
46
|
+
return new GenericErrorListener(_errorListener, parserContext, this.preferredRules);
|
|
47
|
+
}
|
|
48
|
+
createEntityCollector(input, allTokens, caretTokenIndex) {
|
|
49
|
+
return new GenericEntityCollector(input, allTokens, caretTokenIndex);
|
|
50
|
+
}
|
|
51
|
+
createSemanticContextCollector(input, caretPosition, allTokens, options) {
|
|
52
|
+
return new GenericSemanticContextCollector(input, caretPosition, allTokens, options);
|
|
53
|
+
}
|
|
54
|
+
processCandidates(candidates, allTokens, caretTokenIndex) {
|
|
55
|
+
const originalSyntaxSuggestions = [];
|
|
56
|
+
const keywords = [];
|
|
57
|
+
for (const candidate of candidates.rules) {
|
|
58
|
+
const [ruleType, candidateRule] = candidate;
|
|
59
|
+
const tokenRanges = allTokens.slice(candidateRule.startTokenIndex, caretTokenIndex + 1);
|
|
60
|
+
let syntaxContextType = void 0;
|
|
61
|
+
switch (ruleType) {
|
|
62
|
+
case GenericSqlParser.RULE_tableName: {
|
|
63
|
+
syntaxContextType = EntityContextType.TABLE;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case GenericSqlParser.RULE_tableNameCreate: {
|
|
67
|
+
syntaxContextType = EntityContextType.TABLE_CREATE;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case GenericSqlParser.RULE_columnRef: {
|
|
71
|
+
syntaxContextType = EntityContextType.COLUMN;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case GenericSqlParser.RULE_columnRefCreate: {
|
|
75
|
+
syntaxContextType = EntityContextType.COLUMN_CREATE;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case GenericSqlParser.RULE_columnName: {
|
|
79
|
+
syntaxContextType = EntityContextType.COLUMN;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case GenericSqlParser.RULE_functionName: {
|
|
83
|
+
syntaxContextType = EntityContextType.FUNCTION;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
default:
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
if (syntaxContextType &&
|
|
90
|
+
!originalSyntaxSuggestions.some((syn) => {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
return syn.syntaxContextType === syntaxContextType &&
|
|
93
|
+
((_a = syn.wordRanges.map((wordRange) => wordRange.text)) === null || _a === void 0 ? void 0 : _a.join(',')) ===
|
|
94
|
+
((_b = tokenRanges.map((tokenRange) => tokenRange.text)) === null || _b === void 0 ? void 0 : _b.join(','));
|
|
95
|
+
})) {
|
|
96
|
+
originalSyntaxSuggestions.push({
|
|
97
|
+
syntaxContextType,
|
|
98
|
+
wordRanges: tokenRanges,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const processedKeywords = processTokenCandidates(this._parser, candidates.tokens);
|
|
103
|
+
keywords.push(...processedKeywords);
|
|
104
|
+
return {
|
|
105
|
+
syntax: originalSyntaxSuggestions,
|
|
106
|
+
keywords,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
package/dist/parser/index.d.ts
CHANGED
package/dist/parser/index.js
CHANGED
|
@@ -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) ||
|