Skip to content

Commit

Permalink
HHH-14642, HHH-13717 Various JPA Criteria related fixes
Browse files Browse the repository at this point in the history
* Get rid of unnecessary whitespace and optional keywords in generated SQL
* Handle some type inference related issues with some databases requiring to render casted parameters in some situations
* Ensure SQM model is fully serializable
* Ensure JPA Criteria throws expected exceptions
* Make sure JPA Criteria implementations work properly
* Move jpa.test.callback and jpa.test.criteria packages
* Improve the reuse of SqmPath instances
* Get rid of many raw-types related warnings
* Make Predicate extend Expression and handle SQL rendering/emulation
* Support fetching SqmTuple as array
* Implement treat operator support
  • Loading branch information
beikov committed Sep 9, 2021
1 parent a216a23 commit 77c1370
Show file tree
Hide file tree
Showing 332 changed files with 4,947 additions and 3,217 deletions.
2 changes: 1 addition & 1 deletion docker_db.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

mysql_5_7() {
docker rm -f mysql || true
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_cs
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
# Give the container some time to start
OUTPUT=
n=0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import org.hibernate.dialect.CockroachDialect;
import org.hibernate.dialect.DerbyDialect;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.Oracle8iDialect;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.OracleDialect;
import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
Expand Down Expand Up @@ -1355,7 +1355,8 @@ public void test_hql_current_date_function_example_sql_server() {
});
}

