Bug #2737

Exception when attributeName contains SQL keywords

Added by Chad Burt over 15 years ago. Updated over 10 years ago.

Target version:
Start date:
Due date:
% Done:


Estimated time:


A dataset I'm working with has columns named "group" and "order". When trying to import the dataset into a sql database using the DataManager library I get this exception:

SQLException: ERROR: syntax error at or near "group"

The library has a problem with columns named after SQL keywords. While group may be easier to avoid, order would not when storing taxonomic info. There is a large list of reserved keywords for postgres including Year, Datestamp, etc that I haven't yet tested.

Here is a link to the problem dataset:


#1 Updated by ben leinfelder over 12 years ago

We should be able to wrap the attribute names in quotes to escape the reserved words. Not sure if it's standard across all RDBMS, but it seems like each DB adaptor could handle this.

#2 Updated by Duane Costa over 10 years ago

I was able to test the fix suggested by Ben, wrapping the attribute names in quotes, for both Postgres and HSQL.

Completed with the following update:

Author: costa
Date: 2012-01-23 15:27:10 -0800 (Mon, 23 Jan 2012)
New Revision: 2221

Fix for Bug #2737: Exception when attributeName contains SQL keywords.

#3 Updated by Duane Costa over 10 years ago

Needed to rework the original bug fix because it did not work well with the logic for handling non-unique attribute names. Thanks to Gastil for catching this! (Read on for details.)

This has been fixed with update r2223.

On January 25, 2012, mgastil-buhl wrote:

The DML already had in it a method mangledName() which appended _Prime to attributeNames as many times as needed to make them unique within a table. (Of course it is bad practice to use non-unique column names but such exist.) The wrapping in double quotes needs to happen after the mangledName() method.
For example, knb-lter-mcr.31.23 returned this error (excerpt)
"adcp_wave_measurment" FLOAT,
"adcp_wave_measurment"_Prime FLOAT,
"adcp_wave_measurment"_Prime_Prime FLOAT,
"adcp_wave_measurment"_Prime_Prime_Prime FLOAT,
"adcp_wave_measurment"_Prime_Prime_Prime_Prime FLOAT,
"Temp_01m_HeightAboveBottom" FLOAT,
in its attempted sql table create statement.
Line 158 of DatabaseAdapter?.java is where mangledName() is called.
Line 154 is where getLegalDbFieldName() is called.
I can see the logic of how replacing any of a set of odd characters with underscore could make attributeNames suddenly non-unique. So, if mangle is done after legal, then at least stuff the _Prime inside the quotes, even if it means stripping the quotes, appending _Prime, and re-quoting.
I'll be uniquifying knb-lter-mcr.31.23 but there may be others out there.

#4 Updated by Redmine Admin over 9 years ago

Original Bugzilla ID was 2737

Also available in: Atom PDF