Skip to content

Commit 08f90cc

Browse files
gavinkingsebersole
authored andcommitted
completely rewrite the whole Dialect SQL function registration
1 parent 9b9a787 commit 08f90cc

25 files changed

+754
-1514
lines changed

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

Lines changed: 23 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import org.hibernate.ScrollMode;
4343
import org.hibernate.boot.model.TypeContributions;
4444
import org.hibernate.cfg.AvailableSettings;
45-
import org.hibernate.dialect.function.LocateEmulation;
45+
import org.hibernate.dialect.function.CommonFunctionFactory;
4646
import org.hibernate.dialect.identity.HANAIdentityColumnSupport;
4747
import org.hibernate.dialect.identity.IdentityColumnSupport;
4848
import org.hibernate.dialect.pagination.AbstractLimitHandler;
@@ -274,118 +274,32 @@ public AbstractHANADialect() {
274274
@Override
275275
public void initializeFunctionRegistry(QueryEngine queryEngine) {
276276
super.initializeFunctionRegistry( queryEngine );
277-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_date", StandardSpiBasicTypes.DATE );
278-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_seconddate", StandardSpiBasicTypes.TIMESTAMP );
279-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_time", StandardSpiBasicTypes.TIME );
280-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_timestamp", StandardSpiBasicTypes.TIMESTAMP );
281-
282-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "current_utcdate", StandardSpiBasicTypes.DATE );
283-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "current_utctime", StandardSpiBasicTypes.TIME );
284-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "current_utctimestamp", StandardSpiBasicTypes.TIMESTAMP );
285-
286-
queryEngine.getSqmFunctionRegistry().registerNamed( "add_days" );
287-
queryEngine.getSqmFunctionRegistry().registerNamed( "add_months" );
288-
queryEngine.getSqmFunctionRegistry().registerNamed( "add_seconds" );
289-
queryEngine.getSqmFunctionRegistry().registerNamed( "add_years" );
290-
queryEngine.getSqmFunctionRegistry().registerNamed( "dayname", StandardSpiBasicTypes.STRING );
291-
queryEngine.getSqmFunctionRegistry().registerNamed( "dayofmonth", StandardSpiBasicTypes.INTEGER );
292-
queryEngine.getSqmFunctionRegistry().registerNamed( "dayofyear", StandardSpiBasicTypes.INTEGER );
293-
queryEngine.getSqmFunctionRegistry().registerNamed( "days_between", StandardSpiBasicTypes.INTEGER );
294-
queryEngine.getSqmFunctionRegistry().registerNamed( "hour", StandardSpiBasicTypes.INTEGER );
295-
queryEngine.getSqmFunctionRegistry().registerNamed( "isoweek", StandardSpiBasicTypes.STRING );
296-
queryEngine.getSqmFunctionRegistry().registerNamed( "last_day", StandardSpiBasicTypes.DATE );
297-
queryEngine.getSqmFunctionRegistry().registerNamed( "localtoutc", StandardSpiBasicTypes.TIMESTAMP );
298-
queryEngine.getSqmFunctionRegistry().registerNamed( "minute", StandardSpiBasicTypes.INTEGER );
299-
queryEngine.getSqmFunctionRegistry().registerNamed( "month", StandardSpiBasicTypes.INTEGER );
300-
queryEngine.getSqmFunctionRegistry().registerNamed( "monthname", StandardSpiBasicTypes.STRING );
301-
queryEngine.getSqmFunctionRegistry().registerNamed( "next_day", StandardSpiBasicTypes.DATE );
302-
queryEngine.getSqmFunctionRegistry().registerNamed( "quarter", StandardSpiBasicTypes.STRING );
303-
queryEngine.getSqmFunctionRegistry().registerNamed( "second", StandardSpiBasicTypes.INTEGER );
304-
queryEngine.getSqmFunctionRegistry().registerNamed( "seconds_between", StandardSpiBasicTypes.LONG );
305-
queryEngine.getSqmFunctionRegistry().registerNamed( "week", StandardSpiBasicTypes.INTEGER );
306-
queryEngine.getSqmFunctionRegistry().registerNamed( "weekday", StandardSpiBasicTypes.INTEGER );
307-
queryEngine.getSqmFunctionRegistry().registerNamed( "year", StandardSpiBasicTypes.INTEGER );
308-
queryEngine.getSqmFunctionRegistry().registerNamed( "utctolocal", StandardSpiBasicTypes.TIMESTAMP );
309-
310-
311-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_bigint", StandardSpiBasicTypes.LONG );
312-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_binary", StandardSpiBasicTypes.BINARY );
313-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_decimal", StandardSpiBasicTypes.BIG_DECIMAL );
314-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_double", StandardSpiBasicTypes.DOUBLE );
315-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_int", StandardSpiBasicTypes.INTEGER );
316-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_integer", StandardSpiBasicTypes.INTEGER );
317-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_real", StandardSpiBasicTypes.FLOAT );
318-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_smalldecimal", StandardSpiBasicTypes.BIG_DECIMAL );
319-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_smallint", StandardSpiBasicTypes.SHORT );
320-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_tinyint", StandardSpiBasicTypes.BYTE );
321-
322-
queryEngine.getSqmFunctionRegistry().registerNamed( "bin2hex", StandardSpiBasicTypes.STRING );
323-
queryEngine.getSqmFunctionRegistry().registerNamed( "bitand", StandardSpiBasicTypes.LONG );
277+
324278
queryEngine.getSqmFunctionRegistry().registerNamed( "greatest" );
325-
queryEngine.getSqmFunctionRegistry().registerNamed( "hex2bin", StandardSpiBasicTypes.BINARY );
326279
queryEngine.getSqmFunctionRegistry().registerNamed( "least" );
327-
queryEngine.getSqmFunctionRegistry().registerNamed( "log", StandardSpiBasicTypes.DOUBLE );
328-
queryEngine.getSqmFunctionRegistry().registerNamed( "uminus" );
329-
queryEngine.getSqmFunctionRegistry().registerNamed( "round" );
330-
queryEngine.getSqmFunctionRegistry().registerNamed( "sinh", StandardSpiBasicTypes.DOUBLE );
331-
queryEngine.getSqmFunctionRegistry().registerNamed( "tanh", StandardSpiBasicTypes.DOUBLE );
332-
queryEngine.getSqmFunctionRegistry().registerNamed( "cosh", StandardSpiBasicTypes.DOUBLE );
333-
queryEngine.getSqmFunctionRegistry().registerNamed( "cot", StandardSpiBasicTypes.DOUBLE );
334-
335-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_alphanum", StandardSpiBasicTypes.STRING );
336-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_nvarchar", StandardSpiBasicTypes.STRING );
337-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_varchar", StandardSpiBasicTypes.STRING );
338-
339-
queryEngine.getSqmFunctionRegistry().registerVarArgs( "concat", StandardSpiBasicTypes.STRING, "(", "||", ")" );
340-
341-
queryEngine.getSqmFunctionRegistry().registerNamed( "ascii", StandardSpiBasicTypes.INTEGER );
342-
queryEngine.getSqmFunctionRegistry().registerNamed( "char", StandardSpiBasicTypes.CHARACTER );
343-
queryEngine.getSqmFunctionRegistry().registerNamed( "left", StandardSpiBasicTypes.STRING );
344-
queryEngine.getSqmFunctionRegistry().registerNamed( "lpad", StandardSpiBasicTypes.STRING );
345-
queryEngine.getSqmFunctionRegistry().registerNamed( "ltrim", StandardSpiBasicTypes.STRING );
346-
queryEngine.getSqmFunctionRegistry().registerNamed( "nchar", StandardSpiBasicTypes.STRING );
347-
queryEngine.getSqmFunctionRegistry().registerNamed( "right", StandardSpiBasicTypes.STRING );
348-
queryEngine.getSqmFunctionRegistry().registerNamed( "rpad", StandardSpiBasicTypes.STRING );
349-
queryEngine.getSqmFunctionRegistry().registerNamed( "rtrim", StandardSpiBasicTypes.STRING );
350-
queryEngine.getSqmFunctionRegistry().registerNamed( "substr_after", StandardSpiBasicTypes.STRING );
351-
queryEngine.getSqmFunctionRegistry().registerNamed( "substr_before", StandardSpiBasicTypes.STRING );
352-
queryEngine.getSqmFunctionRegistry().registerNamed( "unicode", StandardSpiBasicTypes.INTEGER );
353-
queryEngine.getSqmFunctionRegistry().registerPattern( "bit_length", "(length(to_binary(?1))*8)", StandardSpiBasicTypes.INTEGER );
354280

