All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.empire.dbms.mysql.DBMSHandlerMySQL Maven / Gradle / Ivy

The newest version!
/*
 * 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.empire.dbms.mysql;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.GregorianCalendar;

import org.apache.empire.commons.StringUtils;
import org.apache.empire.data.DataType;
import org.apache.empire.db.DBColumnExpr;
import org.apache.empire.db.DBCombinedCmd;
import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBCommandExpr;
import org.apache.empire.db.DBDDLGenerator;
import org.apache.empire.db.DBDDLGenerator.DDLActionType;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBObject;
import org.apache.empire.db.DBRowSet;
import org.apache.empire.db.DBSQLBuilder;
import org.apache.empire.db.DBSQLScript;
import org.apache.empire.db.DBTable;
import org.apache.empire.db.DBTableColumn;
import org.apache.empire.db.exceptions.EmpireSQLException;
import org.apache.empire.dbms.DBMSFeature;
import org.apache.empire.dbms.DBMSHandler;
import org.apache.empire.dbms.DBMSHandlerBase;
import org.apache.empire.dbms.DBSqlPhrase;
import org.apache.empire.exceptions.NotSupportedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * This class provides support for the MySQL database system.
 * 
 *
 */
public class DBMSHandlerMySQL extends DBMSHandlerBase
{
    // *Deprecated* private static final long serialVersionUID = 1L;
    private static final Logger log = LoggerFactory.getLogger(DBMSHandlerMySQL.class);

    /**
     * Defines the MySQL command type.
     */ 
    public static class DBCommandMySQL extends DBCommand
    {
        // *Deprecated* private static final long serialVersionUID = 1L;
      
        protected int limit = -1;
        protected int skip  = -1;
        
        public DBCommandMySQL(DBMSHandlerMySQL dbms, boolean autoPrepareStmt)
        {
            super(dbms, autoPrepareStmt);
        }
        
        @Override
        public DBCommand limitRows(int numRows)
        {
            limit = numRows;
            return this;
        }

        @Override
        public DBCommand skipRows(int numRows)
        {
            skip = numRows;
            return this;
        }
         
        @Override
        public void clearLimit()
        {
            limit = -1;
            skip  = -1;
        }
        
        @Override
        public void getSelect(DBSQLBuilder sql)
        {   // call base class
            super.getSelect(sql);
            // add limit and offset
            if (limit>=0)
            {   sql.append("\r\nLIMIT ");
                sql.append(String.valueOf(limit));
                // Offset
                if (skip>=0) 
                {   sql.append(" OFFSET ");
                    sql.append(String.valueOf(skip));
                }    
            }
        }
        
        @Override
        protected void addDeleteWithJoins(DBSQLBuilder sql, DBRowSet table)
        {
            // DELETE with Multiple-Table Syntax
            // http://dev.mysql.com/doc/refman/5.7/en/delete.html
            sql.append(table.getAlias());
            addFrom(sql);
            addWhere(sql);
        }
    }
    
    /**
     * Provides a DBSQLBuilder implementation for MySQL
     */
    public static class DBSQLBuilderMySQL extends DBSQLBuilder 
    {
        public DBSQLBuilderMySQL(DBMSHandlerMySQL dbms)
        {
            super(dbms);
        }
        
        @Override
        protected void escapeAndAppendLiteral(String value)
        {
            if (value.indexOf('\'') >= 0 || value.indexOf('\\') >= 0)
            {
                int len = value.length();
                for (int i = 0; i < len; i++)
                {
                    if (value.charAt(i) == '\'')
                    {   // a routine to double up single quotes for SQL
                        sql.append("''");
                    }
                    else if (value.charAt(i) == '\\')
                    {   // a routine to double up backslashes for MySQL
                        sql.append("\\\\");
                    } 
                    else
                    {   // normal
                        sql.append(value.charAt(i));
                    }
                }
            } else {
                sql.append(value);
            }
        }
    }
    
    // Properties
    private String databaseName = null;
    private String characterSet = "utf8";

    // Sequence treatment
    // When set to 'false' (default) MySQL's autoincrement feature is used.
    private boolean useSequenceTable = false;
    private String sequenceTableName = "Sequences";
    private String engine; // The database engine to use when creating new tables

    private DBDDLGenerator ddlGenerator = null; // lazy creation
    