@Test @RequiresDialect(H2Dialect.class)
@Test
@RequiresDialect(H2Dialect.class)
public void test_hql_current_time_function_example() {
doInJPA( this::entityManagerFactory, entityManager -> {
//tag::hql-current-time-function-example[]
Expand Down Expand Up @@ -1385,8 +1386,8 @@ public void test_hql_current_timestamp_function_example() {

@Test
@RequiresDialect(H2Dialect.class)
@RequiresDialect(Oracle8iDialect.class)
@RequiresDialect(MySQL5Dialect.class)
@RequiresDialect(OracleDialect.class)
@RequiresDialect(MySQLDialect.class)
public void test_hql_bit_length_function_example() {
doInJPA( this::entityManagerFactory, entityManager -> {
//tag::hql-bit-length-function-example[]
Expand Down Expand Up @@ -1940,7 +1941,7 @@ public void test_hql_relational_comparisons_example_2() {
@Test
@RequiresDialect(H2Dialect.class)
@RequiresDialect(PostgreSQLDialect.class)
@RequiresDialect(MySQL5Dialect.class)
@RequiresDialect(MySQLDialect.class)
public void test_hql_relational_comparisons_example_3() {

doInJPA( this::entityManagerFactory, entityManager -> {
Expand Down Expand Up @@ -2145,7 +2146,7 @@ public void test_hql_between_predicate_example_1() {
@Test
@RequiresDialect(H2Dialect.class)
@RequiresDialect(PostgreSQLDialect.class)
@RequiresDialect(MySQL5Dialect.class)
@RequiresDialect(MySQLDialect.class)
public void test_hql_between_predicate_example_2() {

doInJPA( this::entityManagerFactory, entityManager -> {
Expand Down Expand Up @@ -2399,9 +2400,6 @@ public void test_hql_group_by_example_2() {
}

@Test
@RequiresDialect(H2Dialect.class)
@RequiresDialect(PostgreSQLDialect.class)
@RequiresDialect(MySQL5Dialect.class)
public void test_hql_group_by_example_3() {

doInJPA( this::entityManagerFactory, entityManager -> {
Expand All @@ -2421,9 +2419,6 @@ public void test_hql_group_by_example_3() {
}

@Test
@RequiresDialect(H2Dialect.class)
@RequiresDialect(PostgreSQLDialect.class)
@RequiresDialect(MySQL5Dialect.class)
public void test_hql_group_by_example_4() {

doInJPA( this::entityManagerFactory, entityManager -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
CommonFunctionFactory.lastDay( queryEngine );
CommonFunctionFactory.weekQuarter( queryEngine );
CommonFunctionFactory.octetLength( queryEngine );
CommonFunctionFactory.bitLength( queryEngine );
CommonFunctionFactory.md5( queryEngine );
CommonFunctionFactory.trunc( queryEngine );
CommonFunctionFactory.truncate( queryEngine );
Expand Down Expand Up @@ -386,11 +387,11 @@ public boolean supportsTimezoneTypes() {
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
switch (unit) {
case NANOSECOND:
return "adddate(?3, interval (?2)/1e6 millisecond)";
return "adddate(?3,interval (?2)/1e6 millisecond)";
case NATIVE:
return "adddate(?3, interval ?2 millisecond)";
return "adddate(?3,interval ?2 millisecond)";
default:
return "adddate(?3, interval ?2 ?1)";
return "adddate(?3,interval ?2 ?1)";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,10 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
"locate",
StandardBasicTypes.INTEGER,
"$find(?2, ?1)",
"$find(?2, ?1, ?3)"
"$find(?2,?1)",
"$find(?2,?1,?3)"
).setArgumentListSignature("(pattern, string[, start])");
CommonFunctionFactory.bitLength_pattern( queryEngine, "($length(?1)*8)" );

useJdbcEscape(queryEngine, "sin");
useJdbcEscape(queryEngine, "cos");
Expand Down Expand Up @@ -181,17 +182,17 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {

@Override
public String extractPattern(TemporalUnit unit) {
return "datepart(?1, ?2)";
return "datepart(?1,?2)";
}

@Override
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
switch (unit) {
case NANOSECOND:
case NATIVE:
return "dateadd(millisecond, (?2)/1e6, ?3)";
return "dateadd(millisecond,(?2)/1e6,?3)";
default:
return "dateadd(?1, ?2, ?3)";
return "dateadd(?1,?2,?3)";
}
}

Expand All @@ -200,9 +201,9 @@ public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalT
switch (unit) {
case NANOSECOND:
case NATIVE:
return "datediff(millisecond, ?2, ?3)*1e6";
return "datediff(millisecond,?2,?3)*1e6";
default:
return "datediff(?1, ?2, ?3)";
return "datediff(?1,?2,?3)";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
"locate",
StandardBasicTypes.INTEGER,
"position(?1 in ?2)",
"position(?1, ?2, ?3)"
"position(?1,?2,?3)"
).setArgumentListSignature( "(pattern, string[, start])" );
functionRegistry.namedDescriptorBuilder( "ascii_val" )
.setExactArgumentCount( 1 )
Expand Down Expand Up @@ -593,7 +593,7 @@ public String getQuerySequencesString() {
? "select rdb$generator_name from rdb$generators"
// Note: Firebird 3 has an 'off by increment' bug (fixed in Firebird 4), see
// http://tracker.firebirdsql.org/browse/CORE-6084
: "select rdb$generator_name, rdb$initial_value, rdb$generator_increment from rdb$generators where coalesce(rdb$system_flag, 0) = 0";
: "select rdb$generator_name,rdb$initial_value,rdb$generator_increment from rdb$generators where coalesce(rdb$system_flag,0)=0";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;
import org.hibernate.sql.ast.tree.expression.SqlTuple;
import org.hibernate.sql.ast.tree.expression.Summarization;
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
import org.hibernate.sql.ast.tree.predicate.SelfRenderingPredicate;
import org.hibernate.sql.ast.tree.select.QueryGroup;
import org.hibernate.sql.ast.tree.select.QueryPart;
Expand All @@ -50,6 +51,16 @@ public FirebirdSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statem
super( sessionFactory, statement );
}

@Override
public void visitBooleanExpressionPredicate(BooleanExpressionPredicate booleanExpressionPredicate) {
if ( getDialect().getVersion() >= 300 ) {
booleanExpressionPredicate.getExpression().accept( this );
}
else {
super.visitBooleanExpressionPredicate( booleanExpressionPredicate );
}
}

@Override
protected String getForUpdate() {
return " with lock";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
"locate",
StandardBasicTypes.INTEGER,
"instr(?2, ?1)",
"instr(?2, ?1, ?3)"
"instr(?2,?1)",
"instr(?2,?1,?3)"
).setArgumentListSignature("(pattern, string[, start])");

//coalesce() and nullif() both supported since Informix 12
Expand Down Expand Up @@ -307,7 +307,7 @@ public SequenceSupport getSequenceSupport() {

@Override
public String getQuerySequencesString() {
return "select systables.tabname as sequence_name, syssequences.* from syssequences join systables on syssequences.tabid = systables.tabid where tabtype = 'Q'";
return "select systables.tabname as sequence_name,syssequences.* from syssequences join systables on syssequences.tabid=systables.tabid where tabtype='Q'";
}

@Override
Expand All @@ -322,7 +322,7 @@ public LimitHandler getLimitHandler() {

@Override
public String getFromDual() {
return "from (select 0 from systables where tabid = 1) as dual";
return "from (select 0 from systables where tabid=1) as dual";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {

@Override
protected String getFromDual() {
return " from (select 0 from systables where tabid = 1) as dual";
return " from (select 0 from systables where tabid=1) dual";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,15 +235,16 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
CommonFunctionFactory.position( queryEngine );
CommonFunctionFactory.format_dateFormat( queryEngine );
CommonFunctionFactory.dateTrunc( queryEngine );
CommonFunctionFactory.bitLength_pattern( queryEngine, "octet_length(hex(?1))*4" );

queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
"locate",
StandardBasicTypes.INTEGER,
"position(?1 in ?2)",
"(position(?1 in substring(?2 from ?3)) + (?3) - 1)"
"(position(?1 in substring(?2 from ?3))+(?3)-1)"
).setArgumentListSignature("(pattern, string[, start])");

queryEngine.getSqmFunctionRegistry().registerPattern( "extract", "date_part('?1', ?2)", StandardBasicTypes.INTEGER );
queryEngine.getSqmFunctionRegistry().registerPattern( "extract", "date_part('?1',?2)", StandardBasicTypes.INTEGER );

CommonFunctionFactory.bitandorxornot_bitAndOrXorNot(queryEngine);

Expand Down Expand Up @@ -290,13 +291,13 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(

@Override
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
return "timestampadd(?1, ?2, ?3)";
return "timestampadd(?1,?2,?3)";

}

@Override
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
return "timestampdiff(?1, ?2, ?3)";
return "timestampdiff(?1,?2,?3)";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
@Override
protected String getFromDual() {
//this is only necessary if the query has a where clause
return " from (select 0) as dual";
return " from (select 0) dual";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {

queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
"locate",
StandardBasicTypes.INTEGER, "index(?2, ?1)", "index(?2, ?1, ?3)"
StandardBasicTypes.INTEGER, "index(?2,?1)", "index(?2,?1,?3)"
).setArgumentListSignature("(pattern, string[, start])");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ protected void visitCaseSearchedExpression(CaseSearchedExpression caseSearchedEx
visitDecodeCaseSearchedExpression( caseSearchedExpression );
}
else {
visitAnsiCaseSearchedExpression( caseSearchedExpression );
super.visitCaseSearchedExpression( caseSearchedExpression, inSelect );
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {

CommonFunctionFactory.soundex( queryEngine );
CommonFunctionFactory.octetLength( queryEngine );
CommonFunctionFactory.bitLength( queryEngine );
CommonFunctionFactory.truncate( queryEngine );
CommonFunctionFactory.repeat( queryEngine );
CommonFunctionFactory.pad_repeat( queryEngine );
Expand Down Expand Up @@ -161,7 +162,7 @@ public String extractPattern(TemporalUnit unit) {

public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
StringBuilder pattern = new StringBuilder();
pattern.append("cast((?3 - ?2) ");
pattern.append("cast((?3-?2) ");
switch (unit) {
case NATIVE:
case NANOSECOND:
Expand Down Expand Up @@ -209,13 +210,13 @@ public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType)
switch ( unit ) {
case NATIVE:
case NANOSECOND:
return "(?3 + (?2)/1e9 * interval '1' second)";
return "(?3+(?2)/1e9*interval '1' second)";
case QUARTER:
return "(?3 + (?2) * interval '3' month)";
return "(?3+(?2)*interval '3' month)";
case WEEK:
return "(?3 + (?2) * interval '7' day)";
return "(?3+(?2)*interval '7' day)";
default:
return "(?3 + (?2) * interval '1' ?1)";
return "(?3+(?2)*interval '1' ?1)";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,23 +223,23 @@ public String extractPattern(TemporalUnit unit) {
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
switch (unit) {
case NANOSECOND:
return "timestampadd('SQL_TSI_FRAC_SECOND', (?2)/1e3, ?3)";
return "timestampadd('SQL_TSI_FRAC_SECOND',(?2)/1e3,?3)";
case NATIVE:
return "timestampadd('SQL_TSI_FRAC_SECOND', ?2, ?3)";
return "timestampadd('SQL_TSI_FRAC_SECOND',?2,?3)";
default:
return "dateadd('?1', ?2, ?3)";
return "dateadd('?1',?2,?3)";
}
}

@Override
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
switch (unit) {
case NANOSECOND:
return "timestampdiff('SQL_TSI_FRAC_SECOND', ?2, ?3)*1e3";
return "timestampdiff('SQL_TSI_FRAC_SECOND',?2,?3)*1e3";
case NATIVE:
return "timestampdiff('SQL_TSI_FRAC_SECOND', ?2, ?3)";
return "timestampdiff('SQL_TSI_FRAC_SECOND',?2,?3)";
default:
return "dateadd('?1', ?2, ?3)";
return "dateadd('?1',?2,?3)";
}
}

Expand Down Expand Up @@ -325,7 +325,7 @@ public LimitHandler getLimitHandler() {

@Override
public String getFromDual() {
return "from rdms.rdms_dummy where key_col = 1";
return "from rdms.rdms_dummy where key_col=1";
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {

@Override
protected String getFromDual() {
return " from rdms.rdms_dummy where key_col = 1";
return " from rdms.rdms_dummy where key_col=1";
}

@Override
Expand Down

0 comments on commit 77c1370

Please sign in to comment.