Skip to content

Commit c6a5f5a

Browse files
committed
HHH-18892 add sha() and md5() functions to HQL
1 parent cf5b295 commit c6a5f5a

File tree

10 files changed

+78
-1
lines changed

10 files changed

+78
-1
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.hibernate.query.SemanticException;
5555
import org.hibernate.query.sqm.IntervalType;
5656
import org.hibernate.query.common.TemporalUnit;
57+
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
5758
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
5859
import org.hibernate.service.ServiceRegistry;
5960
import org.hibernate.sql.ast.SqlAstTranslator;
@@ -64,6 +65,7 @@
6465
import org.hibernate.sql.exec.spi.JdbcOperation;
6566
import org.hibernate.tool.schema.extract.spi.ColumnTypeInformation;
6667
import org.hibernate.type.JavaObjectType;
68+
import org.hibernate.type.StandardBasicTypes;
6769
import org.hibernate.type.descriptor.jdbc.JdbcType;
6870
import org.hibernate.type.descriptor.jdbc.ObjectNullAsBinaryTypeJdbcType;
6971
import org.hibernate.type.descriptor.jdbc.UUIDJdbcType;
@@ -503,6 +505,10 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
503505
new PostgreSQLTruncFunction( true, functionContributions.getTypeConfiguration() )
504506
);
505507
functionContributions.getFunctionRegistry().registerAlternateKey( "truncate", "trunc" );
508+
509+
510+
functionFactory.sha( "sha256(?1)" );
511+
functionFactory.md5( "cast(md5(?1) as bytea)" );
506512
}
507513

508514
@Override

hibernate-core/src/main/java/org/hibernate/dialect/DB2Dialect.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
452452

453453
functionFactory.unnest_db2( getMaximumSeriesSize() );
454454
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, true );
455+
456+
functionFactory.sha( "hash(?1, 2)" );
457+
functionFactory.md5( "md5(?1)" );
455458
}
456459

