[hibernate-dev] Auto quoting of keywords used as identifiers

Sanne Grinovero sanne at hibernate.org
Fri May 1 10:26:47 EDT 2015

Rather than basing our decisions on standards, wouldn't it be more
useful to base it on *exactly* what the used database requires?

In other words, why wouldn't it suffice to have a single source of
keywords: the Dialect.


On 1 May 2015 at 15:19, Steve Ebersole <steve at hibernate.org> wrote:
> Interestingly, your IRC ping asked about KEY which in fact is *not* a
> SQL:2003 keyword.  It had been a keyword in 92 and 99 SQL standards, but
> was removed in 2003.
> Which actually opens up an another interesting discussion as far as how
> aggressive to be in terms of affirming an identifier as being a keyword and
> thus quoting it.  Do we use SQL:2003 as the baseline?  Do we use SQL3
> (99)?  SQL2 (92)?  Do we more aggressively build a superset from all 3?
> My gut says we should:
> 1) Use SQL:2003 as the baseline
> 2) Augment with DatabaseMetaData#getSQLKeywords
> 3) Augment with Dialect#getKeywords
> 4) (?) Augment with application-provided keywords
> FWIW (4) can actually be handles via custom PhysicalNamingStrategy in terms
> of a custom PhysicalNamingStrategy deciding to quote a given identifier.
> On Fri, May 1, 2015 at 8:51 AM, Steve Ebersole <steve at hibernate.org> wrote:
>> Gail, I saw your ping on IRC and thought it made sense to address here,
>> since you were not around on IRC anymore.
>> Overall, starting with 5.0, the idea is for Hibernate to automatically
>> quote any identifiers is recognizes as a keyword.  This is all encapsulated
>> within the org.hibernate.engine.jdbc.env.spi.IdentifierHelper obtained
>> via org.hibernate.engine.jdbc.env.spi.JdbcEnvironment#getIdentifierHelper.
>> There are 2 parts to this...
>> First, we need to be able to recognize that an identifier is in fact a
>> keyword.  This piece is handled through
>> org.hibernate.engine.jdbc.env.spi.JdbcEnvironment#isReservedWord, which is
>> based on a Set of keywords computed from 2 distinct "keyword sources":
>> 1) Dialect#getKeywords
>> 2) DatabaseMetaData#getSQLKeywords
>> At the moment, I think this misses a third source... ANSI SQL 2003
>> standard keywords.  DatabaseMetaData#getSQLKeywords specifically is
>> supposed to return only keywords beyond the standard (2003) defined ones.
>> There are really 2 options to address this:
>> 1) add these standard keywords to Dialect
>> 2) use a seperate (static) source for them.
>> Personally I prefer the second.  Even if we added all the standard
>> keywords to the base Dialect Set, it is just too easy for the Dialect
>> subclass to override getKeywords().  Also, I like the idea of continuing
>> the convention of these other 2 sources simply returning "extras".
>> Second, and this is BY FAR the harder part, we need to make sure that
>> everywhere that is building identifiers is using this code.  I tried hard
>> to make sure that was the case, but we all know that annotation binding is
>> a mess and its just too easy to miss stuff in there.  I'm all happy for a
>> second (or third, or fourth, ...) pair of eyes looking over this part, but
>> I personally think it is not the best allocation of our time considering
>> the difficulty in actually finding them all just by code review and the
>> time it would take and the amount of other stuff we have to do.  Eventually
>> we will get bug reports of cases where this does not happen.  My $.02
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev

More information about the hibernate-dev mailing list