OPENJPA-2867 add a way to test reserved words
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/reservedwords/ReservedWordsIT.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/reservedwords/ReservedWordsIT.java
new file mode 100644
index 0000000..90b300d
--- /dev/null
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/reservedwords/ReservedWordsIT.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.reservedwords;
+
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.test.AbstractPersistenceTestCase;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Run this test manually or as part of the integration test suite to
+ * generate the list of reserved words for a specific Database
+ */
+public class ReservedWordsIT extends AbstractPersistenceTestCase {
+    private static OpenJPAEntityManagerFactory _emf;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        _emf = createEMF(new Object[0]);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        closeEMF(_emf);
+        _emf = null;
+        super.tearDown();
+    }
+
+
+    public void testReservedColumnWords() throws Exception {
+        List<String> reservedColumnWords = new ArrayList<>();
+        DBDictionary dict = ((JDBCConfiguration)_emf.getConfiguration()).getDBDictionaryInstance();
+
+        EntityManager em = null;
+        for (String word : getReservedWords()) {
+            try {
+                em = _emf.createEntityManager();
+                em.getTransaction().begin();
+                Query qryCreate = em.createNativeQuery("CREATE TABLE RESERVEDW_TST (" + word + " CHAR(2))");
+                qryCreate.executeUpdate();
+                em.getTransaction().commit();
+
+                em.getTransaction().begin();
+                Query qryDrop = em.createNativeQuery("DROP TABLE RESERVEDW_TST");
+                qryDrop.executeUpdate();
+                em.getTransaction().commit();
+                em.close();
+            } catch (Exception e) {
+                reservedColumnWords.add(word);
+                em.getTransaction().rollback();
+            }
+            finally {
+                if (em != null && em.isOpen()) {
+                    em.close();
+                }
+            }
+        }
+
+        Log log = getLog();
+
+        try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("target/reserved_words_" +
+                dict.getClass().getSimpleName() + ".properties"))) {
+            String msg = "# FOUND " + reservedColumnWords.size() + " RESERVED WORDS for Dictionary " + dict.getClass().getName();
+            log.info(msg);
+            osw.append(msg).append('\n');
+            for (String reservedColumnWord : reservedColumnWords) {
+                log.info(reservedColumnWord);
+                osw.append(reservedColumnWord).append('\n');
+            }
+            osw.flush();
+        }
+        log.info("******* END RESERVED WORDS *******");
+    }
+
+    private List<String> getReservedWords() {
+        List<String> reservedWords = new ArrayList<>(2000);
+
+        try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("org/apache/openjpa/reservedwords/sql_reserved_words.txt")) {
+            BufferedReader br = new BufferedReader(new InputStreamReader(is));
+
+            String line;
+            while ((line = br.readLine()) != null) {
+                line = line.trim();
+                if (line.startsWith("#") || line.isEmpty()) {
+                    continue;
+                }
+                if (line.contains(" ")) {
+                    throw new RuntimeException("only one reserved word per line please! got: " + line);
+                }
+                reservedWords.add(line);
+            }
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return reservedWords;
+    }
+
+    private Log getLog() {
+        return _emf.getConfiguration().getLog("Tests");
+    }
+
+
+}
diff --git a/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/reservedwords/sql_reserved_words.txt b/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/reservedwords/sql_reserved_words.txt
new file mode 100644
index 0000000..487e0ff
--- /dev/null
+++ b/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/reservedwords/sql_reserved_words.txt
@@ -0,0 +1,845 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ***************
+# List of all candidates of reserved words across multiple databases
+#
+A
+ABORT
+ABS
+ABSOLUTE
+ACCESS
+ACTION
+ADA
+ADD
+ADMIN
+AFTER
+AGGREGATE
+ALIAS
+ALL
+ALLOCATE
+ALSO
+ALTER
+ALWAYS
+ANALYSE
+ANALYZE
+AND
+ANY
+ARE
+ARRAY
+AS
+ASC
+ASENSITIVE
+ASSERTION
+ASSIGNMENT
+ASYMMETRIC
+AT
+ATOMIC
+ATTRIBUTE
+ATTRIBUTES
+AUDIT
+AUTHORIZATION
+AUTO_INCREMENT
+AVG
+AVG_ROW_LENGTH
+BACKUP
+BACKWARD
+BEFORE
+BEGIN
+BERNOULLI
+BETWEEN
+BIGINT
+BINARY
+BIT
+BIT_LENGTH
+BITVAR
+BLOB
+BOOL
+BOOLEAN
+BOTH
+BREADTH
+BREAK
+BROWSE
+BULK
+BY
+C
+CACHE
+CALL
+CALLED
+CARDINALITY
+CASCADE
+CASCADED
+CASE
+CAST
+CATALOG
+CATALOG_NAME
+CEIL
+CEILING
+CHAIN
+CHANGE
+CHAR
+CHAR_LENGTH
+CHARACTER
+CHARACTER_LENGTH
+CHARACTER_SET_CATALOG
+CHARACTER_SET_NAME
+CHARACTER_SET_SCHEMA
+CHARACTERISTICS
+CHARACTERS
+CHECK
+CHECKED
+CHECKPOINT
+CHECKSUM
+CLASS
+CLASS_ORIGIN
+CLOB
+CLOSE
+CLUSTER
+CLUSTERED
+COALESCE
+COBOL
+COLLATE
+COLLATION
+COLLATION_CATALOG
+COLLATION_NAME
+COLLATION_SCHEMA
+COLLECT
+COLUMN
+COLUMN_NAME
+COLUMNS
+COMMAND_FUNCTION
+COMMAND_FUNCTION_CODE
+COMMENT
+COMMIT
+COMMITTED
+COMPLETION
+COMPRESS
+COMPUTE
+CONDITION
+CONDITION_NUMBER
+CONNECT
+CONNECTION
+CONNECTION_NAME
+CONSTRAINT
+CONSTRAINT_CATALOG
+CONSTRAINT_NAME
+CONSTRAINT_SCHEMA
+CONSTRAINTS
+CONSTRUCTOR
+CONTAINS
+CONTAINSTABLE
+CONTINUE
+CONVERSION
+CONVERT
+COPY
+CORR
+CORRESPONDING
+COUNT
+COVAR_POP
+COVAR_SAMP
+CREATE
+CREATEDB
+CREATEROLE
+CREATEUSER
+CROSS
+CSV
+CUBE
+CUME_DIST
+CURRENT
+CURRENT_DATE
+CURRENT_DEFAULT_TRANSFORM_GROUP
+CURRENT_PATH
+CURRENT_ROLE
+CURRENT_TIME
+CURRENT_TIMESTAMP
+CURRENT_TRANSFORM_GROUP_FOR_TYPE
+CURRENT_USER
+CURSOR
+CURSOR_NAME
+CYCLE
+DATA
+DATABASE
+DATABASES
+DATE
+DATETIME
+DATETIME_INTERVAL_CODE
+DATETIME_INTERVAL_PRECISION
+DAY
+DAY_HOUR
+DAY_MICROSECOND
+DAY_MINUTE
+DAY_SECOND
+DAYOFMONTH
+DAYOFWEEK
+DAYOFYEAR
+DBCC
+DEALLOCATE
+DEC
+DECIMAL
+DECLARE
+DEFAULT
+DEFAULTS
+DEFERRABLE
+DEFERRED
+DEFINED
+DEFINER
+DEGREE
+DELAY_KEY_WRITE
+DELAYED
+DELETE
+DELIMITER
+DELIMITERS
+DENSE_RANK
+DENY
+DEPTH
+DEREF
+DERIVED
+DESC
+DESCRIBE
+DESCRIPTOR
+DESTROY
+DESTRUCTOR
+DETERMINISTIC
+DIAGNOSTICS
+DICTIONARY
+DISABLE
+DISCONNECT
+DISK
+DISPATCH
+DISTINCT
+DISTINCTROW
+DISTRIBUTED
+DIV
+DO
+DOMAIN
+DOUBLE
+DROP
+DUAL
+DUMMY
+DUMP
+DYNAMIC
+DYNAMIC_FUNCTION
+DYNAMIC_FUNCTION_CODE
+EACH
+ELEMENT
+ELSE
+ELSEIF
+ENABLE
+ENCLOSED
+ENCODING
+ENCRYPTED
+END
+END-EXEC
+ENUM
+EQUALS
+ERRLVL
+ESCAPE
+ESCAPED
+EVERY
+EXCEPT
+EXCEPTION
+EXCLUDE
+EXCLUDING
+EXCLUSIVE
+EXEC
+EXECUTE
+EXISTING
+EXISTS
+EXIT
+EXP
+EXPLAIN
+EXTERNAL
+EXTRACT
+FALSE
+FETCH
+FIELDS
+FILE
+FILLFACTOR
+FILTER
+FINAL
+FIRST
+FLOAT
+FLOAT4
+FLOAT8
+FLOOR
+FLUSH
+FOLLOWING
+FOR
+FORCE
+FOREIGN
+FORTRAN
+FORWARD
+FOUND
+FREE
+FREETEXT
+FREETEXTTABLE
+FREEZE
+FROM
+FULL
+FULLTEXT
+FUNCTION
+FUSION
+G
+GENERAL
+GENERATED
+GET
+GLOBAL
+GO
+GOTO
+GRANT
+GRANTED
+GRANTS
+GREATEST
+GROUP
+GROUPING
+HANDLER
+HAVING
+HEADER
+HEAP
+HIERARCHY
+HIGH_PRIORITY
+HOLD
+HOLDLOCK
+HOST
+HOSTS
+HOUR
+HOUR_MICROSECOND
+HOUR_MINUTE
+HOUR_SECOND
+IDENTIFIED
+IDENTITY
+IDENTITY_INSERT
+IDENTITYCOL
+IF
+IGNORE
+ILIKE
+IMMEDIATE
+IMMUTABLE
+IMPLEMENTATION
+IMPLICIT
+IN
+INCLUDE
+INCLUDING
+INCREMENT
+INDEX
+INDICATOR
+INFILE
+INFIX
+INHERIT
+INHERITS
+INITIAL
+INITIALIZE
+INITIALLY
+INNER
+INOUT
+INPUT
+INSENSITIVE
+INSERT
+INSERT_ID
+INSTANCE
+INSTANTIABLE
+INSTEAD
+INT
+INT1
+INT2
+INT3
+INT4
+INT8
+INTEGER
+INTERSECT
+INTERSECTION
+INTERVAL
+INTO
+INVOKER
+IS
+ISAM
+ISNULL
+ISOLATION
+ITERATE
+JOIN
+K
+KEY
+KEY_MEMBER
+KEY_TYPE
+KEYS
+KILL
+LANCOMPILER
+LANGUAGE
+LARGE
+LAST
+LAST_INSERT_ID
+LATERAL
+LEAD
+LEADING
+LEAST
+LEAVE
+LEFT
+LENGTH
+LESS
+LEVEL
+LIKE
+LIMIT
+LINENO
+LINES
+LISTEN
+LN
+LOAD
+LOCAL
+LOCALTIME
+LOCALTIMESTAMP
+LOCATION
+LOCATOR
+LOCK
+LOGIN
+LOGS
+LONG
+LONGBLOB
+LONGTEXT
+LOOP
+LOW_PRIORITY
+LOWER
+M
+MAP
+MATCH
+MATCHED
+MAX
+MAX_ROWS
+MAXEXTENTS
+MAXVALUE
+MEDIUMBLOB
+MEDIUMINT
+MEDIUMTEXT
+MEMBER
+MERGE
+MESSAGE_LENGTH
+MESSAGE_OCTET_LENGTH
+MESSAGE_TEXT
+METHOD
+MIDDLEINT
+MIN
+MIN_ROWS
+MINUS
+MINUTE
+MINUTE_MICROSECOND
+MINUTE_SECOND
+MINVALUE
+MLSLABEL
+MOD
+MODE
+MODIFIES
+MODIFY
+MODULE
+MONTH
+MONTHNAME
+MORE
+MOVE
+MULTISET
+MUMPS
+MYISAM
+NAME
+NAMES
+NATIONAL
+NATURAL
+NCHAR
+NCLOB
+NESTING
+NEW
+NEXT
+NO
+NO_WRITE_TO_BINLOG
+NOAUDIT
+NOCHECK
+NOCOMPRESS
+NOCREATEDB
+NOCREATEROLE
+NOCREATEUSER
+NOINHERIT
+NOLOGIN
+NONCLUSTERED
+NONE
+NORMALIZE
+NORMALIZED
+NOSUPERUSER
+NOT
+NOTHING
+NOTIFY
+NOTNULL
+NOWAIT
+NULL
+NULLABLE
+NULLIF
+NULLS
+NUMBER
+NUMERIC
+OBJECT
+OCTET_LENGTH
+OCTETS
+OF
+OFF
+OFFLINE
+OFFSET
+OFFSETS
+OIDS
+OLD
+ON
+ONLINE
+ONLY
+OPEN
+OPENDATASOURCE
+OPENQUERY
+OPENROWSET
+OPENXML
+OPERATION
+OPERATOR
+OPTIMIZE
+OPTION
+OPTIONALLY
+OPTIONS
+OR
+ORDER
+ORDERING
+ORDINALITY
+OTHERS
+OUT
+OUTER
+OUTFILE
+OUTPUT
+OVER
+OVERLAPS
+OVERLAY
+OVERRIDING
+OWNER
+PACK_KEYS
+PAD
+PARAMETER
+PARAMETER_MODE
+PARAMETER_NAME
+PARAMETER_ORDINAL_POSITION
+PARAMETER_SPECIFIC_CATALOG
+PARAMETER_SPECIFIC_NAME
+PARAMETER_SPECIFIC_SCHEMA
+PARAMETERS
+PARTIAL
+PARTITION
+PASCAL
+PASSWORD
+PATH
+PCTFREE
+PERCENT
+PERCENT_RANK
+PERCENTILE_CONT
+PERCENTILE_DISC
+PLACING
+PLAN
+PLI
+POSITION
+POSTFIX
+POWER
+PRECEDING
+PRECISION
+PREFIX
+PREORDER
+PREPARE
+PREPARED
+PRESERVE
+PRIMARY
+PRINT
+PRIOR
+PRIVILEGES
+PROC
+PROCEDURAL
+PROCEDURE
+PROCESS
+PROCESSLIST
+PUBLIC
+PURGE
+QUOTE
+RAID0
+RAISERROR
+RANGE
+RANK
+RAW
+READ
+READS
+READTEXT
+REAL
+RECHECK
+RECONFIGURE
+RECURSIVE
+REF
+REFERENCES
+REFERENCING
+REGEXP
+REGR_AVGX
+REGR_AVGY
+REGR_COUNT
+REGR_INTERCEPT
+REGR_R2
+REGR_SLOPE
+REGR_SXX
+REGR_SXY
+REGR_SYY
+REINDEX
+RELATIVE
+RELEASE
+RELOAD
+RENAME
+REPEAT
+REPEATABLE
+REPLACE
+REPLICATION
+REQUIRE
+RESET
+RESIGNAL
+RESOURCE
+RESTART
+RESTORE
+RESTRICT
+RESULT
+RETURN
+RETURNED_CARDINALITY
+RETURNED_LENGTH
+RETURNED_OCTET_LENGTH
+RETURNED_SQLSTATE
+RETURNS
+REVOKE
+RIGHT
+RLIKE
+ROLE
+ROLLBACK
+ROLLUP
+ROUTINE
+ROUTINE_CATALOG
+ROUTINE_NAME
+ROUTINE_SCHEMA
+ROW
+ROW_COUNT
+ROW_NUMBER
+ROWCOUNT
+ROWGUIDCOL
+ROWID
+ROWNUM
+ROWS
+RULE
+SAVE
+SAVEPOINT
+SCALE
+SCHEMA
+SCHEMA_NAME
+SCHEMAS
+SCOPE
+SCOPE_CATALOG
+SCOPE_NAME
+SCOPE_SCHEMA
+SCROLL
+SEARCH
+SECOND
+SECOND_MICROSECOND
+SECTION
+SECURITY
+SELECT
+SELF
+SENSITIVE
+SEPARATOR
+SEQUENCE
+SERIALIZABLE
+SERVER_NAME
+SESSION
+SESSION_USER
+SET
+SETOF
+SETS
+SETUSER
+SHARE
+SHOW
+SHUTDOWN
+SIGNAL
+SIMILAR
+SIMPLE
+SIZE
+SMALLINT
+SOME
+SONAME
+SOURCE
+SPACE
+SPATIAL
+SPECIFIC
+SPECIFIC_NAME
+SPECIFICTYPE
+SQL
+SQL_BIG_RESULT
+SQL_BIG_SELECTS
+SQL_BIG_TABLES
+SQL_CALC_FOUND_ROWS
+SQL_LOG_OFF
+SQL_LOG_UPDATE
+SQL_LOW_PRIORITY_UPDATES
+SQL_SELECT_LIMIT
+SQL_SMALL_RESULT
+SQL_WARNINGS
+SQLCA
+SQLCODE
+SQLERROR
+SQLEXCEPTION
+SQLSTATE
+SQLWARNING
+SQRT
+SSL
+STABLE
+START
+STARTING
+STATE
+STATEMENT
+STATIC
+STATISTICS
+STATUS
+STDDEV_POP
+STDDEV_SAMP
+STDIN
+STDOUT
+STORAGE
+STRAIGHT_JOIN
+STRICT
+STRING
+STRUCTURE
+STYLE
+SUBCLASS_ORIGIN
+SUBLIST
+SUBMULTISET
+SUBSTRING
+SUCCESSFUL
+SUM
+SUPERUSER
+SYMMETRIC
+SYNONYM
+SYSDATE
+SYSID
+SYSTEM
+SYSTEM_USER
+TABLE
+TABLE_NAME
+TABLES
+TABLESAMPLE
+TABLESPACE
+TEMP
+TEMPLATE
+TEMPORARY
+TERMINATE
+TERMINATED
+TEXT
+TEXTSIZE
+THAN
+THEN
+TIES
+TIME
+TIMESTAMP
+TIMEZONE_HOUR
+TIMEZONE_MINUTE
+TINYBLOB
+TINYINT
+TINYTEXT
+TO
+TOAST
+TOP
+TOP_LEVEL_COUNT
+TRAILING
+TRAN
+TRANSACTION
+TRANSACTION_ACTIVE
+TRANSACTIONS_COMMITTED
+TRANSACTIONS_ROLLED_BACK
+TRANSFORM
+TRANSFORMS
+TRANSLATE
+TRANSLATION
+TREAT
+TRIGGER
+TRIGGER_CATALOG
+TRIGGER_NAME
+TRIGGER_SCHEMA
+TRIM
+TRUE
+TRUNCATE
+TRUSTED
+TSEQUAL
+TYPE
+UESCAPE
+UID
+UNBOUNDED
+UNCOMMITTED
+UNDER
+UNDO
+UNENCRYPTED
+UNION
+UNIQUE
+UNKNOWN
+UNLISTEN
+UNLOCK
+UNNAMED
+UNNEST
+UNSIGNED
+UNTIL
+UPDATE
+UPDATETEXT
+UPPER
+USAGE
+USE
+USER
+USER_DEFINED_TYPE_CATALOG
+USER_DEFINED_TYPE_CODE
+USER_DEFINED_TYPE_NAME
+USER_DEFINED_TYPE_SCHEMA
+USING
+UTC_DATE
+UTC_TIME
+UTC_TIMESTAMP
+VACUUM
+VALID
+VALIDATE
+VALIDATOR
+VALUE
+VALUES
+VAR_POP
+VAR_SAMP
+VARBINARY
+VARCHAR
+VARCHAR2
+VARCHARACTER
+VARIABLE
+VARIABLES
+VARYING
+VERBOSE
+VIEW
+VOLATILE
+WAITFOR
+WHEN
+WHENEVER
+WHERE
+WHILE
+WIDTH_BUCKET
+WINDOW
+WITH
+WITHIN
+WITHOUT
+WORK
+WRITE
+WRITETEXT
+X509
+XOR
+YEAR
+YEAR_MONTH
+ZEROFILL
+ZONE
\ No newline at end of file