summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Andreev <narf@devilix.net>2017-06-22 14:39:05 +0200
committerAndrey Andreev <narf@devilix.net>2017-06-22 14:39:05 +0200
commit9414d492612e08f7fa8ae46131d882547afb49ff (patch)
tree6b212d3eab35d34e78ec219e51fcd8516d5eaf51
parent0c06ba0c587b5ef97718bc3b19c6dba163b7acb0 (diff)
Close #4134: Allow dots in alias names detected by QB
-rw-r--r--system/database/DB_driver.php23
-rw-r--r--user_guide_src/source/changelog.rst1
-rw-r--r--user_guide_src/source/database/db_driver_reference.rst5
3 files changed, 17 insertions, 12 deletions
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index de599a675..1dc23d72e 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -1320,10 +1320,11 @@ abstract class CI_DB_driver {
*
* This function escapes column and table names
*
- * @param mixed
+ * @param mixed $item Identifier to escape
+ * @param bool $split Whether to split identifiers when a dot is encountered
* @return mixed
*/
- public function escape_identifiers($item)
+ public function escape_identifiers($item, $split = TRUE)
{
if ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers))
{
@@ -1344,22 +1345,22 @@ abstract class CI_DB_driver {
return $item;
}
- static $preg_ec = array();
+ static $preg_ec;
if (empty($preg_ec))
{
if (is_array($this->_escape_char))
{
$preg_ec = array(
- preg_quote($this->_escape_char[0], '/'),
- preg_quote($this->_escape_char[1], '/'),
+ preg_quote($this->_escape_char[0]),
+ preg_quote($this->_escape_char[1]),
$this->_escape_char[0],
$this->_escape_char[1]
);
}
else
{
- $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/');
+ $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char);
$preg_ec[2] = $preg_ec[3] = $this->_escape_char;
}
}
@@ -1368,11 +1369,13 @@ abstract class CI_DB_driver {
{
if (strpos($item, '.'.$id) !== FALSE)
{
- return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item);
+ return preg_replace('#'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\.#i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item);
}
}
- return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?(\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item);
+ $dot = ($split !== FALSE) ? '\.' : '';
+
+ return preg_replace('#'.$preg_ec[0].'?([^'.$preg_ec[1].$dot.']+)'.$preg_ec[1].'?(\.)?#i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item);
}
// --------------------------------------------------------------------
@@ -1786,14 +1789,14 @@ abstract class CI_DB_driver {
if ($offset = strripos($item, ' AS '))
{
$alias = ($protect_identifiers)
- ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4))
+ ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4), FALSE)
: substr($item, $offset);
$item = substr($item, 0, $offset);
}
elseif ($offset = strrpos($item, ' '))
{
$alias = ($protect_identifiers)
- ? ' '.$this->escape_identifiers(substr($item, $offset + 1))
+ ? ' '.$this->escape_identifiers(substr($item, $offset + 1), FALSE)
: substr($item, $offset);
$item = substr($item, 0, $offset);
}
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index db2be2014..c25c70e64 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -77,6 +77,7 @@ Release Date: Not Released
- :doc:`Query Builder <database/query_builder>`:
- Added methods ``having_in()``, ``or_having_in()``, ``not_having_in()``, ``or_not_having_in()``.
+ - Updated logic to allow dots in alias names.
- Helpers
diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst
index 6f2fa5fb1..c240526e0 100644
--- a/user_guide_src/source/database/db_driver_reference.rst
+++ b/user_guide_src/source/database/db_driver_reference.rst
@@ -305,9 +305,10 @@ This article is intended to be a reference for them.
Gets a list containing field data about a table.
- .. php:method:: escape_identifiers($item)
+ .. php:method:: escape_identifiers($item, $split = TRUE)
:param mixed $item: The item or array of items to escape
+ :param bool $split: Whether to split identifiers when a dot is encountered
:returns: The input item(s), escaped
:rtype: mixed
@@ -428,4 +429,4 @@ This article is intended to be a reference for them.
insert the table prefix (if it exists) in the proper
position, and escape only the correct identifiers.
- This method is used extensively by the Query Builder class. \ No newline at end of file
+ This method is used extensively by the Query Builder class.