Skip to content

Commit b36ee67

Browse files
committed
HHH-18892 add sha() and md5() functions to HQL
1 parent 5b3770e commit b36ee67

File tree

10 files changed

+71
-4
lines changed

10 files changed

+71
-4
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
413413
functionFactory.substr();
414414
functionFactory.reverse();
415415
functionFactory.repeat();
416-
functionFactory.md5();
417416
functionFactory.sha1();
418417
functionFactory.octetLength();
419418
functionFactory.bitLength();
@@ -503,6 +502,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
503502
new PostgreSQLTruncFunction( true, functionContributions.getTypeConfiguration() )
504503
);
505504
functionContributions.getFunctionRegistry().registerAlternateKey( "truncate", "trunc" );
505+
506+
functionFactory.sha( "digest(?1, 'sha256')" );
507+
functionFactory.md5( "digest(?1, 'md5')" );
506508
}
507509

508510
@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( "hash(?1, 0)" );
455458
}
456459

457460
/**

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
368368
functionFactory.unnest_h2( getMaximumArraySize() );
369369
functionFactory.generateSeries_h2( getMaximumSeriesSize() );
370370
functionFactory.jsonTable_h2( getMaximumArraySize() );
371+
372+
functionFactory.sha( "hash('SHA-256', ?1)" );
373+
functionFactory.md5( "hash('MD5', ?1)" );
371374
}
372375

373376
/**

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( "hash_sha256(?1)" );
522+
functionFactory.md5( "hash_md5(?1)" );
520523
}
521524

522525
/**

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
590590
functionFactory.space();
591591
functionFactory.repeat();
592592
functionFactory.pad_space();
593-
functionFactory.md5();
594593
functionFactory.yearMonthDay();
595594
functionFactory.hourMinuteSecond();
596595
functionFactory.dayofweekmonthyear();
@@ -606,7 +605,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
606605
functionFactory.crc32();
607606
functionFactory.sha1();
608607
functionFactory.sha2();
609-
functionFactory.sha();
610608
functionFactory.bitLength();
611609
functionFactory.octetLength();
612610
functionFactory.ascii();
@@ -688,6 +686,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
688686
if ( supportsRecursiveCTE() ) {
689687
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, false );
690688
}
689+
690+
functionFactory.sha( "unhex(sha2(?1, 256))" );
691+
functionFactory.md5( "unhex(md5(?1))" );
691692
}
692693

693694
/**

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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
550550
functionFactory.pi();
551551
functionFactory.trim2();
552552
functionFactory.repeat();
553-
functionFactory.md5();
554553
functionFactory.initcap();
555554
functionFactory.substr();
556555
functionFactory.substring_substr();
@@ -690,6 +689,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
690689
functionFactory.unnest_postgresql();
691690
}
692691
functionFactory.generateSeries( null, "ordinality", false );
692+
693+
functionFactory.sha( "sha256(?1)" );
694+
functionFactory.md5( "decode(md5(?1), 'hex')" );
693695
}
694696

695697
@Override

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,9 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
487487
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, false );
488488
}
489489
}
490+
491+
functionFactory.sha( "hashbytes('SHA2_256', ?1)" );
492+
functionFactory.md5( "hashbytes('MD5', ?1)" );
490493
}
491494

492495
/**

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

Lines changed: 23 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
}
@@ -813,6 +815,7 @@ public void repeat_replicate() {
813815
functionRegistry.registerAlternateKey( "repeat", "replicate" );
814816
}
815817

818+
@Deprecated(since = "7")
816819
public void md5() {
817820
functionRegistry.namedDescriptorBuilder( "md5" )
818821
.setInvariantType(stringType)
@@ -2313,6 +2316,7 @@ public void cbrt() {
23132316
.register();
23142317
}
23152318

2319+
@Deprecated(since = "7")
23162320
public void crc32() {
23172321
functionRegistry.namedDescriptorBuilder( "crc32" )
23182322
.setInvariantType(integerType)
@@ -2321,6 +2325,23 @@ public void crc32() {
23212325
.register();
23222326
}
23232327

2328+
public void md5(String pattern) {
2329+
functionRegistry.patternDescriptorBuilder( "md5", pattern )
2330+
.setInvariantType(binaryType)
2331+
.setParameterTypes( STRING )
2332+
.setExactArgumentCount( 1 )
2333+
.register();
2334+
}
2335+
2336+
public void sha(String pattern) {
2337+
functionRegistry.patternDescriptorBuilder( "sha", pattern )
2338+
.setInvariantType(binaryType)
2339+
.setParameterTypes( STRING )
2340+
.setExactArgumentCount( 1 )
2341+
.register();
2342+
}
2343+
2344+
@Deprecated(since = "7")
23242345
public void sha1() {
23252346
functionRegistry.namedDescriptorBuilder( "sha1" )
23262347
.setInvariantType(stringType)
@@ -2329,6 +2350,7 @@ public void sha1() {
23292350
.register();
23302351
}
23312352

2353+
@Deprecated(since = "7")
23322354
public void sha2() {
23332355
functionRegistry.namedDescriptorBuilder( "sha2" )
23342356
.setInvariantType(stringType)
@@ -2337,6 +2359,7 @@ public void sha2() {
23372359
.register();
23382360
}
23392361

2362+
@Deprecated(since = "7")
23402363
public void sha() {
23412364
functionRegistry.namedDescriptorBuilder( "sha" )
23422365
.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)