    /**
     * Constructor for the MySQL database dbms.
*/ public DBMSHandlerMySQL() { // Default Constructor setReservedKeywords(); } private void addReservedKeyWord(final String keyWord){ boolean added = reservedSQLKeywords.add(keyWord.toLowerCase()); if(!added){ log.debug("Existing keyWord added: " + keyWord); } } private void setReservedKeywords(){ // list of reserved keywords // https://dev.mysql.com/doc/refman/5.7/en/keywords.html addReservedKeyWord("ACCESSIBLE".toLowerCase()); addReservedKeyWord("ACCOUNT".toLowerCase()); addReservedKeyWord("ACTION".toLowerCase()); addReservedKeyWord("ADD".toLowerCase()); addReservedKeyWord("AFTER".toLowerCase()); addReservedKeyWord("AGAINST".toLowerCase()); addReservedKeyWord("AGGREGATE".toLowerCase()); addReservedKeyWord("ALGORITHM".toLowerCase()); addReservedKeyWord("ALL".toLowerCase()); addReservedKeyWord("ALTER".toLowerCase()); addReservedKeyWord("ALWAYS".toLowerCase()); addReservedKeyWord("ANALYSE".toLowerCase()); addReservedKeyWord("ANALYZE".toLowerCase()); addReservedKeyWord("AND".toLowerCase()); addReservedKeyWord("ANY".toLowerCase()); addReservedKeyWord("AS".toLowerCase()); addReservedKeyWord("ASC".toLowerCase()); addReservedKeyWord("ASCII".toLowerCase()); addReservedKeyWord("ASENSITIVE".toLowerCase()); addReservedKeyWord("AT".toLowerCase()); addReservedKeyWord("AUTOEXTEND_SIZE".toLowerCase()); addReservedKeyWord("AUTO_INCREMENT".toLowerCase()); addReservedKeyWord("AVG".toLowerCase()); addReservedKeyWord("AVG_ROW_LENGTH".toLowerCase()); addReservedKeyWord("BACKUP".toLowerCase()); addReservedKeyWord("BEFORE".toLowerCase()); addReservedKeyWord("BEGIN".toLowerCase()); addReservedKeyWord("BETWEEN".toLowerCase()); addReservedKeyWord("BIGINT".toLowerCase()); addReservedKeyWord("BINARY".toLowerCase()); addReservedKeyWord("BINLOG".toLowerCase()); addReservedKeyWord("BIT".toLowerCase()); addReservedKeyWord("BLOB".toLowerCase()); addReservedKeyWord("BLOCK".toLowerCase()); addReservedKeyWord("BOOL".toLowerCase()); addReservedKeyWord("BOOLEAN".toLowerCase()); addReservedKeyWord("BOTH".toLowerCase()); addReservedKeyWord("BTREE".toLowerCase()); addReservedKeyWord("BY".toLowerCase()); addReservedKeyWord("BYTE".toLowerCase()); addReservedKeyWord("CACHE".toLowerCase()); addReservedKeyWord("CALL".toLowerCase()); addReservedKeyWord("CASCADE".toLowerCase()); addReservedKeyWord("CASCADED".toLowerCase()); addReservedKeyWord("CASE".toLowerCase()); addReservedKeyWord("CATALOG_NAME".toLowerCase()); addReservedKeyWord("CHAIN".toLowerCase()); addReservedKeyWord("CHANGE".toLowerCase()); addReservedKeyWord("CHANGED".toLowerCase()); addReservedKeyWord("CHANNEL".toLowerCase()); addReservedKeyWord("CHAR".toLowerCase()); addReservedKeyWord("CHARACTER".toLowerCase()); addReservedKeyWord("CHARSET".toLowerCase()); addReservedKeyWord("CHECK".toLowerCase()); addReservedKeyWord("CHECKSUM".toLowerCase()); addReservedKeyWord("CIPHER".toLowerCase()); addReservedKeyWord("CLASS_ORIGIN".toLowerCase()); addReservedKeyWord("CLIENT".toLowerCase()); addReservedKeyWord("CLOSE".toLowerCase()); addReservedKeyWord("COALESCE".toLowerCase()); addReservedKeyWord("CODE".toLowerCase()); addReservedKeyWord("COLLATE".toLowerCase()); addReservedKeyWord("COLLATION".toLowerCase()); addReservedKeyWord("COLUMN".toLowerCase()); addReservedKeyWord("COLUMNS".toLowerCase()); addReservedKeyWord("COLUMN_FORMAT".toLowerCase()); addReservedKeyWord("COLUMN_NAME".toLowerCase()); addReservedKeyWord("COMMENT".toLowerCase()); addReservedKeyWord("COMMIT".toLowerCase()); addReservedKeyWord("COMMITTED".toLowerCase()); addReservedKeyWord("COMPACT".toLowerCase()); addReservedKeyWord("COMPLETION".toLowerCase()); addReservedKeyWord("COMPRESSED".toLowerCase()); addReservedKeyWord("COMPRESSION".toLowerCase()); addReservedKeyWord("CONCURRENT".toLowerCase()); addReservedKeyWord("CONDITION".toLowerCase()); addReservedKeyWord("CONNECTION".toLowerCase()); addReservedKeyWord("CONSISTENT".toLowerCase()); addReservedKeyWord("CONSTRAINT".toLowerCase()); addReservedKeyWord("CONSTRAINT_CATALOG".toLowerCase()); addReservedKeyWord("CONSTRAINT_NAME".toLowerCase()); addReservedKeyWord("CONSTRAINT_SCHEMA".toLowerCase()); addReservedKeyWord("CONTAINS".toLowerCase()); addReservedKeyWord("CONTEXT".toLowerCase()); addReservedKeyWord("CONTINUE".toLowerCase()); addReservedKeyWord("CONVERT".toLowerCase()); addReservedKeyWord("CPU".toLowerCase()); addReservedKeyWord("CREATE".toLowerCase()); addReservedKeyWord("CROSS".toLowerCase()); addReservedKeyWord("CUBE".toLowerCase()); addReservedKeyWord("CURRENT".toLowerCase()); addReservedKeyWord("CURRENT_DATE".toLowerCase()); addReservedKeyWord("CURRENT_TIME".toLowerCase()); addReservedKeyWord("CURRENT_TIMESTAMP".toLowerCase()); addReservedKeyWord("CURRENT_USER".toLowerCase()); addReservedKeyWord("CURSOR".toLowerCase()); addReservedKeyWord("CURSOR_NAME".toLowerCase()); addReservedKeyWord("DATA".toLowerCase()); addReservedKeyWord("DATABASE".toLowerCase()); addReservedKeyWord("DATABASES".toLowerCase()); addReservedKeyWord("DATAFILE".toLowerCase()); addReservedKeyWord("DATE".toLowerCase()); addReservedKeyWord("DATETIME".toLowerCase()); addReservedKeyWord("DAY".toLowerCase()); addReservedKeyWord("DAY_HOUR".toLowerCase()); addReservedKeyWord("DAY_MICROSECOND".toLowerCase()); addReservedKeyWord("DAY_MINUTE".toLowerCase()); addReservedKeyWord("DAY_SECOND".toLowerCase()); addReservedKeyWord("DEALLOCATE".toLowerCase()); addReservedKeyWord("DEC".toLowerCase()); addReservedKeyWord("DECIMAL".toLowerCase()); addReservedKeyWord("DECLARE".toLowerCase()); addReservedKeyWord("DEFAULT".toLowerCase()); addReservedKeyWord("DEFAULT_AUTH".toLowerCase()); addReservedKeyWord("DEFINER".toLowerCase()); addReservedKeyWord("DELAYED".toLowerCase()); addReservedKeyWord("DELAY_KEY_WRITE".toLowerCase()); addReservedKeyWord("DELETE".toLowerCase()); addReservedKeyWord("DESC".toLowerCase()); addReservedKeyWord("DESCRIBE".toLowerCase()); addReservedKeyWord("DES_KEY_FILE".toLowerCase()); addReservedKeyWord("DETERMINISTIC".toLowerCase()); addReservedKeyWord("DIAGNOSTICS".toLowerCase()); addReservedKeyWord("DIRECTORY".toLowerCase()); addReservedKeyWord("DISABLE".toLowerCase()); addReservedKeyWord("DISCARD".toLowerCase()); addReservedKeyWord("DISK".toLowerCase()); addReservedKeyWord("DISTINCT".toLowerCase()); addReservedKeyWord("DISTINCTROW".toLowerCase()); addReservedKeyWord("DIV".toLowerCase()); addReservedKeyWord("DO".toLowerCase()); addReservedKeyWord("DOUBLE".toLowerCase()); addReservedKeyWord("DROP".toLowerCase()); addReservedKeyWord("DUAL".toLowerCase()); addReservedKeyWord("DUMPFILE".toLowerCase()); addReservedKeyWord("DUPLICATE".toLowerCase()); addReservedKeyWord("DYNAMIC".toLowerCase()); addReservedKeyWord("EACH".toLowerCase()); addReservedKeyWord("ELSE".toLowerCase()); addReservedKeyWord("ELSEIF".toLowerCase()); addReservedKeyWord("ENABLE".toLowerCase()); addReservedKeyWord("ENCLOSED".toLowerCase()); addReservedKeyWord("ENCRYPTION".toLowerCase()); addReservedKeyWord("END".toLowerCase()); addReservedKeyWord("ENDS".toLowerCase()); addReservedKeyWord("ENGINE".toLowerCase()); addReservedKeyWord("ENGINES".toLowerCase()); addReservedKeyWord("ENUM".toLowerCase()); addReservedKeyWord("ERROR".toLowerCase()); addReservedKeyWord("ERRORS".toLowerCase()); addReservedKeyWord("ESCAPE".toLowerCase()); addReservedKeyWord("ESCAPED".toLowerCase()); addReservedKeyWord("EVENT".toLowerCase()); addReservedKeyWord("EVENTS".toLowerCase()); addReservedKeyWord("EVERY".toLowerCase()); addReservedKeyWord("EXCHANGE".toLowerCase()); addReservedKeyWord("EXECUTE".toLowerCase()); addReservedKeyWord("EXISTS".toLowerCase()); addReservedKeyWord("EXIT".toLowerCase()); addReservedKeyWord("EXPANSION".toLowerCase()); addReservedKeyWord("EXPIRE".toLowerCase()); addReservedKeyWord("EXPLAIN".toLowerCase()); addReservedKeyWord("EXPORT".toLowerCase()); addReservedKeyWord("EXTENDED".toLowerCase()); addReservedKeyWord("EXTENT_SIZE".toLowerCase()); addReservedKeyWord("FALSE".toLowerCase()); addReservedKeyWord("FAST".toLowerCase()); addReservedKeyWord("FAULTS".toLowerCase()); addReservedKeyWord("FETCH".toLowerCase()); addReservedKeyWord("FIELDS".toLowerCase()); addReservedKeyWord("FILE".toLowerCase()); addReservedKeyWord("FILE_BLOCK_SIZE".toLowerCase()); addReservedKeyWord("FILTER".toLowerCase()); addReservedKeyWord("FIRST".toLowerCase()); addReservedKeyWord("FIXED".toLowerCase()); addReservedKeyWord("FLOAT".toLowerCase()); addReservedKeyWord("FLOAT4".toLowerCase()); addReservedKeyWord("FLOAT8".toLowerCase()); addReservedKeyWord("FLUSH".toLowerCase()); addReservedKeyWord("FOLLOWS".toLowerCase()); addReservedKeyWord("FOR".toLowerCase()); addReservedKeyWord("FORCE".toLowerCase()); addReservedKeyWord("FOREIGN".toLowerCase()); addReservedKeyWord("FORMAT".toLowerCase()); addReservedKeyWord("FOUND".toLowerCase()); addReservedKeyWord("FROM".toLowerCase()); addReservedKeyWord("FULL".toLowerCase()); addReservedKeyWord("FULLTEXT".toLowerCase()); addReservedKeyWord("FUNCTION".toLowerCase()); addReservedKeyWord("GENERAL".toLowerCase()); addReservedKeyWord("GENERATED".toLowerCase()); addReservedKeyWord("GEOMETRY".toLowerCase()); addReservedKeyWord("GEOMETRYCOLLECTION".toLowerCase()); addReservedKeyWord("GET".toLowerCase()); addReservedKeyWord("GET_FORMAT".toLowerCase()); addReservedKeyWord("GLOBAL".toLowerCase()); addReservedKeyWord("GRANT".toLowerCase()); addReservedKeyWord("GRANTS".toLowerCase()); addReservedKeyWord("GROUP".toLowerCase()); addReservedKeyWord("GROUP_REPLICATION".toLowerCase()); addReservedKeyWord("HANDLER".toLowerCase()); addReservedKeyWord("HASH".toLowerCase()); addReservedKeyWord("HAVING".toLowerCase()); addReservedKeyWord("HELP".toLowerCase()); addReservedKeyWord("HIGH_PRIORITY".toLowerCase()); addReservedKeyWord("HOST".toLowerCase()); addReservedKeyWord("HOSTS".toLowerCase()); addReservedKeyWord("HOUR".toLowerCase()); addReservedKeyWord("HOUR_MICROSECOND".toLowerCase()); addReservedKeyWord("HOUR_MINUTE".toLowerCase()); addReservedKeyWord("HOUR_SECOND".toLowerCase()); addReservedKeyWord("IDENTIFIED".toLowerCase()); addReservedKeyWord("IF".toLowerCase()); addReservedKeyWord("IGNORE".toLowerCase()); addReservedKeyWord("IGNORE_SERVER_IDS".toLowerCase()); addReservedKeyWord("IMPORT".toLowerCase()); addReservedKeyWord("IN".toLowerCase()); addReservedKeyWord("INDEX".toLowerCase()); addReservedKeyWord("INDEXES".toLowerCase()); addReservedKeyWord("INFILE".toLowerCase()); addReservedKeyWord("INITIAL_SIZE".toLowerCase()); addReservedKeyWord("INNER".toLowerCase()); addReservedKeyWord("INOUT".toLowerCase()); addReservedKeyWord("INSENSITIVE".toLowerCase()); addReservedKeyWord("INSERT".toLowerCase()); addReservedKeyWord("INSERT_METHOD".toLowerCase()); addReservedKeyWord("INSTALL".toLowerCase()); addReservedKeyWord("INSTANCE".toLowerCase()); addReservedKeyWord("INT".toLowerCase()); addReservedKeyWord("INT1".toLowerCase()); addReservedKeyWord("INT2".toLowerCase()); addReservedKeyWord("INT3".toLowerCase()); addReservedKeyWord("INT4".toLowerCase()); addReservedKeyWord("INT8".toLowerCase()); addReservedKeyWord("INTEGER".toLowerCase()); addReservedKeyWord("INTERVAL".toLowerCase()); addReservedKeyWord("INTO".toLowerCase()); addReservedKeyWord("INVOKER".toLowerCase()); addReservedKeyWord("IO".toLowerCase()); addReservedKeyWord("IO_AFTER_GTIDS".toLowerCase()); addReservedKeyWord("IO_BEFORE_GTIDS".toLowerCase()); addReservedKeyWord("IO_THREAD".toLowerCase()); addReservedKeyWord("IPC".toLowerCase()); addReservedKeyWord("IS".toLowerCase()); addReservedKeyWord("ISOLATION".toLowerCase()); addReservedKeyWord("ISSUER".toLowerCase()); addReservedKeyWord("ITERATE".toLowerCase()); addReservedKeyWord("JOIN".toLowerCase()); addReservedKeyWord("JSON".toLowerCase()); addReservedKeyWord("KEY".toLowerCase()); addReservedKeyWord("KEYS".toLowerCase()); addReservedKeyWord("KEY_BLOCK_SIZE".toLowerCase()); addReservedKeyWord("KILL".toLowerCase()); addReservedKeyWord("LANGUAGE".toLowerCase()); addReservedKeyWord("LAST".toLowerCase()); addReservedKeyWord("LEADING".toLowerCase()); addReservedKeyWord("LEAVE".toLowerCase()); addReservedKeyWord("LEAVES".toLowerCase()); addReservedKeyWord("LEFT".toLowerCase()); addReservedKeyWord("LESS".toLowerCase()); addReservedKeyWord("LEVEL".toLowerCase()); addReservedKeyWord("LIKE".toLowerCase()); addReservedKeyWord("LIMIT".toLowerCase()); addReservedKeyWord("LINEAR".toLowerCase()); addReservedKeyWord("LINES".toLowerCase()); addReservedKeyWord("LINESTRING".toLowerCase()); addReservedKeyWord("LIST".toLowerCase()); addReservedKeyWord("LOAD".toLowerCase()); addReservedKeyWord("LOCAL".toLowerCase()); addReservedKeyWord("LOCALTIME".toLowerCase()); addReservedKeyWord("LOCALTIMESTAMP".toLowerCase()); addReservedKeyWord("LOCK".toLowerCase()); addReservedKeyWord("LOCKS".toLowerCase()); addReservedKeyWord("LOGFILE".toLowerCase()); addReservedKeyWord("LOGS".toLowerCase()); addReservedKeyWord("LONG".toLowerCase()); addReservedKeyWord("LONGBLOB".toLowerCase()); addReservedKeyWord("LONGTEXT".toLowerCase()); addReservedKeyWord("LOOP".toLowerCase()); addReservedKeyWord("LOW_PRIORITY".toLowerCase()); addReservedKeyWord("MASTER".toLowerCase()); addReservedKeyWord("MASTER_AUTO_POSITION".toLowerCase()); addReservedKeyWord("MASTER_BIND".toLowerCase()); addReservedKeyWord("MASTER_CONNECT_RETRY".toLowerCase()); addReservedKeyWord("MASTER_DELAY".toLowerCase()); addReservedKeyWord("MASTER_HEARTBEAT_PERIOD".toLowerCase()); addReservedKeyWord("MASTER_HOST".toLowerCase()); addReservedKeyWord("MASTER_LOG_FILE".toLowerCase()); addReservedKeyWord("MASTER_LOG_POS".toLowerCase()); addReservedKeyWord("MASTER_PASSWORD".toLowerCase()); addReservedKeyWord("MASTER_PORT".toLowerCase()); addReservedKeyWord("MASTER_RETRY_COUNT".toLowerCase()); addReservedKeyWord("MASTER_SERVER_ID".toLowerCase()); addReservedKeyWord("MASTER_SSL".toLowerCase()); addReservedKeyWord("MASTER_SSL_CA".toLowerCase()); addReservedKeyWord("MASTER_SSL_CAPATH".toLowerCase()); addReservedKeyWord("MASTER_SSL_CERT".toLowerCase()); addReservedKeyWord("MASTER_SSL_CIPHER".toLowerCase()); addReservedKeyWord("MASTER_SSL_CRL".toLowerCase()); addReservedKeyWord("MASTER_SSL_CRLPATH".toLowerCase()); addReservedKeyWord("MASTER_SSL_KEY".toLowerCase()); addReservedKeyWord("MASTER_SSL_VERIFY_SERVER_CERT".toLowerCase()); addReservedKeyWord("MASTER_TLS_VERSION".toLowerCase()); addReservedKeyWord("MASTER_USER".toLowerCase()); addReservedKeyWord("MATCH".toLowerCase()); addReservedKeyWord("MAXVALUE".toLowerCase()); addReservedKeyWord("MAX_CONNECTIONS_PER_HOUR".toLowerCase()); addReservedKeyWord("MAX_QUERIES_PER_HOUR".toLowerCase()); addReservedKeyWord("MAX_ROWS".toLowerCase()); addReservedKeyWord("MAX_SIZE".toLowerCase()); addReservedKeyWord("MAX_STATEMENT_TIME".toLowerCase()); addReservedKeyWord("MAX_UPDATES_PER_HOUR".toLowerCase()); addReservedKeyWord("MAX_USER_CONNECTIONS".toLowerCase()); addReservedKeyWord("MEDIUM".toLowerCase()); addReservedKeyWord("MEDIUMBLOB".toLowerCase()); addReservedKeyWord("MEDIUMINT".toLowerCase()); addReservedKeyWord("MEDIUMTEXT".toLowerCase()); addReservedKeyWord("MEMORY".toLowerCase()); addReservedKeyWord("MERGE".toLowerCase()); addReservedKeyWord("MESSAGE_TEXT".toLowerCase()); addReservedKeyWord("MICROSECOND".toLowerCase()); addReservedKeyWord("MIDDLEINT".toLowerCase()); addReservedKeyWord("MIGRATE".toLowerCase()); addReservedKeyWord("MINUTE".toLowerCase()); addReservedKeyWord("MINUTE_MICROSECOND".toLowerCase()); addReservedKeyWord("MINUTE_SECOND".toLowerCase()); addReservedKeyWord("MIN_ROWS".toLowerCase()); addReservedKeyWord("MOD".toLowerCase()); addReservedKeyWord("MODE".toLowerCase()); addReservedKeyWord("MODIFIES".toLowerCase()); addReservedKeyWord("MODIFY".toLowerCase()); addReservedKeyWord("MONTH".toLowerCase()); addReservedKeyWord("MULTILINESTRING".toLowerCase()); addReservedKeyWord("MULTIPOINT".toLowerCase()); addReservedKeyWord("MULTIPOLYGON".toLowerCase()); addReservedKeyWord("MUTEX".toLowerCase()); addReservedKeyWord("MYSQL_ERRNO".toLowerCase()); addReservedKeyWord("NAME".toLowerCase()); addReservedKeyWord("NAMES".toLowerCase()); addReservedKeyWord("NATIONAL".toLowerCase()); addReservedKeyWord("NATURAL".toLowerCase()); addReservedKeyWord("NCHAR".toLowerCase()); addReservedKeyWord("NDB".toLowerCase()); addReservedKeyWord("NDBCLUSTER".toLowerCase()); addReservedKeyWord("NEVER".toLowerCase()); addReservedKeyWord("NEW".toLowerCase()); addReservedKeyWord("NEXT".toLowerCase()); addReservedKeyWord("NO".toLowerCase()); addReservedKeyWord("NODEGROUP".toLowerCase()); addReservedKeyWord("NONBLOCKING".toLowerCase()); addReservedKeyWord("NONE".toLowerCase()); addReservedKeyWord("NOT".toLowerCase()); addReservedKeyWord("NO_WAIT".toLowerCase()); addReservedKeyWord("NO_WRITE_TO_BINLOG".toLowerCase()); addReservedKeyWord("NULL".toLowerCase()); addReservedKeyWord("NUMBER".toLowerCase()); addReservedKeyWord("NUMERIC".toLowerCase()); addReservedKeyWord("NVARCHAR".toLowerCase()); addReservedKeyWord("OFFSET".toLowerCase()); addReservedKeyWord("OLD_PASSWORD".toLowerCase()); addReservedKeyWord("ON".toLowerCase()); addReservedKeyWord("ONE".toLowerCase()); addReservedKeyWord("ONLY".toLowerCase()); addReservedKeyWord("OPEN".toLowerCase()); addReservedKeyWord("OPTIMIZE".toLowerCase()); addReservedKeyWord("OPTIMIZER_COSTS".toLowerCase()); addReservedKeyWord("OPTION".toLowerCase()); addReservedKeyWord("OPTIONALLY".toLowerCase()); addReservedKeyWord("OPTIONS".toLowerCase()); addReservedKeyWord("OR".toLowerCase()); addReservedKeyWord("ORDER".toLowerCase()); addReservedKeyWord("OUT".toLowerCase()); addReservedKeyWord("OUTER".toLowerCase()); addReservedKeyWord("OUTFILE".toLowerCase()); addReservedKeyWord("OWNER".toLowerCase()); addReservedKeyWord("PACK_KEYS".toLowerCase()); addReservedKeyWord("PAGE".toLowerCase()); addReservedKeyWord("PARSER".toLowerCase()); addReservedKeyWord("PARSE_GCOL_EXPR".toLowerCase()); addReservedKeyWord("PARTIAL".toLowerCase()); addReservedKeyWord("PARTITION".toLowerCase()); addReservedKeyWord("PARTITIONING".toLowerCase()); addReservedKeyWord("PARTITIONS".toLowerCase()); addReservedKeyWord("PASSWORD".toLowerCase()); addReservedKeyWord("PHASE".toLowerCase()); addReservedKeyWord("PLUGIN".toLowerCase()); addReservedKeyWord("PLUGINS".toLowerCase()); addReservedKeyWord("PLUGIN_DIR".toLowerCase()); addReservedKeyWord("POINT".toLowerCase()); addReservedKeyWord("POLYGON".toLowerCase()); addReservedKeyWord("PORT".toLowerCase()); addReservedKeyWord("PRECEDES".toLowerCase()); addReservedKeyWord("PRECISION".toLowerCase()); addReservedKeyWord("PREPARE".toLowerCase()); addReservedKeyWord("PRESERVE".toLowerCase()); addReservedKeyWord("PREV".toLowerCase()); addReservedKeyWord("PRIMARY".toLowerCase()); addReservedKeyWord("PRIVILEGES".toLowerCase()); addReservedKeyWord("PROCEDURE".toLowerCase()); addReservedKeyWord("PROCESSLIST".toLowerCase()); addReservedKeyWord("PROFILE".toLowerCase()); addReservedKeyWord("PROFILES".toLowerCase()); addReservedKeyWord("PROXY".toLowerCase()); addReservedKeyWord("PURGE".toLowerCase()); addReservedKeyWord("QUARTER".toLowerCase()); addReservedKeyWord("QUERY".toLowerCase()); addReservedKeyWord("QUICK".toLowerCase()); addReservedKeyWord("RANGE".toLowerCase()); addReservedKeyWord("READ".toLowerCase()); addReservedKeyWord("READS".toLowerCase()); addReservedKeyWord("READ_ONLY".toLowerCase()); addReservedKeyWord("READ_WRITE".toLowerCase()); addReservedKeyWord("REAL".toLowerCase()); addReservedKeyWord("REBUILD".toLowerCase()); addReservedKeyWord("RECOVER".toLowerCase()); addReservedKeyWord("REDOFILE".toLowerCase()); addReservedKeyWord("REDO_BUFFER_SIZE".toLowerCase()); addReservedKeyWord("REDUNDANT".toLowerCase()); addReservedKeyWord("REFERENCES".toLowerCase()); addReservedKeyWord("REGEXP".toLowerCase()); addReservedKeyWord("RELAY".toLowerCase()); addReservedKeyWord("RELAYLOG".toLowerCase()); addReservedKeyWord("RELAY_LOG_FILE".toLowerCase()); addReservedKeyWord("RELAY_LOG_POS".toLowerCase()); addReservedKeyWord("RELAY_THREAD".toLowerCase()); addReservedKeyWord("RELEASE".toLowerCase()); addReservedKeyWord("RELOAD".toLowerCase()); addReservedKeyWord("REMOVE".toLowerCase()); addReservedKeyWord("RENAME".toLowerCase()); addReservedKeyWord("REORGANIZE".toLowerCase()); addReservedKeyWord("REPAIR".toLowerCase()); addReservedKeyWord("REPEAT".toLowerCase()); addReservedKeyWord("REPEATABLE".toLowerCase()); addReservedKeyWord("REPLACE".toLowerCase()); addReservedKeyWord("REPLICATE_DO_DB".toLowerCase()); addReservedKeyWord("REPLICATE_DO_TABLE".toLowerCase()); addReservedKeyWord("REPLICATE_IGNORE_DB".toLowerCase()); addReservedKeyWord("REPLICATE_IGNORE_TABLE".toLowerCase()); addReservedKeyWord("REPLICATE_REWRITE_DB".toLowerCase()); addReservedKeyWord("REPLICATE_WILD_DO_TABLE".toLowerCase()); addReservedKeyWord("REPLICATE_WILD_IGNORE_TABLE".toLowerCase()); addReservedKeyWord("REPLICATION".toLowerCase()); addReservedKeyWord("REQUIRE".toLowerCase()); addReservedKeyWord("RESET".toLowerCase()); addReservedKeyWord("RESIGNAL".toLowerCase()); addReservedKeyWord("RESTORE".toLowerCase()); addReservedKeyWord("RESTRICT".toLowerCase()); addReservedKeyWord("RESUME".toLowerCase()); addReservedKeyWord("RETURN".toLowerCase()); addReservedKeyWord("RETURNED_SQLSTATE".toLowerCase()); addReservedKeyWord("RETURNS".toLowerCase()); addReservedKeyWord("REVERSE".toLowerCase()); addReservedKeyWord("REVOKE".toLowerCase()); addReservedKeyWord("RIGHT".toLowerCase()); addReservedKeyWord("RLIKE".toLowerCase()); addReservedKeyWord("ROLLBACK".toLowerCase()); addReservedKeyWord("ROLLUP".toLowerCase()); addReservedKeyWord("ROTATE".toLowerCase()); addReservedKeyWord("ROUTINE".toLowerCase()); addReservedKeyWord("ROW".toLowerCase()); addReservedKeyWord("ROWS".toLowerCase()); addReservedKeyWord("ROW_COUNT".toLowerCase()); addReservedKeyWord("ROW_FORMAT".toLowerCase()); addReservedKeyWord("RTREE".toLowerCase()); addReservedKeyWord("SAVEPOINT".toLowerCase()); addReservedKeyWord("SCHEDULE".toLowerCase()); addReservedKeyWord("SCHEMA".toLowerCase()); addReservedKeyWord("SCHEMAS".toLowerCase()); addReservedKeyWord("SCHEMA_NAME".toLowerCase()); addReservedKeyWord("SECOND".toLowerCase()); addReservedKeyWord("SECOND_MICROSECOND".toLowerCase()); addReservedKeyWord("SECURITY".toLowerCase()); addReservedKeyWord("SELECT".toLowerCase()); addReservedKeyWord("SENSITIVE".toLowerCase()); addReservedKeyWord("SEPARATOR".toLowerCase()); addReservedKeyWord("SERIAL".toLowerCase()); addReservedKeyWord("SERIALIZABLE".toLowerCase()); addReservedKeyWord("SERVER".toLowerCase()); addReservedKeyWord("SESSION".toLowerCase()); addReservedKeyWord("SET".toLowerCase()); addReservedKeyWord("SHARE".toLowerCase()); addReservedKeyWord("SHOW".toLowerCase()); addReservedKeyWord("SHUTDOWN".toLowerCase()); addReservedKeyWord("SIGNAL".toLowerCase()); addReservedKeyWord("SIGNED".toLowerCase()); addReservedKeyWord("SIMPLE".toLowerCase()); addReservedKeyWord("SLAVE".toLowerCase()); addReservedKeyWord("SLOW".toLowerCase()); addReservedKeyWord("SMALLINT".toLowerCase()); addReservedKeyWord("SNAPSHOT".toLowerCase()); addReservedKeyWord("SOCKET".toLowerCase()); addReservedKeyWord("SOME".toLowerCase()); addReservedKeyWord("SONAME".toLowerCase()); addReservedKeyWord("SOUNDS".toLowerCase()); addReservedKeyWord("SOURCE".toLowerCase()); addReservedKeyWord("SPATIAL".toLowerCase()); addReservedKeyWord("SPECIFIC".toLowerCase()); addReservedKeyWord("SQL".toLowerCase()); addReservedKeyWord("SQLEXCEPTION".toLowerCase()); addReservedKeyWord("SQLSTATE".toLowerCase()); addReservedKeyWord("SQLWARNING".toLowerCase()); addReservedKeyWord("SQL_AFTER_GTIDS".toLowerCase()); addReservedKeyWord("SQL_AFTER_MTS_GAPS".toLowerCase()); addReservedKeyWord("SQL_BEFORE_GTIDS".toLowerCase()); addReservedKeyWord("SQL_BIG_RESULT".toLowerCase()); addReservedKeyWord("SQL_BUFFER_RESULT".toLowerCase()); addReservedKeyWord("SQL_CACHE".toLowerCase()); addReservedKeyWord("SQL_CALC_FOUND_ROWS".toLowerCase()); addReservedKeyWord("SQL_NO_CACHE".toLowerCase()); addReservedKeyWord("SQL_SMALL_RESULT".toLowerCase()); addReservedKeyWord("SQL_THREAD".toLowerCase()); addReservedKeyWord("SQL_TSI_DAY".toLowerCase()); addReservedKeyWord("SQL_TSI_HOUR".toLowerCase()); addReservedKeyWord("SQL_TSI_MINUTE".toLowerCase()); addReservedKeyWord("SQL_TSI_MONTH".toLowerCase()); addReservedKeyWord("SQL_TSI_QUARTER".toLowerCase()); addReservedKeyWord("SQL_TSI_SECOND".toLowerCase()); addReservedKeyWord("SQL_TSI_WEEK".toLowerCase()); addReservedKeyWord("SQL_TSI_YEAR".toLowerCase()); addReservedKeyWord("SSL".toLowerCase()); addReservedKeyWord("STACKED".toLowerCase()); addReservedKeyWord("START".toLowerCase()); addReservedKeyWord("STARTING".toLowerCase()); addReservedKeyWord("STARTS".toLowerCase()); addReservedKeyWord("STATS_AUTO_RECALC".toLowerCase()); addReservedKeyWord("STATS_PERSISTENT".toLowerCase()); addReservedKeyWord("STATS_SAMPLE_PAGES".toLowerCase()); addReservedKeyWord("STATUS".toLowerCase()); addReservedKeyWord("STOP".toLowerCase()); addReservedKeyWord("STORAGE".toLowerCase()); addReservedKeyWord("STORED".toLowerCase()); addReservedKeyWord("STRAIGHT_JOIN".toLowerCase()); addReservedKeyWord("STRING".toLowerCase()); addReservedKeyWord("SUBCLASS_ORIGIN".toLowerCase()); addReservedKeyWord("SUBJECT".toLowerCase()); addReservedKeyWord("SUBPARTITION".toLowerCase()); addReservedKeyWord("SUBPARTITIONS".toLowerCase()); addReservedKeyWord("SUPER".toLowerCase()); addReservedKeyWord("SUSPEND".toLowerCase()); addReservedKeyWord("SWAPS".toLowerCase()); addReservedKeyWord("SWITCHES".toLowerCase()); addReservedKeyWord("TABLE".toLowerCase()); addReservedKeyWord("TABLES".toLowerCase()); addReservedKeyWord("TABLESPACE".toLowerCase()); addReservedKeyWord("TABLE_CHECKSUM".toLowerCase()); addReservedKeyWord("TABLE_NAME".toLowerCase()); addReservedKeyWord("TEMPORARY".toLowerCase()); addReservedKeyWord("TEMPTABLE".toLowerCase()); addReservedKeyWord("TERMINATED".toLowerCase()); addReservedKeyWord("TEXT".toLowerCase()); addReservedKeyWord("THAN".toLowerCase()); addReservedKeyWord("THEN".toLowerCase()); addReservedKeyWord("TIME".toLowerCase()); addReservedKeyWord("TIMESTAMP".toLowerCase()); addReservedKeyWord("TIMESTAMPADD".toLowerCase()); addReservedKeyWord("TIMESTAMPDIFF".toLowerCase()); addReservedKeyWord("TINYBLOB".toLowerCase()); addReservedKeyWord("TINYINT".toLowerCase()); addReservedKeyWord("TINYTEXT".toLowerCase()); addReservedKeyWord("TO".toLowerCase()); addReservedKeyWord("TRAILING".toLowerCase()); addReservedKeyWord("TRANSACTION".toLowerCase()); addReservedKeyWord("TRIGGER".toLowerCase()); addReservedKeyWord("TRIGGERS".toLowerCase()); addReservedKeyWord("TRUE".toLowerCase()); addReservedKeyWord("TRUNCATE".toLowerCase()); addReservedKeyWord("TYPE".toLowerCase()); addReservedKeyWord("TYPES".toLowerCase()); addReservedKeyWord("UNCOMMITTED".toLowerCase()); addReservedKeyWord("UNDEFINED".toLowerCase()); addReservedKeyWord("UNDO".toLowerCase()); addReservedKeyWord("UNDOFILE".toLowerCase()); addReservedKeyWord("UNDO_BUFFER_SIZE".toLowerCase()); addReservedKeyWord("UNICODE".toLowerCase()); addReservedKeyWord("UNINSTALL".toLowerCase()); addReservedKeyWord("UNION".toLowerCase()); addReservedKeyWord("UNIQUE".toLowerCase()); addReservedKeyWord("UNKNOWN".toLowerCase()); addReservedKeyWord("UNLOCK".toLowerCase()); addReservedKeyWord("UNSIGNED".toLowerCase()); addReservedKeyWord("UNTIL".toLowerCase()); addReservedKeyWord("UPDATE".toLowerCase()); addReservedKeyWord("UPGRADE".toLowerCase()); addReservedKeyWord("USAGE".toLowerCase()); addReservedKeyWord("USE".toLowerCase()); addReservedKeyWord("USER".toLowerCase()); addReservedKeyWord("USER_RESOURCES".toLowerCase()); addReservedKeyWord("USE_FRM".toLowerCase()); addReservedKeyWord("USING".toLowerCase()); addReservedKeyWord("UTC_DATE".toLowerCase()); addReservedKeyWord("UTC_TIME".toLowerCase()); addReservedKeyWord("UTC_TIMESTAMP".toLowerCase()); addReservedKeyWord("VALIDATION".toLowerCase()); addReservedKeyWord("VALUE".toLowerCase()); addReservedKeyWord("VALUES".toLowerCase()); addReservedKeyWord("VARBINARY".toLowerCase()); addReservedKeyWord("VARCHAR".toLowerCase()); addReservedKeyWord("VARCHARACTER".toLowerCase()); addReservedKeyWord("VARIABLES".toLowerCase()); addReservedKeyWord("VARYING".toLowerCase()); addReservedKeyWord("VIEW".toLowerCase()); addReservedKeyWord("VIRTUAL".toLowerCase()); addReservedKeyWord("WAIT".toLowerCase()); addReservedKeyWord("WARNINGS".toLowerCase()); addReservedKeyWord("WEEK".toLowerCase()); addReservedKeyWord("WEIGHT_STRING".toLowerCase()); addReservedKeyWord("WHEN".toLowerCase()); addReservedKeyWord("WHERE".toLowerCase()); addReservedKeyWord("WHILE".toLowerCase()); addReservedKeyWord("WITH".toLowerCase()); addReservedKeyWord("WITHOUT".toLowerCase()); addReservedKeyWord("WORK".toLowerCase()); addReservedKeyWord("WRAPPER".toLowerCase()); addReservedKeyWord("WRITE".toLowerCase()); addReservedKeyWord("X509".toLowerCase()); addReservedKeyWord("XA".toLowerCase()); addReservedKeyWord("XID".toLowerCase()); addReservedKeyWord("XML".toLowerCase()); addReservedKeyWord("XOR".toLowerCase()); addReservedKeyWord("YEAR".toLowerCase()); addReservedKeyWord("YEAR_MONTH".toLowerCase()); addReservedKeyWord("ZEROFILL".toLowerCase()); } /** * returns the name for the database / schema * @return the database / schema name */ public String getDatabaseName() { return databaseName; } /** * Sets the name for the database / schema
* This names is required for creating a database.
* When a name is set, the dbms will automatically execute 'USE dbname' when the database is opened. * @param databaseName the name of the database */ public void setDatabaseName(String databaseName) { this.databaseName = databaseName; } public String getCharacterSet() { return characterSet; } public void setCharacterSet(String characterSet) { this.characterSet = characterSet; } /** * Get the table engine that is used when creating new tables * @return the table engine */ public String getEngine() { return engine; } /** * Set the table engine that is used when creating new tables * @param engine the table engine */ public void setEngine(String engine) { this.engine = engine; } /** * returns whether a sequence table is used for record identity management.
* Default is false. In this case the AutoIncrement feature of MySQL is used. * @return true if a sequence table is used instead of identity columns. */ public boolean isUseSequenceTable() { return useSequenceTable; } /** * If set to true a special table is used for sequence number generation.
* Otherwise the AutoIncrement feature of MySQL is used identity fields. * @param useSequenceTable true to use a sequence table or false otherwise. */ public void setUseSequenceTable(boolean useSequenceTable) { this.useSequenceTable = useSequenceTable; } /** * returns the name of the sequence table * @return the name of the table used for sequence number generation */ public String getSequenceTableName() { return sequenceTableName; } /** * Sets the name of the sequence table. * Only applicable if useSequenceTable is set to true. * @param sequenceTableName the name of the table used for sequence number generation */ public void setSequenceTableName(String sequenceTableName) { this.sequenceTableName = sequenceTableName; } /* * (non-Javadoc) * * @see org.apache.empire.db.DBMSHandler#openDatabase(org.apache.empire.db.DBDatabase, java.sql.Connection) */ @SuppressWarnings("unused") @Override public void attachDatabase(DBDatabase db, Connection conn) { // Prepare try { // Set Database if (StringUtils.isNotEmpty(databaseName)) executeSQL("USE " + databaseName, null, conn, null); // Sequence Table if (useSequenceTable && db.getTable(sequenceTableName)==null) new DBSeqTable(sequenceTableName, db); // call Base implementation super.attachDatabase(db, conn); } catch (SQLException e) { // throw exception throw new EmpireSQLException(this, e); } } /** * Creates a new MySQL command object. * * @return the new DBCommandMySQL object */ @Override public DBCommand createCommand(boolean autoPrepareStmt) { // create command object return new DBCommandMySQL(this, autoPrepareStmt); } /** * Creates a new MySQL SQL-Builder. * @return the new DBSQLBuilder object */ @Override public DBSQLBuilder createSQLBuilder() { return new DBSQLBuilderMySQL(this); } @Override /** * Creates a combined command that supports limit() and skip() * @param left the first DBCommandExpr object * @param keyWord the key word between the two DBCommandExpr objects * @param right the second DBCommandExpr object * @return the new DBCommandExpr object */ public DBCommandExpr createCombinedCommand(DBCommandExpr left, String keyWord, DBCommandExpr right) { // Override CombinedCmd return new DBCombinedCmd(left, keyWord, right) { // *Deprecated* private static final long serialVersionUID = 1L; protected int limit = -1; protected int skip = -1; @Override public DBCommandExpr limitRows(int numRows) { limit = numRows; return this; } @Override public DBCommandExpr skipRows(int numRows) { skip = numRows; return this; } @Override public void clearLimit() { limit = -1; skip = -1; } @Override public void getSelect(DBSQLBuilder sql) { // Prepares statement super.getSelect(sql); // add limit and offset if (limit>=0) { sql.append("\r\nLIMIT "); sql.append(String.valueOf(limit)); // Offset if (skip>=0) { sql.append(" OFFSET "); sql.append(String.valueOf(skip)); } } } }; } /** * Returns whether or not a particular feature is supported by this dbms * @param type type of requested feature. @see DBMSFeature * @return true if the features is supported or false otherwise */ @Override public boolean isSupported(DBMSFeature type) { switch (type) { // return support info case CREATE_SCHEMA: return true; case SEQUENCES: return useSequenceTable; case QUERY_LIMIT_ROWS: return true; case QUERY_SKIP_ROWS: return true; default: // All other features are not supported by default return false; } } /** * Gets an sql phrase template for this database system.
* @see DBMSHandler#getSQLPhrase(DBSqlPhrase) * @return the phrase template */ @Override public String getSQLPhrase(DBSqlPhrase phrase) { switch (phrase) { // sql-phrases case SQL_NULL: return "null"; case SQL_PARAMETER: return " ? "; case SQL_RENAME_TABLE: return " "; case SQL_RENAME_COLUMN: return " AS "; case SQL_DATABASE_LINK: return "@"; case SQL_QUOTES_OPEN: return "`"; case SQL_QUOTES_CLOSE: return "`"; case SQL_CONCAT_EXPR: return "concat(?, {0})"; // data types case SQL_BOOLEAN_TRUE: return "1"; case SQL_BOOLEAN_FALSE: return "0"; case SQL_CURRENT_DATE: return "CURRENT_DATE()"; case SQL_DATE_PATTERN: return "yyyy-MM-dd"; case SQL_DATE_TEMPLATE: return "STR_TO_DATE('{0}','%Y-%m-%d')"; case SQL_CURRENT_TIME: return "CURRENT_TIME()"; case SQL_TIME_PATTERN: return "HH:mm:ss"; case SQL_TIME_TEMPLATE: return "STR_TO_DATE('{0}','%H:%i:%s')"; case SQL_DATETIME_PATTERN: return "yyyy-MM-dd HH:mm:ss"; case SQL_DATETIME_TEMPLATE: return "STR_TO_DATE('{0}','%Y-%m-%d %H:%i:%s')"; case SQL_CURRENT_TIMESTAMP: return "CURRENT_TIMESTAMP()"; case SQL_TIMESTAMP_PATTERN: return "yyyy-MM-dd HH:mm:ss.SSS"; case SQL_TIMESTAMP_TEMPLATE: return "STR_TO_DATE('{0}','%Y-%m-%d %H:%i:%s.%f')"; // functions case SQL_FUNC_COALESCE: return "coalesce(?, {0})"; case SQL_FUNC_SUBSTRING: return "substring(?, {0})"; case SQL_FUNC_SUBSTRINGEX: return "substring(?, {0}, {1})"; case SQL_FUNC_REPLACE: return "replace(?, {0}, {1})"; case SQL_FUNC_REVERSE: return "reverse(?)"; case SQL_FUNC_STRINDEX: return "instr(?, {0})"; case SQL_FUNC_STRINDEXFROM: return "locate({0}, ?, {1})"; case SQL_FUNC_LENGTH: return "length(?)"; case SQL_FUNC_UPPER: return "upper(?)"; case SQL_FUNC_LOWER: return "lcase(?)"; case SQL_FUNC_TRIM: return "trim(?)"; case SQL_FUNC_LTRIM: return "ltrim(?)"; case SQL_FUNC_RTRIM: return "rtrim(?)"; case SQL_FUNC_ESCAPE: return "? escape {0:VARCHAR}"; // Numeric case SQL_FUNC_ABS: return "abs(?)"; case SQL_FUNC_ROUND: return "round(?,{0})"; case SQL_FUNC_TRUNC: return "truncate(?,{0})"; case SQL_FUNC_CEILING: return "ceiling(?)"; case SQL_FUNC_FLOOR: return "floor(?)"; case SQL_FUNC_MOD: return "mod(?,{0})"; case SQL_FUNC_FORMAT: return "format(?, {0:INTEGER})"; /* TODO: supports only decimal places. Add support for a format string */ // Date case SQL_FUNC_DAY: return "day(?)"; case SQL_FUNC_MONTH: return "month(?)"; case SQL_FUNC_YEAR: return "year(?)"; // Aggregation case SQL_FUNC_SUM: return "sum(?)"; case SQL_FUNC_MAX: return "max(?)"; case SQL_FUNC_MIN: return "min(?)"; case SQL_FUNC_AVG: return "avg(?)"; // Others case SQL_FUNC_DECODE: return "case ? {0} end"; case SQL_FUNC_DECODE_SEP: return " "; case SQL_FUNC_DECODE_PART: return "when {0} then {1}"; case SQL_FUNC_DECODE_ELSE: return "else {0}"; // Not defined default: // log.warn("SQL phrase " + phrase.name() + " is not defined!"); return phrase.getSqlDefault(); } } /** * @see DBMSHandler#getConvertPhrase(DataType, DataType, Object) */ @Override public String getConvertPhrase(DataType destType, DataType srcType, Object format) { switch(destType) { case BOOL: return "CAST(? AS UNSIGNED)"; case INTEGER: return "CAST(? AS SIGNED)"; case DECIMAL: return "CAST(? AS DECIMAL)"; case FLOAT: return "CAST(? AS DECIMAL)"; case DATE: return "CAST(? AS DATE)"; case TIME: return "CAST(? AS TIME)"; case DATETIME: case TIMESTAMP: return "CAST(? AS DATETIME)"; // Convert to text case VARCHAR: case CHAR: if (format != null) { // Convert using a format string return "CAST(? AS CHAR " + format.toString() + ")"; } else { return "CAST(? AS CHAR)"; } case BLOB: return "CAST(? AS BLOB)"; // Unknown Type default: log.error("getConvertPhrase: unknown type " + destType); return "?"; } } /** * @see DBMSHandlerBase#getNextSequenceValue(DBDatabase, String, int, Connection) */ @Override public Object getNextSequenceValue(DBDatabase db, String seqName, int minValue, Connection conn) { if (useSequenceTable) { // Use a sequence Table to generate Sequences DBTable t = db.getTable(sequenceTableName); return ((DBSeqTable)t).getNextValue(seqName, minValue, conn); } else { // Post Detection return null; } } /** * @see DBMSHandlerBase#getNextSequenceValueExpr(DBTableColumn col) */ @Override public DBColumnExpr getNextSequenceValueExpr(DBTableColumn column) { throw new NotSupportedException(this, "getNextSequenceValueExpr"); } /** * Overridden. Returns a timestamp that is used for record updates created by the database server. * * @return the current date and time of the database server. */ @Override public java.sql.Timestamp getUpdateTimestamp(Connection conn) { // Default implementation GregorianCalendar cal = new GregorianCalendar(); return new java.sql.Timestamp(cal.getTimeInMillis()); } /** * @see DBMSHandler#getDDLScript(DDLActionType, DBObject, DBSQLScript) */ @Override public void getDDLScript(DDLActionType type, DBObject dbo, DBSQLScript script) { if (ddlGenerator==null) ddlGenerator = new MySQLDDLGenerator(this); // forward request ddlGenerator.getDDLScript(type, dbo, script); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy