Skip to content

Commit 80ddafc

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

File tree

9 files changed

+97
-0
lines changed

9 files changed

+97
-0
lines changed

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

Lines changed: 11 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,15 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
503505
new PostgreSQLTruncFunction( true, functionContributions.getTypeConfiguration() )
504506
);
505507
functionContributions.getFunctionRegistry().registerAlternateKey( "truncate", "trunc" );
508+
509+
510+
functionContributions.getFunctionRegistry()
511+
.patternDescriptorBuilder( "sha", "sha256(?1)" )
512+
.setExactArgumentCount( 1 )
513+
.setParameterTypes( FunctionParameterType.STRING )
514+
.setInvariantType( functionContributions.getTypeConfiguration()
515+
.getBasicTypeRegistry().resolve( StandardBasicTypes.BINARY) )
516+
.register();
506517
}
507518

508519
@Override

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.BINARY) )
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.BINARY) )
380+
.register();
371381
}
372382

373383
/**

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

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

518518
// functionFactory.xmlextract();
519519
functionFactory.generateSeries_hana( getMaximumSeriesSize() );
520+
521+
functionContributions.getFunctionRegistry()
522+
.patternDescriptorBuilder( "sha", "hash_sha256(?1)" )
523+
.setExactArgumentCount( 1 )
524+
.setParameterTypes( FunctionParameterType.STRING )
525+
.setInvariantType( functionContributions.getTypeConfiguration()
526+
.getBasicTypeRegistry().resolve( StandardBasicTypes.BINARY) )
527+
.register();
520528
}
521529

522530
/**

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.BINARY) )
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.BINARY) )
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.BINARY) )
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.BINARY) )
498+
.register();
490499
}
491500

492501
/**

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+
assertEquals( 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)