Hi, I've encountered an issue when trying to implement a custom SQLFunction. What I am trying to do is to create a trunc function for PostgreSQL that works the same way it works for Oracle. Oracle's trunc maps to 2 different PostgreSQL functions: trunc and date_trunc. In order to implement this functionality I need to use the firstArgumentType argument. While testing my implementation I've encountered a problem. The render function is called with null firstArgumentType. At the same time, the method getReturnType is called twice, one time with a correct firstArgumentType argument from MethodNode#dialectFunction, and the second time with null from MethodNode#getFirstArgumentType -> IdentNode#getDataType. I believe that there is a bug somewhere in MethodNode. MethodNode#dialectFunction caches the type it obtains from SQLFunction#getReturnType using setDataType on itself. However in getFirstArgumentType it looks in child nodes for the data type and finds nothing and so falls back in IdentNode#getDataType on calling SQLFunction#getReturnType the second time with null:
SQLFunction sf = getWalker().getSessionFactoryHelper().findSQLFunction( getText() );
if ( sf != null ) {
return sf.getReturnType( null, getWalker().getSessionFactoryHelper().getFactory() );
}
I've attached a unit test that shows the issue. I believe the fix should be quite simple, by making sure that MethodNode#dialectFunction and MethodNode#getFirstArgumentType methods use the same place to cache/lookup the result of getReturnType. |