123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * SQL data types definition
- *
- * @package PhpMyAdmin
- */
- namespace PhpMyAdmin;
- /**
- * Class holding type definitions for MySQL and MariaDB.
- *
- * @package PhpMyAdmin
- */
- class Types
- {
- /**
- * @var PhpMyAdmin\DatabaseInteface Database interface
- */
- private $_dbi;
- /**
- * Constructor
- *
- * @param PhpMyAdmin\DatabaseInteface $dbi Database interface instance
- */
- public function __construct($dbi)
- {
- $this->_dbi = $dbi;
- }
- /**
- * Returns list of unary operators.
- *
- * @return string[]
- */
- public function getUnaryOperators()
- {
- return array(
- 'IS NULL',
- 'IS NOT NULL',
- "= ''",
- "!= ''",
- );
- }
- /**
- * Check whether operator is unary.
- *
- * @param string $op operator name
- *
- * @return boolean
- */
- public function isUnaryOperator($op)
- {
- return in_array($op, $this->getUnaryOperators());
- }
- /**
- * Returns list of operators checking for NULL.
- *
- * @return string[]
- */
- public function getNullOperators()
- {
- return array(
- 'IS NULL',
- 'IS NOT NULL',
- );
- }
- /**
- * ENUM search operators
- *
- * @return string[]
- */
- public function getEnumOperators()
- {
- return array(
- '=',
- '!=',
- );
- }
- /**
- * TEXT search operators
- *
- * @return string[]
- */
- public function getTextOperators()
- {
- return array(
- 'LIKE',
- 'LIKE %...%',
- 'NOT LIKE',
- '=',
- '!=',
- 'REGEXP',
- 'REGEXP ^...$',
- 'NOT REGEXP',
- "= ''",
- "!= ''",
- 'IN (...)',
- 'NOT IN (...)',
- 'BETWEEN',
- 'NOT BETWEEN',
- );
- }
- /**
- * Number search operators
- *
- * @return string[]
- */
- public function getNumberOperators()
- {
- return array(
- '=',
- '>',
- '>=',
- '<',
- '<=',
- '!=',
- 'LIKE',
- 'LIKE %...%',
- 'NOT LIKE',
- 'IN (...)',
- 'NOT IN (...)',
- 'BETWEEN',
- 'NOT BETWEEN',
- );
- }
- /**
- * Returns operators for given type
- *
- * @param string $type Type of field
- * @param boolean $null Whether field can be NULL
- *
- * @return string[]
- */
- public function getTypeOperators($type, $null)
- {
- $ret = array();
- $class = $this->getTypeClass($type);
- if (strncasecmp($type, 'enum', 4) == 0) {
- $ret = array_merge($ret, $this->getEnumOperators());
- } elseif ($class == 'CHAR') {
- $ret = array_merge($ret, $this->getTextOperators());
- } else {
- $ret = array_merge($ret, $this->getNumberOperators());
- }
- if ($null) {
- $ret = array_merge($ret, $this->getNullOperators());
- }
- return $ret;
- }
- /**
- * Returns operators for given type as html options
- *
- * @param string $type Type of field
- * @param boolean $null Whether field can be NULL
- * @param string $selectedOperator Option to be selected
- *
- * @return string Generated Html
- */
- public function getTypeOperatorsHtml($type, $null, $selectedOperator = null)
- {
- $html = '';
- foreach ($this->getTypeOperators($type, $null) as $fc) {
- if (isset($selectedOperator) && $selectedOperator == $fc) {
- $selected = ' selected="selected"';
- } else {
- $selected = '';
- }
- $html .= '<option value="' . htmlspecialchars($fc) . '"'
- . $selected . '>'
- . htmlspecialchars($fc) . '</option>';
- }
- return $html;
- }
- /**
- * Returns the data type description.
- *
- * @param string $type The data type to get a description.
- *
- * @return string
- *
- */
- public function getTypeDescription($type)
- {
- $type = mb_strtoupper($type);
- switch ($type) {
- case 'TINYINT':
- return __(
- 'A 1-byte integer, signed range is -128 to 127, unsigned range is ' .
- '0 to 255'
- );
- case 'SMALLINT':
- return __(
- 'A 2-byte integer, signed range is -32,768 to 32,767, unsigned ' .
- 'range is 0 to 65,535'
- );
- case 'MEDIUMINT':
- return __(
- 'A 3-byte integer, signed range is -8,388,608 to 8,388,607, ' .
- 'unsigned range is 0 to 16,777,215'
- );
- case 'INT':
- return __(
- 'A 4-byte integer, signed range is ' .
- '-2,147,483,648 to 2,147,483,647, unsigned range is 0 to ' .
- '4,294,967,295'
- );
- case 'BIGINT':
- return __(
- 'An 8-byte integer, signed range is -9,223,372,036,854,775,808 ' .
- 'to 9,223,372,036,854,775,807, unsigned range is 0 to ' .
- '18,446,744,073,709,551,615'
- );
- case 'DECIMAL':
- return __(
- 'A fixed-point number (M, D) - the maximum number of digits (M) ' .
- 'is 65 (default 10), the maximum number of decimals (D) is 30 ' .
- '(default 0)'
- );
- case 'FLOAT':
- return __(
- 'A small floating-point number, allowable values are ' .
- '-3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to ' .
- '3.402823466E+38'
- );
- case 'DOUBLE':
- return __(
- 'A double-precision floating-point number, allowable values are ' .
- '-1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and ' .
- '2.2250738585072014E-308 to 1.7976931348623157E+308'
- );
- case 'REAL':
- return __(
- 'Synonym for DOUBLE (exception: in REAL_AS_FLOAT SQL mode it is ' .
- 'a synonym for FLOAT)'
- );
- case 'BIT':
- return __(
- 'A bit-field type (M), storing M of bits per value (default is 1, ' .
- 'maximum is 64)'
- );
- case 'BOOLEAN':
- return __(
- 'A synonym for TINYINT(1), a value of zero is considered false, ' .
- 'nonzero values are considered true'
- );
- case 'SERIAL':
- return __('An alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE');
- case 'DATE':
- return sprintf(
- __('A date, supported range is %1$s to %2$s'), '1000-01-01',
- '9999-12-31'
- );
- case 'DATETIME':
- return sprintf(
- __('A date and time combination, supported range is %1$s to %2$s'),
- '1000-01-01 00:00:00', '9999-12-31 23:59:59'
- );
- case 'TIMESTAMP':
- return __(
- 'A timestamp, range is 1970-01-01 00:00:01 UTC to 2038-01-09 ' .
- '03:14:07 UTC, stored as the number of seconds since the epoch ' .
- '(1970-01-01 00:00:00 UTC)'
- );
- case 'TIME':
- return sprintf(
- __('A time, range is %1$s to %2$s'), '-838:59:59', '838:59:59'
- );
- case 'YEAR':
- return __(
- "A year in four-digit (4, default) or two-digit (2) format, the " .
- "allowable values are 70 (1970) to 69 (2069) or 1901 to 2155 and " .
- "0000"
- );
- case 'CHAR':
- return __(
- 'A fixed-length (0-255, default 1) string that is always ' .
- 'right-padded with spaces to the specified length when stored'
- );
- case 'VARCHAR':
- return sprintf(
- __(
- 'A variable-length (%s) string, the effective maximum length ' .
- 'is subject to the maximum row size'
- ), '0-65,535'
- );
- case 'TINYTEXT':
- return __(
- 'A TEXT column with a maximum length of 255 (2^8 - 1) characters, ' .
- 'stored with a one-byte prefix indicating the length of the value ' .
- 'in bytes'
- );
- case 'TEXT':
- return __(
- 'A TEXT column with a maximum length of 65,535 (2^16 - 1) ' .
- 'characters, stored with a two-byte prefix indicating the length ' .
- 'of the value in bytes'
- );
- case 'MEDIUMTEXT':
- return __(
- 'A TEXT column with a maximum length of 16,777,215 (2^24 - 1) ' .
- 'characters, stored with a three-byte prefix indicating the ' .
- 'length of the value in bytes'
- );
- case 'LONGTEXT':
- return __(
- 'A TEXT column with a maximum length of 4,294,967,295 or 4GiB ' .
- '(2^32 - 1) characters, stored with a four-byte prefix indicating ' .
- 'the length of the value in bytes'
- );
- case 'BINARY':
- return __(
- 'Similar to the CHAR type, but stores binary byte strings rather ' .
- 'than non-binary character strings'
- );
- case 'VARBINARY':
- return __(
- 'Similar to the VARCHAR type, but stores binary byte strings ' .
- 'rather than non-binary character strings'
- );
- case 'TINYBLOB':
- return __(
- 'A BLOB column with a maximum length of 255 (2^8 - 1) bytes, ' .
- 'stored with a one-byte prefix indicating the length of the value'
- );
- case 'MEDIUMBLOB':
- return __(
- 'A BLOB column with a maximum length of 16,777,215 (2^24 - 1) ' .
- 'bytes, stored with a three-byte prefix indicating the length of ' .
- 'the value'
- );
- case 'BLOB':
- return __(
- 'A BLOB column with a maximum length of 65,535 (2^16 - 1) bytes, ' .
- 'stored with a two-byte prefix indicating the length of the value'
- );
- case 'LONGBLOB':
- return __(
- 'A BLOB column with a maximum length of 4,294,967,295 or 4GiB ' .
- '(2^32 - 1) bytes, stored with a four-byte prefix indicating the ' .
- 'length of the value'
- );
- case 'ENUM':
- return __(
- "An enumeration, chosen from the list of up to 65,535 values or " .
- "the special '' error value"
- );
- case 'SET':
- return __("A single value chosen from a set of up to 64 members");
- case 'GEOMETRY':
- return __('A type that can store a geometry of any type');
- case 'POINT':
- return __('A point in 2-dimensional space');
- case 'LINESTRING':
- return __('A curve with linear interpolation between points');
- case 'POLYGON':
- return __('A polygon');
- case 'MULTIPOINT':
- return __('A collection of points');
- case 'MULTILINESTRING':
- return __(
- 'A collection of curves with linear interpolation between points'
- );
- case 'MULTIPOLYGON':
- return __('A collection of polygons');
- case 'GEOMETRYCOLLECTION':
- return __('A collection of geometry objects of any type');
- case 'JSON':
- return __(
- 'Stores and enables efficient access to data in JSON'
- . ' (JavaScript Object Notation) documents'
- );
- }
- return '';
- }
- /**
- * Returns class of a type, used for functions available for type
- * or default values.
- *
- * @param string $type The data type to get a class.
- *
- * @return string
- *
- */
- public function getTypeClass($type)
- {
- $type = mb_strtoupper($type);
- switch ($type) {
- case 'TINYINT':
- case 'SMALLINT':
- case 'MEDIUMINT':
- case 'INT':
- case 'BIGINT':
- case 'DECIMAL':
- case 'FLOAT':
- case 'DOUBLE':
- case 'REAL':
- case 'BIT':
- case 'BOOLEAN':
- case 'SERIAL':
- return 'NUMBER';
- case 'DATE':
- case 'DATETIME':
- case 'TIMESTAMP':
- case 'TIME':
- case 'YEAR':
- return 'DATE';
- case 'CHAR':
- case 'VARCHAR':
- case 'TINYTEXT':
- case 'TEXT':
- case 'MEDIUMTEXT':
- case 'LONGTEXT':
- case 'BINARY':
- case 'VARBINARY':
- case 'TINYBLOB':
- case 'MEDIUMBLOB':
- case 'BLOB':
- case 'LONGBLOB':
- case 'ENUM':
- case 'SET':
- return 'CHAR';
- case 'GEOMETRY':
- case 'POINT':
- case 'LINESTRING':
- case 'POLYGON':
- case 'MULTIPOINT':
- case 'MULTILINESTRING':
- case 'MULTIPOLYGON':
- case 'GEOMETRYCOLLECTION':
- return 'SPATIAL';
- case 'JSON':
- return 'JSON';
- }
- return '';
- }
- /**
- * Returns array of functions available for a class.
- *
- * @param string $class The class to get function list.
- *
- * @return string[]
- *
- */
- public function getFunctionsClass($class)
- {
- $isMariaDB = $this->_dbi->isMariaDB();
- $serverVersion = $this->_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':
- if ($serverVersion >= 50600) {
- return array(
- 'ST_GeomFromText',
- 'ST_GeomFromWKB',
- 'ST_GeomCollFromText',
- 'ST_LineFromText',
- 'ST_MLineFromText',
- 'ST_PointFromText',
- 'ST_MPointFromText',
- 'ST_PolyFromText',
- 'ST_MPolyFromText',
- 'ST_GeomCollFromWKB',
- 'ST_LineFromWKB',
- 'ST_MLineFromWKB',
- 'ST_PointFromWKB',
- 'ST_MPointFromWKB',
- 'ST_PolyFromWKB',
- 'ST_MPolyFromWKB',
- );
- } else {
- return array(
- 'GeomFromText',
- 'GeomFromWKB',
- 'GeomCollFromText',
- 'LineFromText',
- 'MLineFromText',
- 'PointFromText',
- 'MPointFromText',
- 'PolyFromText',
- 'MPolyFromText',
- 'GeomCollFromWKB',
- 'LineFromWKB',
- 'MLineFromWKB',
- 'PointFromWKB',
- 'MPointFromWKB',
- 'PolyFromWKB',
- 'MPolyFromWKB',
- );
- }
- }
- return array();
- }
- /**
- * Returns array of functions available for a type.
- *
- * @param string $type The data type to get function list.
- *
- * @return string[]
- *
- */
- public function getFunctions($type)
- {
- $class = $this->getTypeClass($type);
- return $this->getFunctionsClass($class);
- }
- /**
- * Returns array of all functions available.
- *
- * @return string[]
- *
- */
- public function getAllFunctions()
- {
- $ret = array_merge(
- $this->getFunctionsClass('CHAR'),
- $this->getFunctionsClass('NUMBER'),
- $this->getFunctionsClass('DATE'),
- $this->getFunctionsClass('UUID')
- );
- sort($ret);
- return $ret;
- }
- /**
- * 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()
- {
- $isMariaDB = $this->_dbi->isMariaDB();
- $serverVersion = $this->_dbi->getVersion();
- // most used types
- $ret = array(
- 'INT',
- 'VARCHAR',
- 'TEXT',
- 'DATE',
- );
- // 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 (($isMariaDB && $serverVersion > 100207)
- || (!$isMariaDB && $serverVersion >= 50708)) {
- $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('', '');
- }
- }
|