Skip to content

Commit 805dbfc

Browse files
committed
feat(generic): entity collector with empty column
1 parent 1e853da commit 805dbfc

10 files changed

Lines changed: 1691 additions & 996 deletions

File tree

src/grammar/generic/GenericSql.g4

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,10 @@ setQuantifier
8282
;
8383

8484
selectItem
85-
: expression (KW_AS? identifier)?
86-
| qualifiedName '.' ASTERISK
87-
| ASTERISK
85+
: expression (KW_AS? identifier)? # selectExpressionElement
86+
| qualifiedName '.' ASTERISK # selectStarElement
87+
| ASTERISK # selectAllElement
88+
| {this.shouldMatchEmpty()}? emptyColumn # selectEmptyElement
8889
;
8990

9091
fromClause
@@ -114,15 +115,15 @@ relationPrimary
114115
;
115116

116117
whereClause
117-
: KW_WHERE expression
118+
: KW_WHERE (expression | emptyColumn)
118119
;
119120

120121
groupByClause
121122
: KW_GROUP KW_BY setQuantifier? expression (',' expression)*
122123
;
123124

124125
havingClause
125-
: KW_HAVING expression
126+
: KW_HAVING (expression | emptyColumn)
126127
;
127128

128129
orderByClause
@@ -173,7 +174,11 @@ tableElement
173174
;
174175

175176
columnDefinition
176-
: columnRef dataType (KW_NOT KW_NULL)? (KW_DEFAULT expression)? (KW_PRIMARY KW_KEY)?
177+
: columnRefCreate colType=dataType (KW_NOT KW_NULL)? (KW_DEFAULT expression)? (KW_PRIMARY KW_KEY)?
178+
;
179+
180+
columnRefCreate
181+
: identifier
177182
;
178183

179184
tableConstraint
@@ -247,17 +252,17 @@ valueExpression
247252
;
248253

249254
primaryExpression
250-
: literal # literalExpression
251-
| qualifiedName '(' (setQuantifier? expression (',' expression)*)? ')' # functionCall
252-
| KW_CASE whenClause+ (KW_ELSE expression)? KW_END # searchedCaseExpression
253-
| KW_CASE expression whenClause+ (KW_ELSE expression)? KW_END # simpleCaseExpression
254-
| KW_CAST '(' expression KW_AS dataType ')' # castExpression
255-
| KW_COALESCE '(' expression (',' expression)* ')' # coalesceExpression
256-
| KW_NULLIF '(' valueExpression ',' valueExpression ')' # nullIfExpression
257-
| '(' expression ')' # parenthesizedExpression
258-
| KW_EXISTS '(' queryStatement ')' # existsExpression
259-
| subqueryExpression # subqueryExpressionDefault
260-
| qualifiedName # columnReference
255+
: literal # literalExpression
256+
| functionName '(' (setQuantifier? expression (',' expression)*)? ')' # functionCall
257+
| KW_CASE whenClause+ (KW_ELSE expression)? KW_END # searchedCaseExpression
258+
| KW_CASE expression whenClause+ (KW_ELSE expression)? KW_END # simpleCaseExpression
259+
| KW_CAST '(' expression KW_AS dataType ')' # castExpression
260+
| KW_COALESCE '(' expression (',' expression)* ')' # coalesceExpression
261+
| KW_NULLIF '(' valueExpression ',' valueExpression ')' # nullIfExpression
262+
| '(' expression ')' # parenthesizedExpression
263+
| KW_EXISTS '(' queryStatement ')' # existsExpression
264+
| subqueryExpression # subqueryExpressionDefault
265+
| columnName # columnReference
261266
;
262267

263268
whenClause
@@ -326,6 +331,15 @@ qualifiedName
326331

327332
columnRef
328333
: identifier
334+
| {this.shouldMatchEmpty()}? emptyColumn
335+
;
336+
337+
columnName
338+
: qualifiedName
339+
;
340+
341+
emptyColumn
342+
:
329343
;
330344

331345
tableName
@@ -336,6 +350,10 @@ tableNameCreate
336350
: qualifiedName
337351
;
338352

353+
functionName
354+
: qualifiedName
355+
;
356+
339357
// 非保留关键字 — 可以用作标识符的关键字
340358
// 核心结构关键字 (SELECT, FROM, WHERE, CREATE, TABLE, INSERT, UPDATE, DELETE, DROP, ALTER, SET 等) 是保留的,不能用作标识符
341359
nonReserved