355-
queryEngine.getSqmFunctionRegistry().register(
356-
"locate",
357-
new LocateEmulation(
358-
queryEngine.getSqmFunctionRegistry()
359-
.patternTemplateBuilder( "locate/2", "locate(?2, ?1)" )
360-
.setExactArgumentCount( 2 )
361-
.setInvariantType( StandardSpiBasicTypes.INTEGER )
362-
.register(),
363-
queryEngine.getSqmFunctionRegistry()
364-
.patternTemplateBuilder( "locate/3", "locate(?2, ?1, ?3)" )
365-
.setExactArgumentCount( 3 )
366-
.setInvariantType( StandardSpiBasicTypes.INTEGER )
367-
.register()
368-
)
369-
);
281+
queryEngine.getSqmFunctionRegistry().registerPattern( "bit_length", "(length(to_binary(?1))*8)", StandardSpiBasicTypes.INTEGER );
370282

371-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "ceiling", "ceil" )
372-
.setExactArgumentCount( 1 )
373-
.setInvariantType( StandardSpiBasicTypes.DOUBLE )
374-
.register();
375-
376-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_blob", StandardSpiBasicTypes.BLOB );
377-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_clob", StandardSpiBasicTypes.CLOB );
378-
queryEngine.getSqmFunctionRegistry().registerNamed( "to_nclob", StandardSpiBasicTypes.NCLOB );
379-
380-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "current_connection", StandardSpiBasicTypes.INTEGER );
381-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "current_schema", StandardSpiBasicTypes.STRING );
382-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "current_user", StandardSpiBasicTypes.STRING );
383-
queryEngine.getSqmFunctionRegistry().registerNamed( "grouping_id", StandardSpiBasicTypes.INTEGER);
384-
queryEngine.getSqmFunctionRegistry().registerNamed( "ifnull" );
385-
queryEngine.getSqmFunctionRegistry().registerNamed( "map" );
386-
queryEngine.getSqmFunctionRegistry().registerNamed( "session_context" );
387-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "session_user", StandardSpiBasicTypes.STRING );
388-
queryEngine.getSqmFunctionRegistry().registerNoArgs( "sysuuid", StandardSpiBasicTypes.STRING );
283+
CommonFunctionFactory.locate( queryEngine, "locate(?2, ?1)", "locate(?2, ?1, ?3)" );
284+
CommonFunctionFactory.ceiling_ceil( queryEngine );
285+
CommonFunctionFactory.ifnull( queryEngine );
286+
CommonFunctionFactory.concat_operator( queryEngine );
287+
CommonFunctionFactory.pad( queryEngine );
288+
CommonFunctionFactory.trim2( queryEngine );
289+
CommonFunctionFactory.chr_char( queryEngine );
290+
CommonFunctionFactory.cot( queryEngine );
291+
CommonFunctionFactory.cosh( queryEngine );
292+
CommonFunctionFactory.sinh( queryEngine );
293+
CommonFunctionFactory.tanh( queryEngine );
294+
CommonFunctionFactory.bitand( queryEngine );
295+
CommonFunctionFactory.hourMinuteSecond( queryEngine );
296+
CommonFunctionFactory.yearMonthDay( queryEngine );
297+
CommonFunctionFactory.dayofweekmonthyear( queryEngine );
298+
CommonFunctionFactory.weekQuarter( queryEngine );
299+
CommonFunctionFactory.daynameMonthname( queryEngine );
300+
CommonFunctionFactory.lastDay( queryEngine );
301+
CommonFunctionFactory.leftRight( queryEngine );
302+
CommonFunctionFactory.leastGreatest( queryEngine );
389303
}
390304

