Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 35 additions & 17 deletions src/grammar/generic/GenericSql.g4
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,10 @@ setQuantifier
;

selectItem
: expression (KW_AS? identifier)?
| qualifiedName '.' ASTERISK
| ASTERISK
: expression (KW_AS? identifier)? # selectExpressionElement
| qualifiedName '.' ASTERISK # selectStarElement
| ASTERISK # selectAllElement
| {this.shouldMatchEmpty()}? emptyColumn # selectEmptyElement
;

fromClause
Expand Down Expand Up @@ -114,15 +115,15 @@ relationPrimary
;

whereClause
: KW_WHERE expression
: KW_WHERE (expression | emptyColumn)
;

groupByClause
: KW_GROUP KW_BY setQuantifier? expression (',' expression)*
;

havingClause
: KW_HAVING expression
: KW_HAVING (expression | emptyColumn)
;

orderByClause
Expand Down Expand Up @@ -173,7 +174,11 @@ tableElement
;

columnDefinition
: columnRef dataType (KW_NOT KW_NULL)? (KW_DEFAULT expression)? (KW_PRIMARY KW_KEY)?
: columnRefCreate colType=dataType (KW_NOT KW_NULL)? (KW_DEFAULT expression)? (KW_PRIMARY KW_KEY)?
;

columnRefCreate
: identifier
;

tableConstraint
Expand Down Expand Up @@ -247,17 +252,17 @@ valueExpression
;

primaryExpression
: literal # literalExpression
| qualifiedName '(' (setQuantifier? expression (',' expression)*)? ')' # functionCall
| KW_CASE whenClause+ (KW_ELSE expression)? KW_END # searchedCaseExpression
| KW_CASE expression whenClause+ (KW_ELSE expression)? KW_END # simpleCaseExpression
| KW_CAST '(' expression KW_AS dataType ')' # castExpression
| KW_COALESCE '(' expression (',' expression)* ')' # coalesceExpression
| KW_NULLIF '(' valueExpression ',' valueExpression ')' # nullIfExpression
| '(' expression ')' # parenthesizedExpression
| KW_EXISTS '(' queryStatement ')' # existsExpression
| subqueryExpression # subqueryExpressionDefault
| qualifiedName # columnReference
: literal # literalExpression
| functionName '(' (setQuantifier? expression (',' expression)*)? ')' # functionCall
| KW_CASE whenClause+ (KW_ELSE expression)? KW_END # searchedCaseExpression
| KW_CASE expression whenClause+ (KW_ELSE expression)? KW_END # simpleCaseExpression
| KW_CAST '(' expression KW_AS dataType ')' # castExpression
| KW_COALESCE '(' expression (',' expression)* ')' # coalesceExpression
| KW_NULLIF '(' valueExpression ',' valueExpression ')' # nullIfExpression
| '(' expression ')' # parenthesizedExpression
| KW_EXISTS '(' queryStatement ')' # existsExpression
| subqueryExpression # subqueryExpressionDefault
| columnName # columnReference
;

whenClause
Expand Down Expand Up @@ -326,6 +331,15 @@ qualifiedName

columnRef
: identifier
| {this.shouldMatchEmpty()}? emptyColumn
;

columnName
: qualifiedName
;

emptyColumn
:
;

tableName
Expand All @@ -336,6 +350,10 @@ tableNameCreate
: qualifiedName
;

functionName
: qualifiedName
;

// 非保留关键字 — 可以用作标识符的关键字
// 核心结构关键字 (SELECT, FROM, WHERE, CREATE, TABLE, INSERT, UPDATE, DELETE, DROP, ALTER, SET 等) 是保留的,不能用作标识符
nonReserved
Expand Down
6 changes: 5 additions & 1 deletion src/lib/generic/GenericSql.interp

Large diffs are not rendered by default.

95 changes: 90 additions & 5 deletions src/lib/generic/GenericSqlListener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ import { QueryTermContext } from "./GenericSqlParser.js";
import { QueryPrimaryContext } from "./GenericSqlParser.js";
import { QuerySpecificationContext } from "./GenericSqlParser.js";
import { SetQuantifierContext } from "./GenericSqlParser.js";
import { SelectItemContext } from "./GenericSqlParser.js";
import { SelectExpressionElementContext } from "./GenericSqlParser.js";
import { SelectStarElementContext } from "./GenericSqlParser.js";
import { SelectAllElementContext } from "./GenericSqlParser.js";
import { SelectEmptyElementContext } from "./GenericSqlParser.js";
import { FromClauseContext } from "./GenericSqlParser.js";
import { SimpleRelationContext } from "./GenericSqlParser.js";
import { JoinRelationContext } from "./GenericSqlParser.js";
Expand All @@ -48,6 +51,7 @@ import { DeleteStatementContext } from "./GenericSqlParser.js";
import { CreateTableStatementContext } from "./GenericSqlParser.js";
import { TableElementContext } from "./GenericSqlParser.js";
import { ColumnDefinitionContext } from "./GenericSqlParser.js";
import { ColumnRefCreateContext } from "./GenericSqlParser.js";
import { TableConstraintContext } from "./GenericSqlParser.js";
import { AlterTableStatementContext } from "./GenericSqlParser.js";
import { DropTableStatementContext } from "./GenericSqlParser.js";
Expand Down Expand Up @@ -95,8 +99,11 @@ import { BinaryLiteralContext } from "./GenericSqlParser.js";
import { IdentifierContext } from "./GenericSqlParser.js";
import { QualifiedNameContext } from "./GenericSqlParser.js";
import { ColumnRefContext } from "./GenericSqlParser.js";
import { ColumnNameContext } from "./GenericSqlParser.js";
import { EmptyColumnContext } from "./GenericSqlParser.js";
import { TableNameContext } from "./GenericSqlParser.js";
import { TableNameCreateContext } from "./GenericSqlParser.js";
import { FunctionNameContext } from "./GenericSqlParser.js";
import { NonReservedContext } from "./GenericSqlParser.js";