src/lib/generic/GenericSql.interp

Lines changed: 5 additions & 1 deletion
Large diffs are not rendered by default.

src/lib/generic/GenericSqlListener.ts

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import { QueryTermContext } from "./GenericSqlParser.js";
2626
import { QueryPrimaryContext } from "./GenericSqlParser.js";
2727
import { QuerySpecificationContext } from "./GenericSqlParser.js";
2828
import { SetQuantifierContext } from "./GenericSqlParser.js";
29-
import { SelectItemContext } from "./GenericSqlParser.js";
29+
import { SelectExpressionElementContext } from "./GenericSqlParser.js";
30+
import { SelectStarElementContext } from "./GenericSqlParser.js";
31+
import { SelectAllElementContext } from "./GenericSqlParser.js";
32+
import { SelectEmptyElementContext } from "./GenericSqlParser.js";
3033
import { FromClauseContext } from "./GenericSqlParser.js";
3134
import { SimpleRelationContext } from "./GenericSqlParser.js";
3235
import { JoinRelationContext } from "./GenericSqlParser.js";
@@ -48,6 +51,7 @@ import { DeleteStatementContext } from "./GenericSqlParser.js";
4851
import { CreateTableStatementContext } from "./GenericSqlParser.js";
4952
import { TableElementContext } from "./GenericSqlParser.js";
5053
import { ColumnDefinitionContext } from "./GenericSqlParser.js";
54+
import { ColumnRefCreateContext } from "./GenericSqlParser.js";
5155
import { TableConstraintContext } from "./GenericSqlParser.js";
5256
import { AlterTableStatementContext } from "./GenericSqlParser.js";
5357
import { DropTableStatementContext } from "./GenericSqlParser.js";
@@ -95,8 +99,11 @@ import { BinaryLiteralContext } from "./GenericSqlParser.js";
9599
import { IdentifierContext } from "./GenericSqlParser.js";
96100
import { QualifiedNameContext } from "./GenericSqlParser.js";
97101
import { ColumnRefContext } from "./GenericSqlParser.js";
102+
import { ColumnNameContext } from "./GenericSqlParser.js";
103+
import { EmptyColumnContext } from "./GenericSqlParser.js";
98104
import { TableNameContext } from "./GenericSqlParser.js";
99105
import { TableNameCreateContext } from "./GenericSqlParser.js";
106+
import { FunctionNameContext } from "./GenericSqlParser.js";
100107
import { NonReservedContext } from "./GenericSqlParser.js";
101108

102109