391305
@Override

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

Lines changed: 9 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -67,56 +67,19 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
6767
CommonFunctionFactory.radians( queryEngine );
6868
CommonFunctionFactory.degrees( queryEngine );
6969
CommonFunctionFactory.pi( queryEngine );
70-
71-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "char" )
72-
.setExactArgumentCount( 1 )
73-
.setInvariantType( StandardSpiBasicTypes.CHARACTER )
74-
.register();
70+
CommonFunctionFactory.reverse( queryEngine );
71+
CommonFunctionFactory.space( queryEngine );
72+
CommonFunctionFactory.yearMonthDay( queryEngine );
73+
CommonFunctionFactory.chr_char( queryEngine );
74+
CommonFunctionFactory.trim1( queryEngine );
75+
CommonFunctionFactory.repeat_replicate( queryEngine );
76+
CommonFunctionFactory.leftRight( queryEngine );
7577

7678
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "len" )
7779
.setInvariantType( StandardSpiBasicTypes.INTEGER )
7880
.setExactArgumentCount( 1 )
7981
.register();
8082

81-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "str" )
82-
.setInvariantType( StandardSpiBasicTypes.STRING )
83-
.setArgumentCountBetween( 1, 3 )
84-
.register();
85-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "ltrim" )
86-
.setInvariantType( StandardSpiBasicTypes.STRING )
87-
.setExactArgumentCount( 1 )
88-
.register();
89-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "rtrim" )
90-
.setInvariantType( StandardSpiBasicTypes.STRING )
91-
.setExactArgumentCount( 1 )
92-
.register();
93-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "reverse" )
94-
.setInvariantType( StandardSpiBasicTypes.STRING )
95-
.setExactArgumentCount( 1 )
96-
.register();
97-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "space" )
98-
.setInvariantType( StandardSpiBasicTypes.STRING )
99-
.setExactArgumentCount( 1 )
100-
.register();
101-
102-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "charindex" )
103-
.setInvariantType( StandardSpiBasicTypes.INTEGER )
104-
.setExactArgumentCount( 2 )
105-
.register();
106-
107-
queryEngine.getSqmFunctionRegistry().noArgsBuilder( "getdate" )
108-
.setInvariantType( StandardSpiBasicTypes.TIMESTAMP )
109-
.setUseParenthesesWhenNoArgs( true )
110-
.register();
111-
queryEngine.getSqmFunctionRegistry().noArgsBuilder( "getutcdate" )
112-
.setInvariantType( StandardSpiBasicTypes.TIMESTAMP )
113-
.setUseParenthesesWhenNoArgs( true )
114-
.register();
115-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "datename" )
116-
.setInvariantType( StandardSpiBasicTypes.STRING )
117-
.setExactArgumentCount( 2 )
118-
.register();
119-
12083
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "square" )
12184
.setExactArgumentCount( 1 )
12285
.register();
@@ -125,18 +88,6 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
12588
.setExactArgumentCount( 2 )
12689
.register();
12790

