Re: How does HSQLDB resolve which user-defined function to invoke?
Fred Toussi via Hsqldb-user <[email protected]> Sat, 29 Jul 2023 22:26:28 +0100
| Newsgroups | gmane.comp.java.hsqldb.user |
|---|---|
| Message-ID | <[email protected]> |
I don't know what JPA is doing and how this relies on the order of function creation. I would suggest using different function names. On Sat, Jul 29, 2023, at 20:45, Chris Rankin wrote: > Hi, thanks for replying. > > I was hoping that JPA's `setParameter()` API could somehow inform the > SQL parser about the value's _actual_ type at runtime :-(. > > Does this mean that swapping the order of the CREATE FUNCTION > statement so that the variant with the INT parameter is created first > is not _supposed_ to make any difference? > > Thanks again, > Chris > > On Sat, 29 Jul 2023 at 19:26, Fred Toussi via Hsqldb-user > <[email protected]> wrote: >> >> HSQLDB can use the correct signature of the function if enough information is available in the SELECT statement. >> >> SELECT ... WHERE JsonFieldAsText(a, :index) = :value >> >> In the above statement, the type of the :index variable is not known to the SQL parser and it defaults to a VARCHAR type. When writing an SQL statement, JsonFieldAsText(a, CAST(;index AS INT)) can be used to force the INT type. >> >> Fred >> >> On Sat, Jul 29, 2023, at 17:49, Chris Rankin wrote: >> > Hi, >> > >> > I am using HSQLDB 2.7.2, and I am writing some Java functions that act >> > like the Postgres "->>" operator, e.g. >> > >> > a ->> b = field 'b' from JSON object >> > a ->> 1 = element [1] from JSON array >> > >> > So I've mapped two Java functions into HSQLDB, using SQL like this: >> > >> > CREATE FUNCTION JsonFieldAsText(IN json VARCHAR(32768), IN fieldIndex INT) >> > RETURNS VARCHAR(32768) >> > LANGUAGE JAVA DETERMINISTIC NO SQL >> > EXTERNAL NAME 'CLASSPATH:MyClass.fieldByIndex >> > >> > CREATE FUNCTION JsonFieldAsText(IN json VARCHAR(32768), IN fieldIName >> > VARCHAR(50)) >> > RETURNS VARCHAR(32768) >> > LANGUAGE JAVA DETERMINISTIC NO SQL >> > EXTERNAL NAME 'CLASSPATH:MyClass.fieldByName >> > >> > The idea is that; >> > >> > "a ->> b" becomes "JsonFieldAsText(a, 'b')", and >> > "a ->> 1" becomes "JsonFieldAsText(a, 1)" >> > >> > This all seems OK, except for when I tried to execute a JPA Query: >> > >> > "SELECT ... WHERE JsonFieldAsText(a, :index) = :value" >> > >> > having set the index parameter using "setParameter("index", 2)". >> > >> > My understanding was that HSQLDB would choose the JsonFieldAsText() >> > function whose signature provided the best match to the parameters, >> > i.e. the one that maps to MyClass.fieldAsIndex(). However, I was >> > alarmed to see HSQLDB choose to execute the MyClass.fieldAsName() >> > variant instead. >> > >> > I have currently "resolved" this issue by swapping the order of my >> > CREATE FUNCTION statements so that the one mapping to >> > MyClass.fieldAsIndex() is executed first, but I could be relying on >> > undocumented behaviour here, for all I know. >> > >> > Can anyone advise me as to whether there's a better way to do this please? >> > >> > Thanks, >> > Chris >> > >> > >> > _______________________________________________ >> > Hsqldb-user mailing list >> > [email protected] >> > https://lists.sourceforge.net/lists/listinfo/hsqldb-user >> >> >> _______________________________________________ >> Hsqldb-user mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/hsqldb-user