@@ -300,15 +307,53 @@ export class GenericSqlListener implements ParseTreeListener {
300307
*/
301308
exitSetQuantifier?: (ctx: SetQuantifierContext) => void;
302309
/**
303-
* Enter a parse tree produced by `GenericSqlParser.selectItem`.
310+
* Enter a parse tree produced by the `selectExpressionElement`
311+
* labeled alternative in `GenericSqlParser.selectItem`.
304312
* @param ctx the parse tree
305313
*/
306-
enterSelectItem?: (ctx: SelectItemContext) => void;
314+
enterSelectExpressionElement?: (ctx: SelectExpressionElementContext) => void;
307315
/**
308-
* Exit a parse tree produced by `GenericSqlParser.selectItem`.
316+
* Exit a parse tree produced by the `selectExpressionElement`
317+
* labeled alternative in `GenericSqlParser.selectItem`.
309318
* @param ctx the parse tree
310319
*/
311-
exitSelectItem?: (ctx: SelectItemContext) => void;
320+
exitSelectExpressionElement?: (ctx: SelectExpressionElementContext) => void;
321+
/**
322+
* Enter a parse tree produced by the `selectStarElement`
323+
* labeled alternative in `GenericSqlParser.selectItem`.
324+
* @param ctx the parse tree
325+
*/
326+
enterSelectStarElement?: (ctx: SelectStarElementContext) => void;
327+
/**
328+
* Exit a parse tree produced by the `selectStarElement`
329+
* labeled alternative in `GenericSqlParser.selectItem`.
330+
* @param ctx the parse tree
331+
*/
332+
exitSelectStarElement?: (ctx: SelectStarElementContext) => void;
333+
/**
334+
* Enter a parse tree produced by the `selectAllElement`
335+
* labeled alternative in `GenericSqlParser.selectItem`.
336+
* @param ctx the parse tree
337+
*/
338+
enterSelectAllElement?: (ctx: SelectAllElementContext) => void;
339+
/**
340+
* Exit a parse tree produced by the `selectAllElement`
341+
* labeled alternative in `GenericSqlParser.selectItem`.
342+
* @param ctx the parse tree
343+
*/
344+
exitSelectAllElement?: (ctx: SelectAllElementContext) => void;
345+
/**
346+
* Enter a parse tree produced by the `selectEmptyElement`
347+
* labeled alternative in `GenericSqlParser.selectItem`.
348+
* @param ctx the parse tree
349+
*/
350+
enterSelectEmptyElement?: (ctx: SelectEmptyElementContext) => void;
351+
/**
352+
* Exit a parse tree produced by the `selectEmptyElement`
353+
* labeled alternative in `GenericSqlParser.selectItem`.
354+
* @param ctx the parse tree
355+
*/
356+
exitSelectEmptyElement?: (ctx: SelectEmptyElementContext) => void;
312357
/**
313358
* Enter a parse tree produced by `GenericSqlParser.fromClause`.
314359
* @param ctx the parse tree
@@ -527,6 +572,16 @@ export class GenericSqlListener implements ParseTreeListener {
527572
* @param ctx the parse tree
528573
*/
529574
exitColumnDefinition?: (ctx: ColumnDefinitionContext) => void;
575+
/**
576+
* Enter a parse tree produced by `GenericSqlParser.columnRefCreate`.
577+
* @param ctx the parse tree
578+
*/
579+
enterColumnRefCreate?: (ctx: ColumnRefCreateContext) => void;
580+
/**
581+
* Exit a parse tree produced by `GenericSqlParser.columnRefCreate`.
582+
* @param ctx the parse tree
583+
*/
584+
exitColumnRefCreate?: (ctx: ColumnRefCreateContext) => void;
530585
/**
531586
* Enter a parse tree produced by `GenericSqlParser.tableConstraint`.
532587
* @param ctx the parse tree
@@ -1063,6 +1118,26 @@ export class GenericSqlListener implements ParseTreeListener {
10631118
* @param ctx the parse tree
10641119
*/
10651120
exitColumnRef?: (ctx: ColumnRefContext) => void;
1121+
/**
1122+
* Enter a parse tree produced by `GenericSqlParser.columnName`.
1123+
* @param ctx the parse tree
1124+
*/
1125+
enterColumnName?: (ctx: ColumnNameContext) => void;
1126+
/**
1127+
* Exit a parse tree produced by `GenericSqlParser.columnName`.
1128+
* @param ctx the parse tree
1129+
*/
1130+
exitColumnName?: (ctx: ColumnNameContext) => void;
1131+
/**
1132+
* Enter a parse tree produced by `GenericSqlParser.emptyColumn`.
1133+
* @param ctx the parse tree
1134+
*/
1135+
enterEmptyColumn?: (ctx: EmptyColumnContext) => void;
1136+
/**
1137+
* Exit a parse tree produced by `GenericSqlParser.emptyColumn`.
1138+
* @param ctx the parse tree
1139+
*/
1140+
exitEmptyColumn?: (ctx: EmptyColumnContext) => void;
10661141
/**
10671142
* Enter a parse tree produced by `GenericSqlParser.tableName`.
10681143
* @param ctx the parse tree
@@ -1083,6 +1158,16 @@ export class GenericSqlListener implements ParseTreeListener {
10831158
* @param ctx the parse tree
10841159
*/
10851160
exitTableNameCreate?: (ctx: TableNameCreateContext) => void;
1161+
/**
1162+
* Enter a parse tree produced by `GenericSqlParser.functionName`.
1163+
* @param ctx the parse tree
1164+
*/
1165+
enterFunctionName?: (ctx: FunctionNameContext) => void;
1166+
/**
1167+
* Exit a parse tree produced by `GenericSqlParser.functionName`.
1168+
* @param ctx the parse tree
1169+
*/
1170+
exitFunctionName?: (ctx: FunctionNameContext) => void;
10861171
/**
10871172
* Enter a parse tree produced by `GenericSqlParser.nonReserved`.
10881173
* @param ctx the parse tree

0 commit comments

Comments
 (0)