128-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "day" )
129-
.setInvariantType( StandardSpiBasicTypes.INTEGER )
130-
.setExactArgumentCount( 1 )
131-
.register();
132-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "month" )
133-
.setInvariantType( StandardSpiBasicTypes.INTEGER )
134-
.setExactArgumentCount( 1 )
135-
.register();
136-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "year" )
137-
.setInvariantType( StandardSpiBasicTypes.INTEGER )
138-
.setExactArgumentCount( 1 )
139-
.register();
14091
queryEngine.getSqmFunctionRegistry().patternTemplateBuilder( "second", "datepart(second, ?1)")
14192
.setInvariantType( StandardSpiBasicTypes.INTEGER )
14293
.setExactArgumentCount( 1 )
@@ -174,9 +125,9 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
174125

175126
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "ln", "log" );
176127

177-
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "character_length", "len" );
128+
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "repeat", "replicate" );
178129

179-
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "chr", "char" );
130+
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "character_length", "len" );
180131

181132
queryEngine.getSqmFunctionRegistry().register( "trim", new TransactSQLTrimEmulation() );
182133
}

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -158,26 +158,15 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
158158
queryEngine.getSqmFunctionRegistry().registerNamed( "bit_count", StandardSpiBasicTypes.INTEGER );
159159
queryEngine.getSqmFunctionRegistry().registerNamed( "md5", StandardSpiBasicTypes.STRING );
160160

