Skip to content

Commit a1b469e

Browse files
committed
HHH-18892 add sha() function to HQL
1 parent cf5b295 commit a1b469e

File tree

7 files changed

+75
-0
lines changed

7 files changed

+75
-0
lines changed

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

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

453453
functionFactory.unnest_db2( getMaximumSeriesSize() );
454454
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, true );
455+
456+
functionContributions.getFunctionRegistry()
457+
.patternDescriptorBuilder( "sha", "hash(?1, 2)" )
458+
.setExactArgumentCount( 1 )
459+
.setParameterTypes( FunctionParameterType.STRING )
460+
.setInvariantType( functionContributions.getTypeConfiguration()
461+
.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING) )
462+
.register();
455463
}
456464

457465
/**

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

Lines changed: 10 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,14 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
368370
functionFactory.unnest_h2( getMaximumArraySize() );
369371
functionFactory.generateSeries_h2( getMaximumSeriesSize() );
370372
functionFactory.jsonTable_h2( getMaximumArraySize() );
373+
374+
functionContributions.getFunctionRegistry()
375+
.patternDescriptorBuilder( "sha", "hash('SHA-256', ?1)" )
376+
.setExactArgumentCount( 1 )
377+
.setParameterTypes( FunctionParameterType.STRING )
378+
.setInvariantType( functionContributions.getTypeConfiguration()
379+
.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING) )
380+
.register();
371381
}
372382

373383
/**

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,15 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
688688
if ( supportsRecursiveCTE() ) {
689689
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, false );
690690
}
691+
692+
693+
functionContributions.getFunctionRegistry()
694+
.patternDescriptorBuilder( "sha", "unhex(sha2(?1, 256))" )
695+
.setExactArgumentCount( 1 )
696+
.setParameterTypes( FunctionParameterType.STRING )
697+
.setInvariantType( functionContributions.getTypeConfiguration()
698+
.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING) )
699+
.register();
691700
}
692701

693702
/**

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,14 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
440440
functionFactory.unnest_oracle();
441441
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), true, false );
442442
functionFactory.jsonTable_oracle();
443+
444+
functionContributions.getFunctionRegistry()
445+
.patternDescriptorBuilder( "sha", "standard_hash(?1, 'SHA256')" )
446+
.setExactArgumentCount( 1 )
447+
.setParameterTypes( FunctionParameterType.STRING )
448+
.setInvariantType( functionContributions.getTypeConfiguration()
449+
.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING) )
450+
.register();
443451
}
444452

445453
/**

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

Lines changed: 10 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,14 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
690692
functionFactory.unnest_postgresql();
691693
}
692694
functionFactory.generateSeries( null, "ordinality", false );
695+
696+
functionContributions.getFunctionRegistry()
697+
.patternDescriptorBuilder( "sha", "sha256(?1)" )
698+
.setExactArgumentCount( 1 )
699+
.setParameterTypes( FunctionParameterType.STRING )
700+
.setInvariantType( functionContributions.getTypeConfiguration()
701+
.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING) )
702+
.register();
693703
}
694704

695705
@Override

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

Lines changed: 9 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,14 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
487488
functionFactory.generateSeries_recursive( getMaximumSeriesSize(), false, false );
488489
}
489490
}
491+
492+
functionContributions.getFunctionRegistry()
493+
.patternDescriptorBuilder( "sha", "hashbytes('SHA2_256', ?1)" )
494+
.setExactArgumentCount( 1 )
495+
.setParameterTypes( FunctionParameterType.STRING )
496+
.setInvariantType( functionContributions.getTypeConfiguration()
497+
.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING) )
498+
.register();
490499
}
491500

492501
/**

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747

4848
import java.math.BigDecimal;
4949
import java.math.BigInteger;
50+
import java.security.MessageDigest;
51+
import java.security.NoSuchAlgorithmException;
5052
import java.sql.Time;
5153
import java.sql.Timestamp;
5254
import java.time.Duration;
@@ -2596,4 +2598,23 @@ public void testCtidColumnFunction(SessionFactoryScope scope) {
25962598
.getSingleResultOrNull();
25972599
});
25982600
}
2601+
2602+
@Test
2603+
@RequiresDialect(PostgreSQLDialect.class)
2604+
@RequiresDialect(MySQLDialect.class)
2605+
@RequiresDialect(OracleDialect.class)
2606+
@RequiresDialect(DB2Dialect.class)
2607+
@RequiresDialect(SQLServerDialect.class)
2608+
@RequiresDialect(H2Dialect.class)
2609+
public void testSha256Function(SessionFactoryScope scope) {
2610+
scope.inTransaction(s -> {
2611+
byte[] bytes = s.createSelectionQuery("select sha('hello')", byte[].class).getSingleResult();
2612+
try {
2613+
assertEquals( MessageDigest.getInstance( "SHA-256" ).digest("hello".getBytes()), bytes );
2614+
}
2615+
catch (NoSuchAlgorithmException e) {
2616+
throw new RuntimeException( e );
2617+
}
2618+
});
2619+
}
25992620
}

0 commit comments

Comments
 (0)