457460
/**

hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy;
5353
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
5454
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
55+
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
5556
import org.hibernate.service.ServiceRegistry;
5657
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
5758
import org.hibernate.sql.ast.SqlAstTranslator;
@@ -65,6 +66,7 @@
6566
import org.hibernate.sql.model.internal.OptionalTableUpdate;
6667
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
6768
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
69+
import org.hibernate.type.StandardBasicTypes;
6870
import org.hibernate.type.descriptor.jdbc.EnumJdbcType;
6971
import org.hibernate.type.descriptor.jdbc.JdbcType;
7072
import org.hibernate.type.descriptor.jdbc.OrdinalEnumJdbcType;
@@ -368,6 +370,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
368370
functionFactory.unnest_h2( getMaximumArraySize() );
369371
functionFactory.generateSeries_h2( getMaximumSeriesSize() );
370372
functionFactory.jsonTable_h2( getMaximumArraySize() );
373+
374+
functionFactory.sha( "hash('SHA-256', ?1)" );
375+
functionFactory.md5( "hash('MD5', ?1)" );
371376
}
372377

373378
/**

hibernate-core/src/main/java/org/hibernate/dialect/HANADialect.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
517517

518518
// functionFactory.xmlextract();
519519
functionFactory.generateSeries_hana( getMaximumSeriesSize() );
520+
521+
functionFactory.sha( "to_binary(hash_sha256(?1))" );
522+
functionFactory.md5( "to_binary(md5(?1))" );
520523
}
521524

522525
/**

hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
606606
functionFactory.crc32();
607607
functionFactory.sha1();
608608
functionFactory.sha2();
609-
functionFactory.sha();
610609
functionFactory.bitLength();
611610
functionFactory.octetLength();
612611
functionFactory.ascii();
@@ -688,6 +687,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
688687
if ( supportsRecursiveCTE() ) {
689688
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, false );
690689
}
690+
691+
functionFactory.sha( "unhex(sha2(?1, 256))" );
692+
functionFactory.md5( "unhex(md5(?1))" );
691693
}
692694

693695
/**

hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
440440
functionFactory.unnest_oracle();
441441
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), true, false );
442442
functionFactory.jsonTable_oracle();
443+
444+
functionFactory.sha( "standard_hash(?1, 'SHA256')" );
445+
functionFactory.md5( "standard_hash(?1, 'MD5')" );
443446
}
444447

445448
/**

hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy;
6868
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
6969
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
70+
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
7071
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
7172
import org.hibernate.service.ServiceRegistry;
7273
import org.hibernate.sql.ast.SqlAstTranslator;
@@ -83,6 +84,7 @@
8384
import org.hibernate.tool.schema.internal.StandardTableExporter;
8485
import org.hibernate.tool.schema.spi.Exporter;
8586
import org.hibernate.type.JavaObjectType;
87+
import org.hibernate.type.StandardBasicTypes;
8688
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
8789
import org.hibernate.type.descriptor.jdbc.BlobJdbcType;
8890
import org.hibernate.type.descriptor.jdbc.ClobJdbcType;
@@ -690,6 +692,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
690692
functionFactory.unnest_postgresql();
691693
}
692694
functionFactory.generateSeries( null, "ordinality", false );
695+
696+
functionFactory.sha( "sha256(?1)" );
697+
functionFactory.md5( "cast(md5(?1) as bytea)" );
693698
}
694699

695700
@Override

hibernate-core/src/main/java/org/hibernate/dialect/SQLServerDialect.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.hibernate.query.sqm.IntervalType;
6767
import org.hibernate.query.common.TemporalUnit;
6868
import org.hibernate.query.sqm.TrimSpec;
69+
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
6970
import org.hibernate.service.ServiceRegistry;
7071
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
7172
import org.hibernate.sql.ast.SqlAstTranslator;
@@ -487,6 +488,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
487488
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, false );
488489
}
489490
}
491+
492+
functionFactory.sha( "hashbytes('SHA2_256', ?1)" );
493+
functionFactory.md5( "hashbytes('MD5', ?1)" );
490494
}
491495

492496
/**

hibernate-core/src/main/java/org/hibernate/dialect/function/CommonFunctionFactory.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class CommonFunctionFactory {
6868
private final BasicType<Boolean> booleanType;
6969
private final BasicType<Character> characterType;
7070
private final BasicType<String> stringType;
71+
private final BasicType<byte[]> binaryType;
7172
private final BasicType<Integer> integerType;
7273
private final BasicType<Long> longType;
7374
private final BasicType<Double> doubleType;
@@ -90,6 +91,7 @@ public CommonFunctionFactory(FunctionContributions functionContributions) {
9091
characterType = basicTypeRegistry.resolve(StandardBasicTypes.CHARACTER);
9192
booleanType = basicTypeRegistry.resolve(StandardBasicTypes.BOOLEAN);
9293
stringType = basicTypeRegistry.resolve(StandardBasicTypes.STRING);
94+
binaryType = basicTypeRegistry.resolve(StandardBasicTypes.BINARY);
9395
integerType = basicTypeRegistry.resolve(StandardBasicTypes.INTEGER);
9496
doubleType = basicTypeRegistry.resolve(StandardBasicTypes.DOUBLE);
9597
}
@@ -2313,6 +2315,7 @@ public void cbrt() {
23132315
.register();
23142316
}
23152317

2318+
@Deprecated(since = "7")
23162319
public void crc32() {
23172320
functionRegistry.namedDescriptorBuilder( "crc32" )
23182321
.setInvariantType(integerType)
@@ -2321,6 +2324,23 @@ public void crc32() {
23212324
.register();
23222325
}
23232326

2327+
public void md5(String pattern) {
2328+
functionRegistry.patternDescriptorBuilder( "md5", pattern )
2329+
.setInvariantType(binaryType)
2330+
.setParameterTypes( STRING )
2331+
.setExactArgumentCount( 1 )
2332+
.register();
2333+
}
2334+
2335+
public void sha(String pattern) {
2336+
functionRegistry.patternDescriptorBuilder( "sha", pattern )
2337+
.setInvariantType(binaryType)
2338+
.setParameterTypes( STRING )
2339+
.setExactArgumentCount( 1 )
2340+
.register();
2341+
}
2342+
2343+
@Deprecated(since = "7")
23242344
public void sha1() {
23252345
functionRegistry.namedDescriptorBuilder( "sha1" )
23262346
.setInvariantType(stringType)
@@ -2329,6 +2349,7 @@ public void sha1() {
23292349
.register();
23302350
}
23312351

2352+
@Deprecated(since = "7")
23322353
public void sha2() {
23332354
functionRegistry.namedDescriptorBuilder( "sha2" )
23342355
.setInvariantType(stringType)
@@ -2337,6 +2358,7 @@ public void sha2() {
23372358
.register();
23382359
}
23392360

2361+
@Deprecated(since = "7")
23402362
public void sha() {
23412363
functionRegistry.namedDescriptorBuilder( "sha" )
23422364
.setInvariantType(stringType)

hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.dialect.DB2Dialect;
1616
import org.hibernate.community.dialect.DerbyDialect;
1717
import org.hibernate.dialect.H2Dialect;
18+
import org.hibernate.dialect.HANADialect;
1819
import org.hibernate.dialect.HSQLDialect;
1920
import org.hibernate.dialect.MariaDBDialect;
2021
import org.hibernate.dialect.MySQLDialect;
@@ -47,6 +48,8 @@
4748

4849
import java.math.BigDecimal;
4950
import java.math.BigInteger;
51+
import java.security.MessageDigest;
52+
import java.security.NoSuchAlgorithmException;
5053
import java.sql.Time;
5154
import java.sql.Timestamp;
5255
import java.time.Duration;
@@ -2596,4 +2599,25 @@ public void testCtidColumnFunction(SessionFactoryScope scope) {
25962599
.getSingleResultOrNull();
25972600
});
25982601
}
2602+
2603+
@Test
2604+
@RequiresDialect(PostgreSQLDialect.class)
2605+
@RequiresDialect(MySQLDialect.class)
2606+
@RequiresDialect(OracleDialect.class)
2607+
@RequiresDialect(DB2Dialect.class)
2608+
@RequiresDialect(SQLServerDialect.class)
2609+
@RequiresDialect(H2Dialect.class)
2610+
@RequiresDialect(HANADialect.class)
2611+
@RequiresDialect(CockroachDialect.class)
2612+
public void testSha256Function(SessionFactoryScope scope) {
2613+
scope.inTransaction(s -> {
2614+
byte[] bytes = s.createSelectionQuery("select sha('hello')", byte[].class).getSingleResult();
2615+
try {
2616+
assertArrayEquals( MessageDigest.getInstance( "SHA-256" ).digest("hello".getBytes()), bytes );
2617+
}
2618+
catch (NoSuchAlgorithmException e) {
2619+
throw new RuntimeException( e );
2620+
}
2621+
});
2622+
}
25992623
}

0 commit comments

Comments
 (0)