quote order column in backup and always quote "index" as it seems to be one of very little names not automatic recogniced in MySQL, backported current name_quote from trunk

This commit is contained in:
Ralf Becker 2015-03-30 08:38:03 +00:00
parent 89726bc051
commit bfe9e404dd
2 changed files with 24 additions and 17 deletions

View File

@ -847,7 +847,7 @@ class db_backup
empty($pk) || !$max ? false : $pk.' > '.$this->db->quote($max, $schema['fd'][$pk]['type']), empty($pk) || !$max ? false : $pk.' > '.$this->db->quote($max, $schema['fd'][$pk]['type']),
__LINE__, __FILE__, __LINE__, __FILE__,
empty($pk) ? false : 0, // if no primary key, query all rows empty($pk) ? false : 0, // if no primary key, query all rows
empty($pk) ? '' : 'ORDER BY '.$pk.' ASC', // order by primary key empty($pk) ? '' : 'ORDER BY '.$this->db->name_quote($pk).' ASC', // order by primary key
false, self::ROW_CHUNK) as $row) false, self::ROW_CHUNK) as $row)
{ {
if (!empty($pk)) $max = $row[$pk]; if (!empty($pk)) $max = $row[$pk];

View File

@ -1351,37 +1351,44 @@ class egw_db
* Correctly Quote Identifiers like table- or colmnnames for use in SQL-statements * Correctly Quote Identifiers like table- or colmnnames for use in SQL-statements
* *
* This is mostly copy & paste from adodb's datadict class * This is mostly copy & paste from adodb's datadict class
* @param $name string * @param string $_name
* @return string quoted string * @return string quoted string
*/ */
function name_quote($name = NULL) function name_quote($_name = NULL)
{ {
if (!is_string($name)) { if (!is_string($_name))
return FALSE; {
return false;
} }
$name = trim($name); $name = trim($_name);
if (!$this->Link_ID && !$this->connect()) if (!$this->Link_ID && !$this->connect())
{ {
return False; return false;
} }
$quote = $this->Link_ID->nameQuote; $quote = $this->Link_ID->nameQuote;
$type = $this->Type;
// if name is of the form `name`, quote it // if name is of the form `name`, remove MySQL quotes and leave it to automatic below
if ( preg_match('/^`(.+)`$/', $name, $matches) ) { if ($name[0] === '`' && substr($name, -1) === '`')
return $quote . $matches[1] . $quote;
}
// if name contains special characters, quote it
// always quote for postgreSQL, as this is the only way to support mixed case names
if (preg_match('/\W/', $name) || $this->Type == 'pgsql' && preg_match('/[A-Z]+/', $name))
{ {
return $quote . $name . $quote; $name = substr($name, 1, -1);
} }
return $name; $quoted = array_map(function($name) use ($quote, $type)
{
// if name contains special characters, quote it
// always quote for postgreSQL, as this is the only way to support mixed case names
if (preg_match('/\W/', $name) || $type == 'pgsql' && preg_match('/[A-Z]+/', $name) || $name == 'index')
{
return $quote . $name . $quote;
}
return $name;
}, explode('.', $name));
return implode('.', $quoted);
} }
/** /**