/******************************************************************************* * 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.ofbiz.entity.model; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.GenericEntityException; /** * Generic Entity - Entity Definition Checker * */ public class ModelEntityChecker { public static final String module = ModelEntityChecker.class.getName(); public static void checkEntities(Delegator delegator, List<String> warningList) throws GenericEntityException { ModelReader reader = delegator.getModelReader(); Set<String> reservedWords = new HashSet<String>(); if (Debug.infoOn()) { Debug.logInfo("[initReservedWords] array length = " + rwArray.length, module); } for (int i = 0; i < rwArray.length; i++) { reservedWords.add(rwArray[i]); } Map<String, Set<String>> packages = new HashMap<String, Set<String>>(); Set<String> packageNames = new TreeSet<String>(); Set<String> tableNames = new HashSet<String>(); //put the entityNames TreeSets in a HashMap by packageName Collection<String> ec = reader.getEntityNames(); Set<String> entityNames = new HashSet<String>(ec); for (String eName: ec) { ModelEntity ent = reader.getModelEntity(eName); //make sure the table name is in the list of all table names, if // not null if (UtilValidate.isNotEmpty(ent.getPlainTableName())) tableNames.add(ent.getPlainTableName()); Set<String> entities = packages.get(ent.getPackageName()); if (entities == null) { entities = new TreeSet<String>(); packages.put(ent.getPackageName(), entities); packageNames.add(ent.getPackageName()); } entities.add(eName); } Set<String> fkNames = new HashSet<String>(); Set<String> indexNames = new HashSet<String>(); for (String pName: packageNames) { Set<String> entities = packages.get(pName); for (String entityName: entities) { String helperName = delegator.getEntityHelperName(entityName); String groupName = delegator.getEntityGroupName(entityName); ModelEntity entity = reader.getModelEntity(entityName); if (helperName == null) { //only show group name warning if helper name not found if (UtilValidate.isEmpty(groupName)) { warningList.add("[GroupNotFound] No Group Name found for entity " + entity.getEntityName() + "."); } else { warningList.add("[HelperNotFound] No Helper (DataSource) definition found for entity [" + entity.getEntityName() + "] because there is no helper (datasource) configured for the entity group it is in: [" + groupName + "]"); } } if (entity.getPlainTableName() != null && entity.getPlainTableName().length() > 30) { warningList.add("[TableNameGT30] Table name [" + entity.getPlainTableName() + "] of entity " + entity.getEntityName() + " is longer than 30 characters."); } if (entity.getPlainTableName() != null && reservedWords.contains(entity.getPlainTableName().toUpperCase())) { warningList.add("[TableNameRW] Table name [" + entity.getPlainTableName() + "] of entity " + entity.getEntityName() + " is a reserved word."); } // don't check columns/relations/keys when never-check is set to "true" if (entity.getNeverCheck()) { continue; } Set<String> ufields = new HashSet<String>(); Iterator<ModelField> fieldIter = entity.getFieldsIterator(); while (fieldIter.hasNext()) { ModelField field = fieldIter.next(); ModelFieldType type = delegator.getEntityFieldType(entity,field.getType()); if (ufields.contains(field.getName())) { warningList.add("[FieldNotUnique] Field [" + field.getName() + " of entity " + entity.getEntityName() + " is not unique for that entity."); } else { ufields.add(field.getName()); } if (field.getColName().length() > 30 && !(entity instanceof ModelViewEntity)) { warningList.add("[FieldNameGT30] Column name [" + field.getColName() + "] of entity " + entity.getEntityName() + " is longer than 30 characters."); } if (field.getColName().length() == 0) { warningList.add("[FieldNameEQ0] Column name for field name \"" + field.getName() + "\" of entity " + entity.getEntityName() + " is empty (zero length)."); } if (reservedWords.contains(field.getColName().toUpperCase())) warningList.add("[FieldNameRW] Column name " + field.getColName() + " of entity " + entity.getEntityName() + " is a reserved word."); if (type == null) { StringBuilder warningMsg = new StringBuilder(); warningMsg.append("[FieldTypeNotFound] Field type " + field.getType() + " of entity " + entity.getEntityName() + " not found in field type definitions"); if (helperName == null) { warningMsg.append(" (no helper definition found)"); } warningMsg.append("."); warningList.add(warningMsg.toString()); } } if (entity.getRelationsSize() > 0) { Iterator<ModelIndex> indexIter = entity.getIndexesIterator(); while (indexIter.hasNext()) { ModelIndex index = indexIter.next(); if (indexNames.contains(index.getName())) { warningList.add("[IndexDuplicateName] Index on entity " + entity.getEntityName() + " has a duplicate index-name \"" + index.getName() + "\"."); } else { indexNames.add(index.getName()); } if (tableNames.contains(index.getName())) { warningList.add("[IndexTableDupName] Index on entity " + entity.getEntityName() + " has an index-name \"" + index.getName() + "\" that is also being used as a table name."); } if (fkNames.contains(index.getName())) { warningList.add("[IndexFKDupName] Index on entity " + entity.getEntityName() + " has an index-name \"" + index.getName() + "\" that is also being used as a Foreign Key name."); } // make sure all names are <= 18 characters if (index.getName().length() > 18) { warningList.add("[IndexNameGT18] The index name " + index.getName() + " (length:" + index.getName().length() + ") was greater than 18 characters in length for entity " + entity.getEntityName() + "."); } } Set<String> relations = new HashSet<String>(); for (int r = 0; r < entity.getRelationsSize(); r++) { ModelRelation relation = entity.getRelation(r); if (!entityNames.contains(relation.getRelEntityName())) { warningList.add("[RelatedEntityNotFound] Related entity " + relation.getRelEntityName() + " of entity " + entity.getEntityName() + " not found."); } if (relations.contains(relation.getTitle() + relation.getRelEntityName())) { warningList.add("[RelationNameNotUnique] Relation " + relation.getTitle() + relation.getRelEntityName() + " of entity "+ entity.getEntityName() + " is not unique for that entity."); } else { relations.add(relation.getTitle() + relation.getRelEntityName()); } if (relation.getFkName().length() > 0) { if (fkNames.contains(relation.getFkName())) { warningList.add("[RelationFkDuplicate] Relation to "+ relation.getRelEntityName() + " from entity " + entity.getEntityName() + " has a duplicate fk-name \"" + relation.getFkName() + "\"."); } else { fkNames.add(relation.getFkName()); } if (tableNames.contains(relation.getFkName())) { warningList.add("[RelationFkTableDup] Relation to " + relation.getRelEntityName() + " from entity " + entity.getEntityName() + " has an fk-name \"" + relation.getFkName() + "\" that is also being used as a table name."); } if (indexNames.contains(relation.getFkName())) { warningList.add("[RelationFkTableDup] Relation to " + relation.getRelEntityName() + " from entity " + entity.getEntityName() + " has an fk-name \"" + relation.getFkName() + "\" that is also being used as an index name."); } } // make sure all FK names are <= 18 characters if (relation.getFkName().length() > 18) { warningList.add("[RelFKNameGT18] The foreign key named " + relation.getFkName() + " (length:" + relation.getFkName().length() + ") was greater than 18 characters in length for relation " + relation.getTitle() + relation.getRelEntityName() + " of entity " + entity.getEntityName() + "."); } ModelEntity relatedEntity = null; try { relatedEntity = reader.getModelEntity(relation.getRelEntityName()); } catch (GenericEntityException e) { Debug.logInfo("Entity referred to in relation is not defined: " + relation.getRelEntityName(), module); } if (relatedEntity != null) { //if relation is of type one, make sure keyMaps // match the PK of the relatedEntity if ("one".equals(relation.getType()) || "one-nofk".equals(relation.getType())) { if (relatedEntity.getPksSize() != relation.getKeyMaps().size()) warningList.add("[RelatedOneKeyMapsWrongSize] The number of primary keys (" + relatedEntity.getPksSize() + ") of related entity " + relation.getRelEntityName() + " does not match the number of keymaps (" + relation.getKeyMaps().size() + ") for relation of type one \"" + relation.getTitle() + relation.getRelEntityName() + "\" of entity " + entity.getEntityName() + "."); Iterator<ModelField> pksIter = relatedEntity.getPksIterator(); while (pksIter.hasNext()) { ModelField pk = pksIter.next(); if (relation.findKeyMapByRelated(pk.getName()) == null) { warningList.add("[RelationOneRelatedPrimaryKeyMissing] The primary key \"" + pk.getName() + "\" of related entity " + relation.getRelEntityName() + " is missing in the keymaps for relation of type one " + relation.getTitle() + relation.getRelEntityName() + " of entity " + entity.getEntityName() + "."); } } } } //make sure all keyMap 'fieldName's match fields of // this entity //make sure all keyMap 'relFieldName's match fields of // the relatedEntity for (ModelKeyMap keyMap : relation.getKeyMaps()) { ModelField field = entity.getField(keyMap.getFieldName()); ModelField rfield = null; if (relatedEntity != null) { rfield = relatedEntity.getField(keyMap.getRelFieldName()); } if (rfield == null) { warningList.add("[RelationRelatedFieldNotFound] The field \"" + keyMap.getRelFieldName() + "\" of related entity " + relation.getRelEntityName() + " was specified in the keymaps but is not found for relation " + relation.getTitle() + relation.getRelEntityName() + " of entity " + entity.getEntityName() + "."); } if (field == null) { warningList.add("[RelationFieldNotFound] The field " + keyMap.getFieldName() + " was specified in the keymaps but is not found for relation " + relation.getTitle() + relation.getRelEntityName() + " of entity " + entity.getEntityName() + "."); } if (field != null && rfield != null) { //this was the old check, now more constrained // to keep things cleaner: // if (!field.getType().equals(rfield.getType()) // && // !field.getType().startsWith(rfield.getType()) // && // !rfield.getType().startsWith(field.getType())) // { if (!field.getType().equals(rfield.getType()) && !field.getType().equals(rfield.getType() + "-ne") && !rfield.getType().equals(field.getType() + "-ne")) { warningList.add("[RelationFieldTypesDifferent] The field type ("+ field.getType() + ") of " + field.getName() + " of entity " + entity.getEntityName() + " is not the same as field type (" + rfield.getType() + ") of " + rfield.getName() + " of entity " + relation.getRelEntityName() + " for relation " + relation.getTitle() + relation.getRelEntityName() + "."); } } } } } } } } public static final String[] rwArray = { "ABORT", "ABS", "ABSOLUTE", "ACCEPT", "ACCES", "ACCESS", "ACS", "ACTION", "ACTIVATE", "ADD", "ADDFORM", "ADMIN", "AFTER", "AGGREGATE", "ALIAS", "ALL", "ALLOCATE", "ALTER", "ANALYZE", "AND", "ANDFILENAME", "ANY", "ANYFINISH", "APPEND", "ARCHIVE", "ARE", "ARRAY", "AS", "ASC", "ASCENDING", "ASCII", "ASSERT", "ASSERTION", "ASSIGN", "AT", "ATTRIBUTE", "ATTRIBUTES", "AUDIT", "AUTHID", "AUTHORIZATION", "AUTONEXT", "AUTO_INCREMENT", "AVERAGE", "AVG", "AVGU", "AVG_ROW_LENGTH", "BACKOUT", "BACKUP", "BEFORE", "BEGIN", "BEGINLOAD", "BEGINMODIFY", "BEGINNING", "BEGWORK", "BETWEEN", "BETWEENBY", "BINARY", "BINARY_INTEGER", "BIT", "BIT_LENGTH", "BLOB", "BODY", "BOOLEAN", "BORDER", "BOTH", "BOTTOM", "BREADTH", "BREAK", "BREAKDISPLAY", "BROWSE", "BUFERED", "BUFFER", "BUFFERED", "BULK", "BY", "BYTE", "CALL", "CANCEL", "CASCADE", "CASCADED", "CASE", "CAST", "CATALOG", "CHANGE", "CHAR", "CHAR_LENGTH", "CHAR_BASE", "CHARACTER", "CHARACTER_LENGTH", "CHAR_CONVERT", "CHECK", "CHECKPOINT", "CHECKSUM", "CHR2FL", "CHR2FLO", "CHR2FLOA", "CHR2FLOAT", "CHR2INT", "CLASS", "CLEAR", "CLEARROW", "CLIPPED", "CLOB", "CLOSE", "CLUSTER", "CLUSTERED", "CLUSTERING", "COALESCE", "COBOL", "COLD", "COLLATE", "COLLATION", "COLLECT", "COLUMN", "COLUMNS", "COMMAND", "COMMENT", "COMMIT", "COMMITTED", "COMPLETION", "COMPRESS", "COMPUTE", "CONCAT", "COND", "CONDITION", "CONFIG", "CONFIRM", "CONNECT", "CONNECTION", "CONSTANT", "CONSTRAINT", "CONSTRAINTS", "CONSTRUCT", "CONSTRUCTOR", "CONTAIN", "CONTAINS", "CONTAINSTABLE", "CONTINUE", "CONTROLROW", "CONVERT", "COPY", "CORRESPONDING", "COUNT", "COUNTU", "COUNTUCREATE", "CRASH", "CREATE", "CROSS", "CUBE", "CURRENT", "CURRENT_DATE", "CURRENT_PATH", "CURRENT_ROLE", "CURRENT_SESSION", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "CURVAL", "CYCLE", "DATA", "DATALINK", "DATABASE", "DATABASES", "DATAPAGES", "DATA_PGS", "DATE", "DATETIME", "DAY", "DAY_HOUR", "DAY_MINUTE", "DAY_SECOND", "DAYNUM", "DAYOFMONTH", "DAYOFWEEK", "DAYOFYEAR", "DBA", "DBCC", "DBE", "DBEFILE", "DBEFILEO", "DBEFILESET", "DBSPACE", "DBYTE", "DEALLOCATE", "DEC", "DECENDING", "DECIMAL", "DECLARE", "DEFAULT", "DEFAULTS", "DEFER", "DEFERRABLE", "DEFINE", "DEFINITION", "DELAY_KEY_WRITE", "DELAYED", "DELETE", "DELETEROW", "DENY", "DEPTH", "DEREF", "DESC", "DESCENDING", "DESCENDNG", "DESCRIBE", "DESCRIPTOR", "DESTPOS", "DESTROY", "DEVICE", "DEVSPACE", "DIAGNOSTICS", "DICTIONARY", "DIRECT", "DIRTY", "DISCONNECT", "DISK", "DISPLACE", "DISPLAY", "DISTINCT", "DISTINCTROW", "DISTRIBUTED", "DISTRIBUTION", "DIV", "DO", "DOES", "DOMAIN", "DOUBLE", "DOWN", "DROP", "DUAL", "DUMMY", "DUMP", "DUPLICATES", "EACH", "EBCDIC", "EDITADD", "EDITUPDATE", "ED_STRING", "ELSE", "ELSEIF", "ELSIF", "ENCLOSED", "END", "ENDDATA", "ENDDISPLAY", "ENDFORMS", "ENDIF", "ENDING", "ENDLOAD", "ENDLOOP", "ENDMODIFY", "ENDPOS", "ENDRETRIEVE", "ENDSELECT", "ENDWHILE", "END_ERROR", "END_EXEC", "END_FETCH", "END_FOR", "END_GET", "END_MODIFY", "END_PLACE", "END_SEGMENT_S", "END_SEGMENT_STRING", "END_STORE", "END_STREAM", "ENUM", "EQ", "EQUALS", "ERASE", "ERROR", "ERRLVL", "ERROREXIT", "ESCAPE", "ESCAPED", "EVALUATE", "EVALUATING", "EVERY", "EXCEPT", "EXCEPTION", "EXCLUSIVE", "EXEC", "EXECUTE", "EXISTS", "EXIT", "EXPAND", "EXPANDING", "EXPLAIN", "EXPLICIT", "EXTEND", "EXTENDS", "EXTENT", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIELD", "FIELDS", "FILE", "FILENAME", "FILLFACTOR", "FINALISE", "FINALIZE", "FINDSTR", "FINISH", "FIRST", "FIRSTPOS", "FIXED", "FL", "FLOAT", "FLOAT4", "FLOAT8", "FLUSH", "FOR", "FORALL", "FOREACH", "FOREIGN", "FORMAT", "FORMDATA", "FORMINIT", "FORMS", "FORTRAN", "FOUND", "FRANT", "FRAPHIC", "FREE", "FREETEXT", "FREETEXTTABLE", "FROM", "FRS", "FULL", "FUNCTION", "GE", "GENERAL", "GET", "GETFORM", "GETOPER", "GETROW", "GLOBAL", "GLOBALS", "GO", "GOTO", "GRANT", "GRANTS", "GRAPHIC", "GROUP", "GROUPING", "GT", "HANDLER", "HASH", "HAVING", "HEAP", "HEADER", "HELP", "HELPFILE", "HELP_FRS", "HIGH_PRIORITY", "HOLD", "HOLDLOCK", "HOSTS", "HOUR", "HOUR_MINUTE", "HOUR_SECOND", "IDENTIFIED", "IDENTIFIELD", "IDENTITY", "IDENTITY_INSERT", "IF", "IFDEF", "IGNORE", "IMAGE", "IMMEDIATE", "IMMIDIATE", "IMPLICIT", "IN", "INCLUDE", "INCREMENT", "INDEX", "INDEXED", "INDEXNAME", "INDEXPAGES", "INDICATOR", "INFIELD", "INFILE", "INFO", "INGRES", "INIT", "INITIAL", "INITIALISE", "INITIALIZE", "INITIALLY", "INITTABLE", "INNER", "INOUT", "INPUT", "INQUIRE_EQUEL", "INQUIRE_FRS", "INQUIRE_INGRES", "INQUIR_FRS", "INSERT", "INSERT_ID", "INSERTROW", "INSTRUCTIONS", "INT", "INT1", "INT2CHR", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTEGRITY", "INTERESECT", "INTERFACE", "INTERRUPT", "INTERSECT", "INTERVAL", "INTO", "INTSCHR", "INVOKE", "IS", "ISAM", "ISOLATION", "ITERATE", "JAVA", "JOIN", "JOURNALING", "KEY", "KEYS", "KILL", "LABEL", "LANGUAGE", "LARGE", "LAST", "LAST_INSERT_ID", "LASTPOS", "LATERAL", "LE", "LEADING", "LEAVE", "LEFT", "LENGTH", "LENSTR", "LESS", "LET", "LEVEL", "LIKE", "LIKEPROCEDURETP", "LIMIT", "LIMITED", "LINE", "LINENO", "LINES", "LINK", "LIST", "LISTEN", "LOAD", "LOADTABLE", "LOADTABLERESUME", "LOCAL", "LOCALTIME", "LOCALTIMESTAMP", "LOCATION", "LOCATOR", "LOCK", "LOCKING", "LOG", "LOGS", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "LOWER", "LPAD", "LT", "MAIN", "MANUITEM", "MARGIN", "MATCH", "MATCHES", "MATCHING", "MAX", "MAX_ROWS", "MAXEXTENTS", "MAXPUBLICUNION", "MAXRECLEN", "MDY", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MEETS", "MENU", "MENUITEM", "MENUITEMSCREEN", "MESSAGE", "MESSAGERELOCATE", "MESSAGESCROLL", "MFETCH", "MIDDLEINT", "MIN", "MIN_ROWS", "MINRECLEN", "MINRETURNUNTIL", "MINUS", "MINUTE", "MINUTE_SECOND", "MIRROREXIT", "MISLABEL", "MISSING", "MIXED", "MOD", "MODE", "MODIFIES", "MODIFY", "MODIFYREVOKEUPDATE", "MODULE", "MONEY", "MONITOR", "MONTH", "MONTHNAME", "MOVE", "MULTI", "MYISAM", "NAME", "NAMES", "NATIONAL", "NATURAL", "NATURALN", "NCHAR", "NCLOB", "NE", "NEED", "NEW", "NEWLOG", "NEXT", "NEXTSCROLLDOWN", "NEXTVAL", "NO", "NOAUDIT", "NOCHECK", "NOCOMPRESS", "NOCOPY", "NOCR", "NOJOURNALING", "NOLIST", "NOLOG", "NONCLUSTERED", "NONE", "NORMAL", "NORMALIZE", "NOSYSSORT", "NOT", "NOTFFOUND", "NOTFOUND", "NOTIFY", "NOTRANS", "NOTRIM", "NOTRIMSCROLLUP", "NOTROLLBACKUSER", "NOWAIT", "NULL", "NULLIF", "NULLIFY", "NULLSAVEUSING", "NULLVAL", "NUMBER", "NUMBER_BASE", "NUMERIC", "NXFIELD", "OBJECT", "OCIROWID", "OCTET_LENGTH", "OF", "OFF", "OFFLINE", "OFFSET", "OFFSETS", "OFSAVEPOINTVALUES", "OLD", "ON", "ONCE", "ONLINE", "ONLY", "ONSELECTWHERE", "ONTO", "OPAQUE", "OPEN", "OPENDATASOURCE", "OPENQUERY", "OPENROWSET", "OPENXML", "OPENSETWHILE", "OPENSLEEP", "OPERATION", "OPERATOR", "OPTIMIZE", "OPTION", "OPTIONALLY", "OPTIONS", "OR", "ORDER", "ORDERSQLWORK", "ORDINALITY", "ORGANIZATION", "ORSOMEWITH", "ORSORT", "OTHERS", "OTHERWISE", "OUT", "OUTER", "OUTFILE", "OUTPUT", "OUTPUT_PAGE", "OUTSTOP", "OVER", "OVERLAPS", "OWNER", "OWNERSHIP", "PACK_KEYS", "PACKAGE", "PAD", "PAGE", "PAGENO", "PAGES", "PARAM", "PARAMETER", "PARAMETERS", "PARTIAL", "PARTITION", "PASCAL", "PASSWORD", "PATH", "PATHNAME", "PATTERN", "PAUSE", "PCTFREE", "PERCENT", "PERIOD", "PERM", "PERMANENT", "PERMIT", "PERMITSUM", "PIPE", "PLACE", "PLAN", "PLI", "PLS_INTEGER", "POS", "POSITION", "POSITIVE", "POSITIVEN", "POSTFIX", "POWER", "PRAGMA", "PRECEDES", "PRECISION", "PREFIX", "PREORDER", "PREPARE", "PREPARETABLE", "PRESERVE", "PREV", "PREVIOUS", "PREVISION", "PRIMARY", "PRINT", "PRINTER", "PRINTSCREEN", "PRINTSCREENSCROLL", "PRINTSUBMENU", "PRINTSUMU", "PRIOR", "PRIV", "PRIVATE", "PRIVILAGES", "PRIVILAGESTHEN", "PRIVILEGES", "PROC", "PROCEDURE", "PROCESS", "PROCESSEXIT", "PROCESSLIST", "PROGRAM", "PROGUSAGE", "PROMPT", "PROMPTSCROLLDOWN", "PROMPTTABLEDATA", "PROTECT", "PSECT", "PUBLIC", "PUBLICREAD", "PUT", "PUTFORM", "PUTFORMSCROLLUP", "PUTFORMUNLOADTABLE", "PUTOPER", "PUTOPERSLEEP", "PUTROW", "PUTROWSUBMENU", "PUTROWUP", "QUERY", "QUICK", "QUIT", "RAISERROR", "RANGE", "RANGETO", "RAW", "RDB$DB_KEY", "RDB$LENGTH", "RDB$MISSING", "RDB$VALUE", "RDB4DB_KEY", "RDB4LENGTH", "RDB4MISSING", "RDB4VALUE", "READ", "READS", "READONLY", "READPASS", "READTEXT", "READWRITE", "READY", "READ_ONLY", "READ_WRITE", "REAL", "RECONFIGURE", "RECONNECT", "RECORD", "RECOVER", "RECURSIVE", "REDISPLAY", "REDISPLAYTABLEDATA", "REDISPLAYVALIDATE", "REDO", "REDUCED", "REF", "REFERENCES", "REFERENCING", "REGEXP", "REGISTER", "REGISTERUNLOADDATA", "REGISTERVALIDROW", "REJECT", "RELATIVE", "RELEASE", "RELOAD", "RELOCATE", "RELOCATEUNIQUE", "REMOVE", "REMOVEUPRELOCATEV", "REMOVEVALIDATE", "REMOVEWHENEVER", "RENAME", "REPEAT", "REPEATABLE", "REPEATED", "REPEATVALIDROW", "REPLACE", "REPLACEUNTIL", "REPLICATION", "REPLSTR", "REPORT", "REQUEST_HANDLE", "RESERVED_PGS", "RESERVING", "RESET", "RESIGNAL", "RESOURCE", "REST", "RESTART", "RESTORE", "RESTRICT", "RESULT", "RESUME", "RETRIEVE", "RETRIEVEUPDATE", "RETURN", "RETURNS", "RETURNING", "REVERSE", "REVOKE", "RIGHT", "RLIKE", "ROLE", "ROLLBACK", "ROLLFORWARD", "ROLLBACK", "ROLLUP", "ROUND", "ROUTINE", "ROW", "ROWCNT", "ROWCOUNT", "ROWGUID_COL", "ROWID", "ROWLABEL", "ROWNUM", "ROWS", "ROWTYPE", "RPAD", "RULE", "RUN", "RUNTIME", "SAMPLSTDEV", "SAVE", "SAVEPOINT", "SAVEPOINTWHERE", "SAVEVIEW", "SCHEMA", "SCOPE", "SCREEN", "SCROLL", "SCROLLDOWN", "SCROLLUP", "SEARCH", "SECOND", "SECTION", "SEGMENT", "SEL", "SELE", "SELEC", "SELECT", "SELUPD", "SEPERATE", "SEQUENCE", "SERIAL", "SESSION", "SESSION_USER", "SET", "SETOF", "SETS", "SETWITH", "SET_EQUEL", "SET_FRS", "SET_INGRES", "SETUSER", "SHARE", "SHARED", "SHORT", "SHOW", "SHUTDOWN", "SIGNAL", "SIZE", "SKIP", "SLEEP", "SMALLFLOAT", "SMALLINT", "SOME", "SONAME", "SORT", "SORTERD", "SOUNDS", "SOURCEPOS", "SPACE", "SPACES", "SPECIFIC", "SPECIFICTYPE", "SQL", "SQL_BIG_RESULT", "SQL_BIG_SELECTS", "SQL_BIG_TABLES", "SQL_LOG_OFF", "SQL_LOG_UPDATE", "SQL_LOW_PRIORITY_UPDATES", "SQL_SELECT_LIMIT", "SQL_SMALL_RESULT", "SQL_WARNINGS", "SQLCODE", "SQLDA", "SQLERRM", "SQLERROR", "SQLEXCEPTION", "SQLEXEPTION", "SQLEXPLAIN", "SQLNOTFOUND", "SQLSTATE", "SQLWARNING", "SQRT", "STABILITY", "START", "STARTING", "STARTPOS", "START_SEGMENT", "START_SEGMENTED_?", "START_STREAM", "START_TRANSACTION", "STATE", "STATIC", "STATISTICS", "STATUS", "STDDEV", "STDEV", "STEP", "STOP", "STORE", "STRAIGHT_JOIN", "STRING", "STRUCTURE", "SUBMENU", "SUBSTR", "SUBSTRING", "SUBTYPE", "SUCCEEDS", "SUCCESFULL", "SUCCESSFULL", "SUCCESSFUL", "SUM", "SUMU", "SUPERDBA", "SYB_TERMINATE", "SYNONYM", "SYSDATE", "SYSSORT", "SYSTEM_USER", "TABLE", "TABLEDATA", "TABLES", "TEMP", "TEMPORARY", "TERMINATE", "TERMINATED", "TEXT", "TEXTSIZE", "THAN", "THEN", "THROUGH", "THRU", "TID", "TIME", "TIMESTAMP", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TINYBLOB", "TINYINT", "TINYTEXT", "TO", "TODAY", "TOLOWER", "TOP", "TOTAL", "TOUPPER", "TP", "TRAILER", "TRAILING", "TRAN", "TRANS", "TRANSACTION", "TRANSACTION_HANDLE", "TRANSFER", "TRANSLATE", "TRANSLATION", "TREAT", "TRIGGER", "TRING", "TRUE", "TRUNC", "TRUNCATE", "TSEQUAL", "TYPE", "UID", "UNBUFFERED", "UNDER", "UNDO", "UNION", "UNIQUE", "UNKNOWN", "UNLISTEN", "UNLOAD", "UNLOADDATA", "UNLOADTABLE", "UNLOCK", "UNTIL", "UP", "UPDATE", "UPDATETEXT", "UPPER", "USAGE", "USE", "USED_PGS", "USER", "USING", "UTC_TIME", "VACUUM", "VALIDATE", "VALIDROW", "VALUE", "VALUES", "VARBINARY", "VARC", "VARCH", "VARCHA", "VARCHAR", "VARGRAPHIC", "VARIABLE", "VARIABLES", "VARIANCE", "VARYING", "VERB_TIME", "VERBOSE", "VERIFY", "VERSION", "VIEW", "WAIT", "WAITFOR", "WAITING", "WARNING", "WEEKDAY", "WHEN", "WHENEVER", "WHERE", "WHILE", "WINDOW", "WITH", "WITHOUT", "WORK", "WRAP", "WRITE", "WRITEPASS", "WRITETEXT", "YEAR", "YEARS", "ZEROFILL", "ZONE" }; private ModelEntityChecker() {} }