Expand Down Expand Up @@ -300,15 +307,53 @@ export class GenericSqlListener implements ParseTreeListener {
*/
exitSetQuantifier?: (ctx: SetQuantifierContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.selectItem`.
* Enter a parse tree produced by the `selectExpressionElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
enterSelectItem?: (ctx: SelectItemContext) => void;
enterSelectExpressionElement?: (ctx: SelectExpressionElementContext) => void;
/**
* Exit a parse tree produced by `GenericSqlParser.selectItem`.
* Exit a parse tree produced by the `selectExpressionElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
exitSelectItem?: (ctx: SelectItemContext) => void;
exitSelectExpressionElement?: (ctx: SelectExpressionElementContext) => void;
/**
* Enter a parse tree produced by the `selectStarElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
enterSelectStarElement?: (ctx: SelectStarElementContext) => void;
/**
* Exit a parse tree produced by the `selectStarElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
exitSelectStarElement?: (ctx: SelectStarElementContext) => void;
/**
* Enter a parse tree produced by the `selectAllElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
enterSelectAllElement?: (ctx: SelectAllElementContext) => void;
/**
* Exit a parse tree produced by the `selectAllElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
exitSelectAllElement?: (ctx: SelectAllElementContext) => void;
/**
* Enter a parse tree produced by the `selectEmptyElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
enterSelectEmptyElement?: (ctx: SelectEmptyElementContext) => void;
/**
* Exit a parse tree produced by the `selectEmptyElement`
* labeled alternative in `GenericSqlParser.selectItem`.
* @param ctx the parse tree
*/
exitSelectEmptyElement?: (ctx: SelectEmptyElementContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.fromClause`.
* @param ctx the parse tree
Expand Down Expand Up @@ -527,6 +572,16 @@ export class GenericSqlListener implements ParseTreeListener {
* @param ctx the parse tree
*/
exitColumnDefinition?: (ctx: ColumnDefinitionContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.columnRefCreate`.
* @param ctx the parse tree
*/
enterColumnRefCreate?: (ctx: ColumnRefCreateContext) => void;
/**
* Exit a parse tree produced by `GenericSqlParser.columnRefCreate`.
* @param ctx the parse tree
*/
exitColumnRefCreate?: (ctx: ColumnRefCreateContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.tableConstraint`.
* @param ctx the parse tree
Expand Down Expand Up @@ -1063,6 +1118,26 @@ export class GenericSqlListener implements ParseTreeListener {
* @param ctx the parse tree
*/
exitColumnRef?: (ctx: ColumnRefContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.columnName`.
* @param ctx the parse tree
*/
enterColumnName?: (ctx: ColumnNameContext) => void;
/**
* Exit a parse tree produced by `GenericSqlParser.columnName`.
* @param ctx the parse tree
*/
exitColumnName?: (ctx: ColumnNameContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.emptyColumn`.
* @param ctx the parse tree
*/
enterEmptyColumn?: (ctx: EmptyColumnContext) => void;
/**
* Exit a parse tree produced by `GenericSqlParser.emptyColumn`.
* @param ctx the parse tree
*/
exitEmptyColumn?: (ctx: EmptyColumnContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.tableName`.
* @param ctx the parse tree
Expand All @@ -1083,6 +1158,16 @@ export class GenericSqlListener implements ParseTreeListener {
* @param ctx the parse tree
*/
exitTableNameCreate?: (ctx: TableNameCreateContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.functionName`.
* @param ctx the parse tree
*/
enterFunctionName?: (ctx: FunctionNameContext) => void;
/**
* Exit a parse tree produced by `GenericSqlParser.functionName`.
* @param ctx the parse tree
*/
exitFunctionName?: (ctx: FunctionNameContext) => void;
/**
* Enter a parse tree produced by `GenericSqlParser.nonReserved`.
* @param ctx the parse tree
Expand Down
Loading
Loading