161-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "substring", "substr" )
162-
.setInvariantType( StandardSpiBasicTypes.STRING )
163-
.setArgumentCountBetween( 2, 3 )
164-
.register();
165-
166-
queryEngine.getSqmFunctionRegistry().registerNamed( "stddev" );
167-
queryEngine.getSqmFunctionRegistry().registerNamed( "variance" );
168-
169-
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "ceiling", "ceil" )
170-
.setExactArgumentCount( 1 )
171-
.setInvariantType( StandardSpiBasicTypes.DOUBLE )
172-
.register();
173-
174161
queryEngine.getSqmFunctionRegistry().registerNamed( "trunc" );
175162
queryEngine.getSqmFunctionRegistry().registerNamed( "nvl" );
176163
queryEngine.getSqmFunctionRegistry().registerNamed( "nvl2" );
177164
queryEngine.getSqmFunctionRegistry().registerNamed( "chr", StandardSpiBasicTypes.CHARACTER );
178165

179166
queryEngine.getSqmFunctionRegistry().registerNamed( "to_char", StandardSpiBasicTypes.STRING );
180167
queryEngine.getSqmFunctionRegistry().registerNamed( "to_date", StandardSpiBasicTypes.TIMESTAMP );
168+
queryEngine.getSqmFunctionRegistry().registerNamed( "substr", StandardSpiBasicTypes.INTEGER );
169+
queryEngine.getSqmFunctionRegistry().registerNamed( "substrb", StandardSpiBasicTypes.INTEGER );
181170
queryEngine.getSqmFunctionRegistry().registerNamed( "instr", StandardSpiBasicTypes.INTEGER );
182171
queryEngine.getSqmFunctionRegistry().registerNamed( "instrb", StandardSpiBasicTypes.INTEGER );
183172
queryEngine.getSqmFunctionRegistry().registerNamed( "lpad", StandardSpiBasicTypes.STRING );
@@ -186,7 +175,19 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
186175

187176
queryEngine.getSqmFunctionRegistry().registerNamed( "add_months", StandardSpiBasicTypes.DATE );
188177
queryEngine.getSqmFunctionRegistry().registerNoArgs( "rownum", StandardSpiBasicTypes.LONG );
178+
179+
queryEngine.getSqmFunctionRegistry().registerNamed( "stddev" );
180+
queryEngine.getSqmFunctionRegistry().registerNamed( "variance" );
181+
189182
queryEngine.getSqmFunctionRegistry().registerVarArgs( "concat", StandardSpiBasicTypes.STRING, "(", "||", ")" );
183+
184+
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "substring", "substr" );
185+
186+
queryEngine.getSqmFunctionRegistry().namedTemplateBuilder( "ceiling", "ceil" )
187+
.setExactArgumentCount( 1 )
188+
.setInvariantType( StandardSpiBasicTypes.DOUBLE )
189+
.register();
190+
190191
}
191192

192193
@Override

0 commit comments

Comments
 (0)