1098 lines
29 KiB
ANTLR
1098 lines
29 KiB
ANTLR
/*
|
|
* Copyright 2011-2023 the original author or authors.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
grammar Hql;
|
|
|
|
@header {
|
|
/**
|
|
* HQL per https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#query-language
|
|
*
|
|
* This is a mixture of Hibernate's BNF and missing bits of grammar. There are gaps and inconsistencies in the
|
|
* BNF itself, explained by other fragments of their spec. Additionally, alternate labels are used to provide easier
|
|
* management of complex rules in the generated Visitor. Finally, there are labels applied to rule elements (op=('+'|'-')
|
|
* to simplify the processing.
|
|
*
|
|
* @author Greg Turnquist
|
|
* @since 3.1
|
|
*/
|
|
}
|
|
|
|
/*
|
|
Parser rules
|
|
*/
|
|
|
|
start
|
|
: ql_statement EOF
|
|
;
|
|
|
|
ql_statement
|
|
: selectStatement
|
|
| updateStatement
|
|
| deleteStatement
|
|
| insertStatement
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-select
|
|
selectStatement
|
|
: queryExpression
|
|
;
|
|
|
|
queryExpression
|
|
: withClause? orderedQuery (setOperator orderedQuery)*
|
|
;
|
|
|
|
withClause
|
|
: WITH cte (',' cte)*
|
|
;
|
|
|
|
cte
|
|
: identifier AS (NOT? MATERIALIZED)? '(' queryExpression ')' searchClause? cycleClause?
|
|
;
|
|
|
|
searchClause
|
|
: SEARCH (BREADTH | DEPTH) FIRST BY searchSpecifications SET identifier
|
|
;
|
|
|
|
searchSpecifications
|
|
: searchSpecification (',' searchSpecification)*
|
|
;
|
|
|
|
searchSpecification
|
|
: identifier sortDirection? nullsPrecedence?
|
|
;
|
|
|
|
cycleClause
|
|
: CYCLE cteAttributes SET identifier (TO literal DEFAULT literal)? (USING identifier)?
|
|
;
|
|
|
|
cteAttributes
|
|
: identifier (',' identifier)*
|
|
;
|
|
|
|
orderedQuery
|
|
: (query | '(' queryExpression ')') queryOrder?
|
|
;
|
|
|
|
query
|
|
: selectClause fromClause? whereClause? (groupByClause havingClause?)? # SelectQuery
|
|
| fromClause whereClause? (groupByClause havingClause?)? selectClause? # FromQuery
|
|
;
|
|
|
|
queryOrder
|
|
: orderByClause limitClause? offsetClause? fetchClause?
|
|
;
|
|
|
|
fromClause
|
|
: FROM entityWithJoins (',' entityWithJoins)*
|
|
;
|
|
|
|
entityWithJoins
|
|
: fromRoot (joinSpecifier)*
|
|
;
|
|
|
|
joinSpecifier
|
|
: join
|
|
| crossJoin
|
|
| jpaCollectionJoin
|
|
;
|
|
|
|
fromRoot
|
|
: entityName variable?
|
|
| LATERAL? '(' subquery ')' variable?
|
|
;
|
|
|
|
join
|
|
: joinType JOIN FETCH? joinTarget joinRestriction? // Spec BNF says joinType isn't optional, but text says that it is.
|
|
;
|
|
|
|
joinTarget
|
|
: path variable? # JoinPath
|
|
| LATERAL? '(' subquery ')' variable? # JoinSubquery
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-update
|
|
updateStatement
|
|
: UPDATE VERSIONED? targetEntity setClause whereClause?
|
|
;
|
|
|
|
targetEntity
|
|
: entityName variable?
|
|
;
|
|
|
|
setClause
|
|
: SET assignment (',' assignment)*
|
|
;
|
|
|
|
assignment
|
|
: simplePath '=' expressionOrPredicate
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-delete
|
|
deleteStatement
|
|
: DELETE FROM? targetEntity whereClause?
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-insert
|
|
insertStatement
|
|
: INSERT INTO? targetEntity targetFields (queryExpression | valuesList)
|
|
;
|
|
|
|
// Already defined underneath updateStatement
|
|
//targetEntity
|
|
// : entityName variable?
|
|
// ;
|
|
|
|
targetFields
|
|
: '(' simplePath (',' simplePath)* ')'
|
|
;
|
|
|
|
valuesList
|
|
: VALUES values (',' values)*
|
|
;
|
|
|
|
values
|
|
: '(' expression (',' expression)* ')'
|
|
;
|
|
|
|
instantiation
|
|
: NEW instantiationTarget '(' instantiationArguments ')'
|
|
;
|
|
|
|
alias
|
|
: AS? identifier // spec says IDENTIFIER but clearly does NOT mean a reserved word
|
|
;
|
|
|
|
groupedItem
|
|
: identifier
|
|
| INTEGER_LITERAL
|
|
| expression
|
|
;
|
|
|
|
sortedItem
|
|
: sortExpression sortDirection? nullsPrecedence?
|
|
;
|
|
|
|
sortExpression
|
|
: identifier
|
|
| INTEGER_LITERAL
|
|
| expression
|
|
;
|
|
|
|
sortDirection
|
|
: ASC
|
|
| DESC
|
|
;
|
|
|
|
nullsPrecedence
|
|
: NULLS (FIRST | LAST)
|
|
;
|
|
|
|
limitClause
|
|
: LIMIT parameterOrIntegerLiteral
|
|
;
|
|
|
|
offsetClause
|
|
: OFFSET parameterOrIntegerLiteral (ROW | ROWS)?
|
|
;
|
|
|
|
fetchClause
|
|
: FETCH (FIRST | NEXT) (parameterOrIntegerLiteral | parameterOrNumberLiteral '%') (ROW | ROWS) (ONLY | WITH TIES)
|
|
;
|
|
|
|
/*******************
|
|
Gaps in the spec.
|
|
*******************/
|
|
|
|
subquery
|
|
: queryExpression
|
|
;
|
|
|
|
selectClause
|
|
: SELECT DISTINCT? selectionList
|
|
;
|
|
|
|
selectionList
|
|
: selection (',' selection)*
|
|
;
|
|
|
|
selection
|
|
: selectExpression variable?
|
|
;
|
|
|
|
selectExpression
|
|
: instantiation
|
|
| mapEntrySelection
|
|
| jpaSelectObjectSyntax
|
|
| expressionOrPredicate
|
|
;
|
|
|
|
mapEntrySelection
|
|
: ENTRY '(' path ')'
|
|
;
|
|
|
|
/**
|
|
* Deprecated syntax dating back to EJB-QL prior to EJB 3, required by JPA, never documented in Hibernate
|
|
*/
|
|
jpaSelectObjectSyntax
|
|
: OBJECT '(' identifier ')'
|
|
;
|
|
|
|
whereClause
|
|
: WHERE predicate (',' predicate)*
|
|
;
|
|
|
|
joinType
|
|
: INNER?
|
|
| (LEFT | RIGHT | FULL)? OUTER?
|
|
| CROSS
|
|
;
|
|
|
|
crossJoin
|
|
: CROSS JOIN entityName variable?
|
|
;
|
|
|
|
joinRestriction
|
|
: (ON | WITH) predicate
|
|
;
|
|
|
|
// Deprecated syntax dating back to EJB-QL prior to EJB 3, required by JPA, never documented in Hibernate
|
|
jpaCollectionJoin
|
|
: ',' IN '(' path ')' variable?
|
|
;
|
|
|
|
groupByClause
|
|
: GROUP BY groupedItem (',' groupedItem)*
|
|
;
|
|
|
|
orderByClause
|
|
: ORDER BY sortedItem (',' sortedItem)*
|
|
;
|
|
|
|
havingClause
|
|
: HAVING predicate (',' predicate)*
|
|
;
|
|
|
|
setOperator
|
|
: UNION ALL?
|
|
| INTERSECT ALL?
|
|
| EXCEPT ALL?
|
|
;
|
|
|
|
// Literals
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-literals
|
|
literal
|
|
: NULL
|
|
| booleanLiteral
|
|
| stringLiteral
|
|
| numericLiteral
|
|
| dateTimeLiteral
|
|
| binaryLiteral
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-boolean-literals
|
|
booleanLiteral
|
|
: TRUE
|
|
| FALSE
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-string-literals
|
|
stringLiteral
|
|
: STRINGLITERAL
|
|
| JAVASTRINGLITERAL
|
|
| CHARACTER
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-numeric-literals
|
|
numericLiteral
|
|
: INTEGER_LITERAL
|
|
| FLOAT_LITERAL
|
|
| HEXLITERAL
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-datetime-literals
|
|
dateTimeLiteral
|
|
: LOCAL_DATE
|
|
| LOCAL_TIME
|
|
| LOCAL_DATETIME
|
|
| CURRENT_DATE
|
|
| CURRENT_TIME
|
|
| CURRENT_TIMESTAMP
|
|
| OFFSET_DATETIME
|
|
| (LOCAL | CURRENT) DATE
|
|
| (LOCAL | CURRENT) TIME
|
|
| (LOCAL | CURRENT | OFFSET) DATETIME
|
|
| INSTANT
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-duration-literals
|
|
datetimeField
|
|
: YEAR
|
|
| MONTH
|
|
| DAY
|
|
| WEEK
|
|
| QUARTER
|
|
| HOUR
|
|
| MINUTE
|
|
| SECOND
|
|
| NANOSECOND
|
|
| EPOCH
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-binary-literals
|
|
binaryLiteral
|
|
: BINARY_LITERAL
|
|
| '{' HEXLITERAL (',' HEXLITERAL)* '}'
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-enum-literals
|
|
// TBD
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-java-constants
|
|
// TBD
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-entity-name-literals
|
|
// TBD
|
|
|
|
// Expressions
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-expressions
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-concatenation
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-numeric-arithmetic
|
|
expression
|
|
: '(' expression ')' # GroupedExpression
|
|
| '(' expressionOrPredicate (',' expressionOrPredicate)+ ')' # TupleExpression
|
|
| '(' subquery ')' # SubqueryExpression
|
|
| primaryExpression # PlainPrimaryExpression
|
|
| op=('+' | '-') numericLiteral # SignedNumericLiteral
|
|
| op=('+' | '-') expression # SignedExpression
|
|
| expression datetimeField # ToDurationExpression
|
|
| expression BY datetimeField # FromDurationExpression
|
|
| expression op=('*' | '/') expression # MultiplicationExpression
|
|
| expression op=('+' | '-') expression # AdditionExpression
|
|
| expression '||' expression # HqlConcatenationExpression
|
|
| DAY OF WEEK # DayOfWeekExpression
|
|
| DAY OF MONTH # DayOfMonthExpression
|
|
| WEEK OF YEAR # WeekOfYearExpression
|
|
;
|
|
|
|
primaryExpression
|
|
: caseList # CaseExpression
|
|
| literal # LiteralExpression
|
|
| parameter # ParameterExpression
|
|
| function # FunctionExpression
|
|
| generalPathFragment # GeneralPathExpression
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-Datetime-arithmetic
|
|
// TBD
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-path-expressions
|
|
identificationVariable
|
|
: identifier
|
|
| simplePath
|
|
;
|
|
|
|
path
|
|
: treatedPath pathContinutation?
|
|
| generalPathFragment
|
|
;
|
|
|
|
generalPathFragment
|
|
: simplePath indexedPathAccessFragment?
|
|
;
|
|
|
|
indexedPathAccessFragment
|
|
: '[' expression ']' ('.' generalPathFragment)?
|
|
;
|
|
|
|
simplePath
|
|
: identifier simplePathElement*
|
|
;
|
|
|
|
simplePathElement
|
|
: '.' identifier
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-case-expressions
|
|
caseList
|
|
: simpleCaseExpression
|
|
| searchedCaseExpression
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-simple-case-expressions
|
|
simpleCaseExpression
|
|
: CASE expressionOrPredicate caseWhenExpressionClause+ (ELSE expressionOrPredicate)? END
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-searched-case-expressions
|
|
searchedCaseExpression
|
|
: CASE caseWhenPredicateClause+ (ELSE expressionOrPredicate)? END
|
|
;
|
|
|
|
caseWhenExpressionClause
|
|
: WHEN expression THEN expressionOrPredicate
|
|
;
|
|
|
|
caseWhenPredicateClause
|
|
: WHEN predicate THEN expressionOrPredicate
|
|
;
|
|
|
|
// Functions
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-exp-functions
|
|
function
|
|
: functionName '(' (functionArguments | ASTERISK)? ')' pathContinutation? filterClause? withinGroup? overClause? # GenericFunction
|
|
| functionName '(' subquery ')' # FunctionWithSubquery
|
|
| castFunction # CastFunctionInvocation
|
|
| extractFunction # ExtractFunctionInvocation
|
|
| trimFunction # TrimFunctionInvocation
|
|
| everyFunction # EveryFunctionInvocation
|
|
| anyFunction # AnyFunctionInvocation
|
|
| treatedPath # TreatedPathInvocation
|
|
;
|
|
|
|
functionArguments
|
|
: DISTINCT? expressionOrPredicate (',' expressionOrPredicate)*
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-aggregate-functions-filter
|
|
filterClause
|
|
: FILTER '(' whereClause ')'
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-aggregate-functions-orderedset
|
|
withinGroup
|
|
: WITHIN GROUP '(' orderByClause ')'
|
|
;
|
|
|
|
overClause
|
|
: OVER '(' partitionClause? orderByClause? frameClause? ')'
|
|
;
|
|
|
|
partitionClause
|
|
: PARTITION BY expression (',' expression)*
|
|
;
|
|
|
|
frameClause
|
|
: (RANGE|ROWS|GROUPS) frameStart frameExclusion?
|
|
| (RANGE|ROWS|GROUPS) BETWEEN frameStart AND frameEnd frameExclusion?
|
|
;
|
|
|
|
frameStart
|
|
: UNBOUNDED PRECEDING # UnboundedPrecedingFrameStart
|
|
| expression PRECEDING # ExpressionPrecedingFrameStart
|
|
| CURRENT ROW # CurrentRowFrameStart
|
|
| expression FOLLOWING # ExpressionFollowingFrameStart
|
|
;
|
|
|
|
frameExclusion
|
|
: EXCLUDE CURRENT ROW # CurrentRowFrameExclusion
|
|
| EXCLUDE GROUP # GroupFrameExclusion
|
|
| EXCLUDE TIES # TiesFrameExclusion
|
|
| EXCLUDE NO OTHERS # NoOthersFrameExclusion
|
|
;
|
|
|
|
frameEnd
|
|
: expression PRECEDING # ExpressionPrecedingFrameEnd
|
|
| CURRENT ROW # CurrentRowFrameEnd
|
|
| expression FOLLOWING # ExpressionFollowingFrameEnd
|
|
| UNBOUNDED FOLLOWING # UnboundedFollowingFrameEnd
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-functions
|
|
castFunction
|
|
: CAST '(' expression AS castTarget ')'
|
|
;
|
|
|
|
castTarget
|
|
: castTargetType ('(' INTEGER_LITERAL (',' INTEGER_LITERAL)? ')')?
|
|
;
|
|
|
|
castTargetType
|
|
returns [String fullTargetName]
|
|
: (i=identifier { $fullTargetName = _localctx.i.getText(); }) ('.' c=identifier { $fullTargetName += ("." + _localctx.c.getText() ); })*
|
|
;
|
|
|
|
extractFunction
|
|
: EXTRACT '(' expression FROM expression ')'
|
|
| dateTimeFunction '(' expression ')'
|
|
;
|
|
|
|
trimFunction
|
|
: TRIM '(' (LEADING | TRAILING | BOTH)? stringLiteral? FROM? expression ')'
|
|
;
|
|
|
|
dateTimeFunction
|
|
: d=(YEAR
|
|
| MONTH
|
|
| DAY
|
|
| WEEK
|
|
| QUARTER
|
|
| HOUR
|
|
| MINUTE
|
|
| SECOND
|
|
| NANOSECOND
|
|
| EPOCH)
|
|
;
|
|
|
|
everyFunction
|
|
: every=(EVERY | ALL) '(' predicate ')'
|
|
| every=(EVERY | ALL) '(' subquery ')'
|
|
| every=(EVERY | ALL) (ELEMENTS | INDICES) '(' simplePath ')'
|
|
;
|
|
|
|
anyFunction
|
|
: any=(ANY | SOME) '(' predicate ')'
|
|
| any=(ANY | SOME) '(' subquery ')'
|
|
| any=(ANY | SOME) (ELEMENTS | INDICES) '(' simplePath ')'
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-treat-type
|
|
treatedPath
|
|
: TREAT '(' path AS simplePath')' pathContinutation?
|
|
;
|
|
|
|
pathContinutation
|
|
: '.' simplePath
|
|
;
|
|
|
|
// Predicates
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-conditional-expressions
|
|
predicate
|
|
: '(' predicate ')' # GroupedPredicate
|
|
| dealingWithNullExpression # NullExpressionPredicate
|
|
| inExpression # InPredicate
|
|
| betweenExpression # BetweenPredicate
|
|
| relationalExpression # RelationalPredicate
|
|
| stringPatternMatching # LikePredicate
|
|
| existsExpression # ExistsPredicate
|
|
| collectionExpression # CollectionPredicate
|
|
| NOT predicate # NotPredicate
|
|
| predicate AND predicate # AndPredicate
|
|
| predicate OR predicate # OrPredicate
|
|
| expression # ExpressionPredicate
|
|
;
|
|
|
|
expressionOrPredicate
|
|
: expression
|
|
| predicate
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-relational-comparisons
|
|
// NOTE: The TIP shows that "!=" is also supported. Hibernate's source code shows that "^=" is another NOT_EQUALS option as well.
|
|
relationalExpression
|
|
: expression op=('=' | '>' | '>=' | '<' | '<=' | '<>' | '!=' | '^=' ) expression
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-between-predicate
|
|
betweenExpression
|
|
: expression NOT? BETWEEN expression AND expression
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-null-predicate
|
|
dealingWithNullExpression
|
|
: expression IS NOT? NULL
|
|
| expression IS NOT? DISTINCT FROM expression
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-like-predicate
|
|
stringPatternMatching
|
|
: expression NOT? (LIKE | ILIKE) ('%')? expression ('%')? (ESCAPE (stringLiteral|parameter))?
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-elements-indices
|
|
// TBD
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-in-predicate
|
|
inExpression
|
|
: expression NOT? IN inList
|
|
;
|
|
|
|
inList
|
|
: (ELEMENTS | INDICES) '(' simplePath ')'
|
|
| '(' subquery ')'
|
|
| parameter
|
|
| '(' (expressionOrPredicate (',' expressionOrPredicate)*)? ')'
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-exists-predicate
|
|
existsExpression
|
|
: EXISTS (ELEMENTS | INDICES) '(' simplePath ')'
|
|
| EXISTS expression
|
|
;
|
|
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-collection-operators
|
|
collectionExpression
|
|
: expression IS NOT? EMPTY
|
|
| expression NOT? MEMBER OF path
|
|
;
|
|
|
|
// Projection
|
|
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-select-new
|
|
instantiationTarget
|
|
: LIST
|
|
| MAP
|
|
| simplePath
|
|
;
|
|
|
|
instantiationArguments
|
|
: instantiationArgument (',' instantiationArgument)*
|
|
;
|
|
|
|
instantiationArgument
|
|
: (expressionOrPredicate | instantiation) variable?
|
|
;
|
|
|
|
// Low level parsing rules
|
|
|
|
parameterOrIntegerLiteral
|
|
: parameter
|
|
| INTEGER_LITERAL
|
|
;
|
|
|
|
parameterOrNumberLiteral
|
|
: parameter
|
|
| numericLiteral
|
|
;
|
|
|
|
variable
|
|
: AS identifier
|
|
| reservedWord
|
|
;
|
|
|
|
parameter
|
|
: prefix=':' SPEL
|
|
| prefix=':' identifier
|
|
| prefix='?' SPEL
|
|
| prefix='?' INTEGER_LITERAL?
|
|
;
|
|
|
|
entityName
|
|
: identifier ('.' identifier)*
|
|
| SPEL
|
|
;
|
|
|
|
identifier
|
|
: reservedWord
|
|
;
|
|
|
|
character
|
|
: CHARACTER
|
|
;
|
|
|
|
functionName
|
|
: reservedWord ('.' reservedWord)*
|
|
;
|
|
|
|
reservedWord
|
|
: IDENTIFICATION_VARIABLE
|
|
| f=(ALL
|
|
| AND
|
|
| ANY
|
|
| AS
|
|
| ASC
|
|
| AVG
|
|
| BETWEEN
|
|
| BOTH
|
|
| BREADTH
|
|
| BY
|
|
| CASE
|
|
| CAST
|
|
| COLLATE
|
|
| COUNT
|
|
| CROSS
|
|
| CUBE
|
|
| CURRENT
|
|
| CURRENT_DATE
|
|
| CURRENT_INSTANT
|
|
| CURRENT_TIME
|
|
| CURRENT_TIMESTAMP
|
|
| CYCLE
|
|
| DATE
|
|
| DATETIME
|
|
| DAY
|
|
| DEFAULT
|
|
| DELETE
|
|
| DEPTH
|
|
| DESC
|
|
| DISTINCT
|
|
| ELEMENT
|
|
| ELEMENTS
|
|
| ELSE
|
|
| EMPTY
|
|
| END
|
|
| ENTRY
|
|
| EPOCH
|
|
| ERROR
|
|
| ESCAPE
|
|
| EVERY
|
|
| EXCEPT
|
|
| EXCLUDE
|
|
| EXISTS
|
|
| EXTRACT
|
|
| FETCH
|
|
| FILTER
|
|
| FIRST
|
|
| FLOOR
|
|
| FOLLOWING
|
|
| FOR
|
|
| FORMAT
|
|
| FROM
|
|
| FULL
|
|
| FUNCTION
|
|
| GROUP
|
|
| GROUPS
|
|
| HAVING
|
|
| HOUR
|
|
| ID
|
|
| IGNORE
|
|
| ILIKE
|
|
| IN
|
|
| INDEX
|
|
| INDICES
|
|
| INNER
|
|
| INSERT
|
|
| INSTANT
|
|
| INTERSECT
|
|
| INTO
|
|
| IS
|
|
| JOIN
|
|
| KEY
|
|
| LAST
|
|
| LEADING
|
|
| LEFT
|
|
| LIKE
|
|
| LIMIT
|
|
| LIST
|
|
| LISTAGG
|
|
| LOCAL
|
|
| LOCAL_DATE
|
|
| LOCAL_DATETIME
|
|
| LOCAL_TIME
|
|
| MAP
|
|
| MATERIALIZED
|
|
| MAX
|
|
| MAXELEMENT
|
|
| MAXINDEX
|
|
| MEMBER
|
|
| MICROSECOND
|
|
| MILLISECOND
|
|
| MIN
|
|
| MINELEMENT
|
|
| MININDEX
|
|
| MINUTE
|
|
| MONTH
|
|
| NANOSECOND
|
|
| NATURALID
|
|
| NEW
|
|
| NEXT
|
|
| NO
|
|
| NOT
|
|
| NULLS
|
|
| OBJECT
|
|
| OF
|
|
| OFFSET
|
|
| OFFSET_DATETIME
|
|
| ON
|
|
| ONLY
|
|
| OR
|
|
| ORDER
|
|
| OTHERS
|
|
| OUTER
|
|
| OVER
|
|
| OVERFLOW
|
|
| OVERLAY
|
|
| PAD
|
|
| PARTITION
|
|
| PERCENT
|
|
| PLACING
|
|
| POSITION
|
|
| POWER
|
|
| PRECEDING
|
|
| QUARTER
|
|
| RANGE
|
|
| RESPECT
|
|
| RIGHT
|
|
| ROLLUP
|
|
| ROW
|
|
| ROWS
|
|
| SEARCH
|
|
| SECOND
|
|
| SELECT
|
|
| SET
|
|
| SIZE
|
|
| SOME
|
|
| SUBSTRING
|
|
| SUM
|
|
| THEN
|
|
| TIES
|
|
| TIME
|
|
| TIMESTAMP
|
|
| TIMEZONE_HOUR
|
|
| TIMEZONE_MINUTE
|
|
| TO
|
|
| TRAILING
|
|
| TREAT
|
|
| TRIM
|
|
| TRUNC
|
|
| TRUNCATE
|
|
| TYPE
|
|
| UNBOUNDED
|
|
| UNION
|
|
| UPDATE
|
|
| USING
|
|
| VALUE
|
|
| VALUES
|
|
| VERSION
|
|
| VERSIONED
|
|
| WEEK
|
|
| WHEN
|
|
| WHERE
|
|
| WITH
|
|
| WITHIN
|
|
| WITHOUT
|
|
| YEAR)
|
|
;
|
|
|
|
/*
|
|
Lexer rules
|
|
*/
|
|
|
|
|
|
WS : [ \t\r\n] -> skip ;
|
|
|
|
// Build up case-insentive tokens
|
|
|
|
fragment A: 'a' | 'A';
|
|
fragment B: 'b' | 'B';
|
|
fragment C: 'c' | 'C';
|
|
fragment D: 'd' | 'D';
|
|
fragment E: 'e' | 'E';
|
|
fragment F: 'f' | 'F';
|
|
fragment G: 'g' | 'G';
|
|
fragment H: 'h' | 'H';
|
|
fragment I: 'i' | 'I';
|
|
fragment J: 'j' | 'J';
|
|
fragment K: 'k' | 'K';
|
|
fragment L: 'l' | 'L';
|
|
fragment M: 'm' | 'M';
|
|
fragment N: 'n' | 'N';
|
|
fragment O: 'o' | 'O';
|
|
fragment P: 'p' | 'P';
|
|
fragment Q: 'q' | 'Q';
|
|
fragment R: 'r' | 'R';
|
|
fragment S: 's' | 'S';
|
|
fragment T: 't' | 'T';
|
|
fragment U: 'u' | 'U';
|
|
fragment V: 'v' | 'V';
|
|
fragment W: 'w' | 'W';
|
|
fragment X: 'x' | 'X';
|
|
fragment Y: 'y' | 'Y';
|
|
fragment Z: 'z' | 'Z';
|
|
|
|
// The following are reserved identifiers:
|
|
|
|
ALL : A L L;
|
|
AND : A N D;
|
|
ANY : A N Y;
|
|
AS : A S;
|
|
ASC : A S C;
|
|
ASTERISK : '*';
|
|
AVG : A V G;
|
|
BETWEEN : B E T W E E N;
|
|
BOTH : B O T H;
|
|
BREADTH : B R E A D T H;
|
|
BY : B Y;
|
|
CASE : C A S E;
|
|
CAST : C A S T;
|
|
CEILING : C E I L I N G;
|
|
COLLATE : C O L L A T E;
|
|
COUNT : C O U N T;
|
|
CROSS : C R O S S;
|
|
CUBE : C U B E;
|
|
CURRENT : C U R R E N T;
|
|
CURRENT_DATE : C U R R E N T '_' D A T E;
|
|
CURRENT_INSTANT : C U R R E N T '_' I N S T A N T;
|
|
CURRENT_TIME : C U R R E N T '_' T I M E;
|
|
CURRENT_TIMESTAMP : C U R R E N T '_' T I M E S T A M P;
|
|
CYCLE : C Y C L E;
|
|
DATE : D A T E;
|
|
DATETIME : D A T E T I M E ;
|
|
DAY : D A Y;
|
|
DEFAULT : D E F A U L T;
|
|
DELETE : D E L E T E;
|
|
DEPTH : D E P T H;
|
|
DESC : D E S C;
|
|
DISTINCT : D I S T I N C T;
|
|
ELEMENT : E L E M E N T;
|
|
ELEMENTS : E L E M E N T S;
|
|
ELSE : E L S E;
|
|
EMPTY : E M P T Y;
|
|
END : E N D;
|
|
ENTRY : E N T R Y;
|
|
EPOCH : E P O C H;
|
|
ERROR : E R R O R;
|
|
ESCAPE : E S C A P E;
|
|
EVERY : E V E R Y;
|
|
EXCEPT : E X C E P T;
|
|
EXCLUDE : E X C L U D E;
|
|
EXISTS : E X I S T S;
|
|
EXP : E X P;
|
|
EXTRACT : E X T R A C T;
|
|
FALSE : F A L S E;
|
|
FETCH : F E T C H;
|
|
FILTER : F I L T E R;
|
|
FIRST : F I R S T;
|
|
FK : F K;
|
|
FLOOR : F L O O R;
|
|
FOLLOWING : F O L L O W I N G;
|
|
FOR : F O R;
|
|
FORMAT : F O R M A T;
|
|
FROM : F R O M;
|
|
FULL : F U L L;
|
|
FUNCTION : F U N C T I O N;
|
|
GROUP : G R O U P;
|
|
GROUPS : G R O U P S;
|
|
HAVING : H A V I N G;
|
|
HOUR : H O U R;
|
|
ID : I D;
|
|
IGNORE : I G N O R E;
|
|
ILIKE : I L I K E;
|
|
IN : I N;
|
|
INDEX : I N D E X;
|
|
INDICES : I N D I C E S;
|
|
INNER : I N N E R;
|
|
INSERT : I N S E R T;
|
|
INSTANT : I N S T A N T;
|
|
INTERSECT : I N T E R S E C T;
|
|
INTO : I N T O;
|
|
IS : I S;
|
|
JOIN : J O I N;
|
|
KEY : K E Y;
|
|
LAST : L A S T;
|
|
LATERAL : L A T E R A L;
|
|
LEADING : L E A D I N G;
|
|
LEFT : L E F T;
|
|
LIKE : L I K E;
|
|
LIMIT : L I M I T;
|
|
LIST : L I S T;
|
|
LISTAGG : L I S T A G G;
|
|
LN : L N;
|
|
LOCAL : L O C A L;
|
|
LOCAL_DATE : L O C A L '_' D A T E ;
|
|
LOCAL_DATETIME : L O C A L '_' D A T E T I M E;
|
|
LOCAL_TIME : L O C A L '_' T I M E;
|
|
MAP : M A P;
|
|
MATERIALIZED : M A T E R I A L I Z E D;
|
|
MAX : M A X;
|
|
MAXELEMENT : M A X E L E M E N T;
|
|
MAXINDEX : M A X I N D E X;
|
|
MEMBER : M E M B E R;
|
|
MICROSECOND : M I C R O S E C O N D;
|
|
MILLISECOND : M I L L I S E C O N D;
|
|
MIN : M I N;
|
|
MINELEMENT : M I N E L E M E N T;
|
|
MININDEX : M I N I N D E X;
|
|
MINUTE : M I N U T E;
|
|
MONTH : M O N T H;
|
|
NANOSECOND : N A N O S E C O N D;
|
|
NATURALID : N A T U R A L I D;
|
|
NEW : N E W;
|
|
NEXT : N E X T;
|
|
NO : N O;
|
|
NOT : N O T;
|
|
NULL : N U L L;
|
|
NULLS : N U L L S;
|
|
OBJECT : O B J E C T;
|
|
OF : O F;
|
|
OFFSET : O F F S E T;
|
|
OFFSET_DATETIME : O F F S E T '_' D A T E T I M E;
|
|
ON : O N;
|
|
ONLY : O N L Y;
|
|
OR : O R;
|
|
ORDER : O R D E R;
|
|
OTHERS : O T H E R S;
|
|
OUTER : O U T E R;
|
|
OVER : O V E R;
|
|
OVERFLOW : O V E R F L O W;
|
|
OVERLAY : O V E R L A Y;
|
|
PAD : P A D;
|
|
PARTITION : P A R T I T I O N;
|
|
PERCENT : P E R C E N T;
|
|
PLACING : P L A C I N G;
|
|
POSITION : P O S I T I O N;
|
|
POWER : P O W E R;
|
|
PRECEDING : P R E C E D I N G;
|
|
QUARTER : Q U A R T E R;
|
|
RANGE : R A N G E;
|
|
RESPECT : R E S P E C T;
|
|
RIGHT : R I G H T;
|
|
ROLLUP : R O L L U P;
|
|
ROW : R O W;
|
|
ROWS : R O W S;
|
|
SEARCH : S E A R C H;
|
|
SECOND : S E C O N D;
|
|
SELECT : S E L E C T;
|
|
SET : S E T;
|
|
SIZE : S I Z E;
|
|
SOME : S O M E;
|
|
SUBSTRING : S U B S T R I N G;
|
|
SUM : S U M;
|
|
THEN : T H E N;
|
|
TIES : T I E S;
|
|
TIME : T I M E;
|
|
TIMESTAMP : T I M E S T A M P;
|
|
TIMEZONE_HOUR : T I M E Z O N E '_' H O U R;
|
|
TIMEZONE_MINUTE : T I M E Z O N E '_' M I N U T E;
|
|
TO : T O;
|
|
TRAILING : T R A I L I N G;
|
|
TREAT : T R E A T;
|
|
TRIM : T R I M;
|
|
TRUE : T R U E;
|
|
TRUNC : T R U N C;
|
|
TRUNCATE : T R U N C A T E;
|
|
TYPE : T Y P E;
|
|
UNBOUNDED : U N B O U N D E D;
|
|
UNION : U N I O N;
|
|
UPDATE : U P D A T E;
|
|
USING : U S I N G;
|
|
VALUE : V A L U E;
|
|
VALUES : V A L U E S;
|
|
VERSION : V E R S I O N;
|
|
VERSIONED : V E R S I O N E D;
|
|
WEEK : W E E K;
|
|
WHEN : W H E N;
|
|
WHERE : W H E R E;
|
|
WITH : W I T H;
|
|
WITHIN : W I T H I N;
|
|
WITHOUT : W I T H O U T;
|
|
YEAR : Y E A R;
|
|
|
|
fragment INTEGER_NUMBER : ('0' .. '9')+ ;
|
|
fragment FLOAT_NUMBER : INTEGER_NUMBER+ '.'? INTEGER_NUMBER* (E [+-]? INTEGER_NUMBER)? ;
|
|
fragment HEX_DIGIT : [0-9a-fA-F];
|
|
|
|
|
|
CHARACTER : '\'' (~ ('\'' | '\\' )) '\'' ;
|
|
STRINGLITERAL : '\'' ('\'' '\'' | ~('\''))* '\'' ;
|
|
JAVASTRINGLITERAL : '"' ( ('\\' [btnfr"']) | ~('"'))* '"';
|
|
INTEGER_LITERAL : INTEGER_NUMBER (L | B I)? ;
|
|
FLOAT_LITERAL : FLOAT_NUMBER (D | F | B D)?;
|
|
HEXLITERAL : '0' X HEX_DIGIT+ ;
|
|
BINARY_LITERAL : [xX] '\'' HEX_DIGIT+ '\''
|
|
| [xX] '"' HEX_DIGIT+ '"'
|
|
;
|
|
|
|
IDENTIFICATION_VARIABLE : ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '$' | '_') ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | '0' .. '9' | '$' | '_')* ;
|
|
SPEL : ('#')('{')(.)*?('}') ; |