diff --git a/ci/quarkus.Jenkinsfile b/ci/quarkus.Jenkinsfile
index 2ee8dd1091c6..96bdcbf36b72 100644
--- a/ci/quarkus.Jenkinsfile
+++ b/ci/quarkus.Jenkinsfile
@@ -46,7 +46,7 @@ pipeline {
}
}
dir('quarkus') {
- sh "git clone -b 3.15 --single-branch https://github.com/quarkusio/quarkus.git . || git reset --hard && git clean -fx && git pull"
+ sh "git clone -b remove-dead-code-3.20 --single-branch https://github.com/yrodiere/quarkus.git . || git reset --hard && git clean -fx && git pull"
script {
def sedStatus = sh (script: "sed -i 's@.*@${env.HIBERNATE_VERSION}@' pom.xml", returnStatus: true)
if ( sedStatus != 0 ) {
diff --git a/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4 b/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4
index b9a113092a4d..9b65eff78379 100644
--- a/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4
+++ b/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4
@@ -159,8 +159,7 @@ cycleClause
* A toplevel query of subquery, which may be a union or intersection of subqueries
*/
queryExpression
- : withClause? orderedQuery # SimpleQueryGroup
- | withClause? orderedQuery (setOperator orderedQuery)+ # SetQueryGroup
+ : withClause? orderedQuery (setOperator orderedQuery)*
;
/**
@@ -430,8 +429,6 @@ pathContinuation
* * VALUE( path )
* * KEY( path )
* * path[ selector ]
- * * ARRAY_GET( embeddableArrayPath, index ).path
- * * COALESCE( array1, array2 )[ selector ].path
*/
syntacticDomainPath
: treatedNavigablePath
@@ -439,10 +436,6 @@ syntacticDomainPath
| mapKeyNavigablePath
| simplePath indexedPathAccessFragment
| simplePath slicedPathAccessFragment
- | toOneFkReference
- | function pathContinuation
- | function indexedPathAccessFragment pathContinuation?
- | function slicedPathAccessFragment
;
/**
@@ -664,19 +657,21 @@ whereClause
predicate
//highest to lowest precedence
: LEFT_PAREN predicate RIGHT_PAREN # GroupedPredicate
- | expression IS NOT? NULL # IsNullPredicate
- | expression IS NOT? EMPTY # IsEmptyPredicate
- | expression IS NOT? TRUE # IsTruePredicate
- | expression IS NOT? FALSE # IsFalsePredicate
- | expression IS NOT? DISTINCT FROM expression # IsDistinctFromPredicate
+ | expression IS NOT? (NULL|EMPTY|TRUE|FALSE) # UnaryIsPredicate
| expression NOT? MEMBER OF? path # MemberOfPredicate
| expression NOT? IN inList # InPredicate
| expression NOT? BETWEEN expression AND expression # BetweenPredicate
| expression NOT? (LIKE | ILIKE) expression likeEscape? # LikePredicate
- | expression NOT? CONTAINS expression # ContainsPredicate
- | expression NOT? INCLUDES expression # IncludesPredicate
- | expression NOT? INTERSECTS expression # IntersectsPredicate
- | expression comparisonOperator expression # ComparisonPredicate
+ | expression
+ ( NOT? (CONTAINS | INCLUDES | INTERSECTS)
+ | IS NOT? DISTINCT FROM
+ | EQUAL
+ | NOT_EQUAL
+ | GREATER
+ | GREATER_EQUAL
+ | LESS
+ | LESS_EQUAL
+ ) expression # BinaryExpressionPredicate
| EXISTS collectionQuantifier LEFT_PAREN simplePath RIGHT_PAREN # ExistsCollectionPartPredicate
| EXISTS expression # ExistsPredicate
| NOT predicate # NegatedPredicate
@@ -685,18 +680,6 @@ predicate
| expression # BooleanExpressionPredicate
;
-/**
- * An operator which compares values for equality or order
- */
-comparisonOperator
- : EQUAL
- | NOT_EQUAL
- | GREATER
- | GREATER_EQUAL
- | LESS
- | LESS_EQUAL
- ;
-
/**
* Any right operand of the 'in' operator
*
@@ -751,7 +734,14 @@ primaryExpression
| entityVersionReference # EntityVersionExpression
| entityNaturalIdReference # EntityNaturalIdExpression
| syntacticDomainPath pathContinuation? # SyntacticPathExpression
- | function # FunctionExpression
+ // ARRAY_GET( embeddableArrayPath, index ).path
+ // COALESCE( array1, array2 )[ selector ].path
+ // COALESCE( array1, array2 )[ start : end ]
+ | function (
+ pathContinuation
+ | slicedPathAccessFragment
+ | indexedPathAccessFragment pathContinuation?
+ )? # FunctionExpression
| generalPathFragment # GeneralPathExpression
;
@@ -1109,6 +1099,7 @@ function
| collectionFunctionMisuse
| jpaNonstandardFunction
| columnFunction
+ | toOneFkReference
| genericFunction
;
diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/OrderByFragmentTranslator.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/OrderByFragmentTranslator.java
index 1f33aadcfbbb..a90a177b03d6 100644
--- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/OrderByFragmentTranslator.java
+++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/OrderByFragmentTranslator.java
@@ -75,8 +75,13 @@ private static OrderingParser.OrderByFragmentContext buildParseTree(TranslationC
return parser.orderByFragment();
}
catch (ParseCancellationException e) {
+ // When resetting the parser, its CommonTokenStream will seek(0) i.e. restart emitting buffered tokens.
+ // This is enough when reusing the lexer and parser, and it would be wrong to also reset the lexer.
+ // Resetting the lexer causes it to hand out tokens again from the start, which will then append to the
+ // CommonTokenStream and cause a wrong parse
+ // lexer.reset();
+
// reset the input token stream and parser state
- lexer.reset();
parser.reset();
// fall back to LL(k)-based parsing
diff --git a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java
index 17b152e5642f..38328228ecf3 100644
--- a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java
+++ b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java
@@ -33,6 +33,7 @@
import java.util.Map;
import java.util.Set;
+import org.antlr.v4.runtime.Token;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.dialect.function.SqlColumn;
@@ -807,87 +808,14 @@ public Object visitCte(HqlParser.CteContext ctx) {
final JpaCteCriteria> oldCte = currentPotentialRecursiveCte;
try {
currentPotentialRecursiveCte = null;
- if ( queryExpressionContext instanceof HqlParser.SetQueryGroupContext ) {
- final HqlParser.SetQueryGroupContext setContext = (HqlParser.SetQueryGroupContext) queryExpressionContext;
- // A recursive query is only possible if the child count is lower than 5 e.g. `withClause? q1 op q2`
- if ( setContext.getChildCount() < 5 ) {
- final SetOperator setOperator = (SetOperator) setContext.getChild( setContext.getChildCount() - 2 )
- .accept( this );
- switch ( setOperator ) {
- case UNION:
- case UNION_ALL:
- final HqlParser.OrderedQueryContext nonRecursiveQueryContext;
- final HqlParser.OrderedQueryContext recursiveQueryContext;
- // On count == 4, we have a withClause at index 0
- if ( setContext.getChildCount() == 4 ) {
- nonRecursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 1 );
- recursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 3 );
- }
- else {
- nonRecursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 0 );
- recursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 2 );
- }
- // First visit the non-recursive part
- nonRecursiveQueryContext.accept( this );
-
- // Visiting the possibly recursive part must happen within the call to SqmCteContainer.with,
- // because in there, the SqmCteStatement/JpaCteCriteria is available for use in the recursive part.
- // The structure (SqmCteTable) for the SqmCteStatement is based on the non-recursive part,
- // which is necessary to have, so that the SqmCteRoot/SqmCteJoin can resolve sub-paths.
- final SqmSelectStatement