isMariaDB(); $serverVersion = $GLOBALS['dbi']->getVersion(); switch ($class) { case 'CHAR': $ret = array( 'AES_DECRYPT', 'AES_ENCRYPT', 'BIN', 'CHAR', 'COMPRESS', 'CURRENT_USER', 'DATABASE', 'DAYNAME', 'DES_DECRYPT', 'DES_ENCRYPT', 'ENCRYPT', 'HEX', 'INET6_NTOA', 'INET_NTOA', 'LOAD_FILE', 'LOWER', 'LTRIM', 'MD5', 'MONTHNAME', 'OLD_PASSWORD', 'PASSWORD', 'QUOTE', 'REVERSE', 'RTRIM', 'SHA1', 'SOUNDEX', 'SPACE', 'TRIM', 'UNCOMPRESS', 'UNHEX', 'UPPER', 'USER', 'UUID', 'VERSION', ); if (($isMariaDB && $serverVersion < 100012) || $serverVersion < 50603 ) { $ret = array_diff($ret, array('INET6_NTOA')); } return $ret; case 'DATE': return array( 'CURRENT_DATE', 'CURRENT_TIME', 'DATE', 'FROM_DAYS', 'FROM_UNIXTIME', 'LAST_DAY', 'NOW', 'SEC_TO_TIME', 'SYSDATE', 'TIME', 'TIMESTAMP', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP', 'YEAR', ); case 'NUMBER': $ret = array( 'ABS', 'ACOS', 'ASCII', 'ASIN', 'ATAN', 'BIT_LENGTH', 'BIT_COUNT', 'CEILING', 'CHAR_LENGTH', 'CONNECTION_ID', 'COS', 'COT', 'CRC32', 'DAYOFMONTH', 'DAYOFWEEK', 'DAYOFYEAR', 'DEGREES', 'EXP', 'FLOOR', 'HOUR', 'INET6_ATON', 'INET_ATON', 'LENGTH', 'LN', 'LOG', 'LOG2', 'LOG10', 'MICROSECOND', 'MINUTE', 'MONTH', 'OCT', 'ORD', 'PI', 'QUARTER', 'RADIANS', 'RAND', 'ROUND', 'SECOND', 'SIGN', 'SIN', 'SQRT', 'TAN', 'TO_DAYS', 'TO_SECONDS', 'TIME_TO_SEC', 'UNCOMPRESSED_LENGTH', 'UNIX_TIMESTAMP', 'UUID_SHORT', 'WEEK', 'WEEKDAY', 'WEEKOFYEAR', 'YEARWEEK', ); if (($isMariaDB && $serverVersion < 100012) || $serverVersion < 50603 ) { $ret = array_diff($ret, array('INET6_ATON')); } return $ret; case 'SPATIAL': return array( 'GeomFromText', 'GeomFromWKB', 'GeomCollFromText', 'LineFromText', 'MLineFromText', 'PointFromText', 'MPointFromText', 'PolyFromText', 'MPolyFromText', 'GeomCollFromWKB', 'LineFromWKB', 'MLineFromWKB', 'PointFromWKB', 'MPointFromWKB', 'PolyFromWKB', 'MPolyFromWKB', ); } return array(); } /** * Returns array of all attributes available. * * @return string[] * */ public function getAttributes() { return array( '', 'BINARY', 'UNSIGNED', 'UNSIGNED ZEROFILL', 'on update CURRENT_TIMESTAMP', ); } /** * Returns array of all column types available. * * VARCHAR, TINYINT, TEXT and DATE are listed first, based on * estimated popularity. * * @return string[] * */ public function getColumns() { $ret = parent::getColumns(); // numeric $ret[_pgettext('numeric types', 'Numeric')] = array( 'TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT', 'BIGINT', '-', 'DECIMAL', 'FLOAT', 'DOUBLE', 'REAL', '-', 'BIT', 'BOOLEAN', 'SERIAL', ); // Date/Time $ret[_pgettext('date and time types', 'Date and time')] = array( 'DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR', ); // Text $ret[_pgettext('string types', 'String')] = array( 'CHAR', 'VARCHAR', '-', 'TINYTEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT', '-', 'BINARY', 'VARBINARY', '-', 'TINYBLOB', 'MEDIUMBLOB', 'BLOB', 'LONGBLOB', '-', 'ENUM', 'SET', ); $ret[_pgettext('spatial types', 'Spatial')] = array( 'GEOMETRY', 'POINT', 'LINESTRING', 'POLYGON', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION', ); if ($GLOBALS['dbi']->getVersion() >= 50708 && ! $GLOBALS['dbi']->isMariaDB() ) { $ret['JSON'] = array( 'JSON', ); } return $ret; } /** * Returns an array of integer types * * @return string[] integer types */ public function getIntegerTypes() { return array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'); } /** * Returns the min and max values of a given integer type * * @param string $type integer type * @param boolean $signed whether signed * * @return string[] min and max values */ public function getIntegerRange($type, $signed = true) { static $min_max_data = array( 'unsigned' => array( 'tinyint' => array('0', '255'), 'smallint' => array('0', '65535'), 'mediumint' => array('0', '16777215'), 'int' => array('0', '4294967295'), 'bigint' => array('0', '18446744073709551615') ), 'signed' => array( 'tinyint' => array('-128', '127'), 'smallint' => array('-32768', '32767'), 'mediumint' => array('-8388608', '8388607'), 'int' => array('-2147483648', '2147483647'), 'bigint' => array('-9223372036854775808', '9223372036854775807') ) ); $relevantArray = $signed ? $min_max_data['signed'] : $min_max_data['unsigned']; return isset($relevantArray[$type]) ? $relevantArray[$type] : array('', ''); } }