diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 9e398c7101a..a7cb5079095 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1354,24 +1354,23 @@ public function escape_identifiers($item, $split = TRUE) return $item; } - static $preg_ec; - - if (empty($preg_ec)) + if (is_array($this->_escape_char)) { - if (is_array($this->_escape_char)) - { - $preg_ec = array( - 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[2] = $preg_ec[3] = $this->_escape_char; - } + $preg_ec = array( + preg_quote($this->_escape_char[0]), + preg_quote($this->_escape_char[1]), + $this->_escape_char[0], + $this->_escape_char[1] + ); + } + else + { + $preg_ec = array( + preg_quote($this->_escape_char), + preg_quote($this->_escape_char), + $this->_escape_char, + $this->_escape_char + ); } foreach ($this->_reserved_identifiers as $id) @@ -1503,30 +1502,24 @@ protected function _has_operator($str) */ protected function _get_operator($str) { - static $_operators; - - if (empty($_operators)) - { - $_les = ($this->_like_escape_str !== '') - ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') - : ''; - $_operators = array( - '\s*(?:<|>|!)?=\s*', // =, <=, >=, != - '\s*<>?\s*', // <, <> - '\s*>\s*', // > - '\s+IS NULL', // IS NULL - '\s+IS NOT NULL', // IS NOT NULL - '\s+EXISTS\s*\(.*\)', // EXISTS(sql) - '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) - '\s+BETWEEN\s+', // BETWEEN value AND value - '\s+NOT BETWEEN\s+', // NOT BETWEEN value AND value - '\s+IN\s*\(.*\)', // IN(list) - '\s+NOT IN\s*\(.*\)', // NOT IN (list) - '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] - '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] - ); - - } + $_les = ($this->_like_escape_str !== '') + ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') + : ''; + $_operators = array( + '\s*(?:<|>|!)?=\s*', // =, <=, >=, != + '\s*<>?\s*', // <, <> + '\s*>\s*', // > + '\s+IS NULL', // IS NULL + '\s+IS NOT NULL', // IS NOT NULL + '\s+EXISTS\s*\(.*\)', // EXISTS(sql) + '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) + '\s+BETWEEN\s+', // BETWEEN value AND value + '\s+NOT BETWEEN\s+', // NOT BETWEEN value AND value + '\s+IN\s*\(.*\)', // IN(list) + '\s+NOT IN\s*\(.*\)', // NOT IN (list) + '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] + '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] + ); return preg_match('/'.implode('|', $_operators).'/i', $str, $match) ? $match[0] : FALSE; diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index e3a4f16caf5..ce24e7665f1 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -2803,13 +2803,8 @@ protected function _is_literal($str) return TRUE; } - static $_str; - - if (empty($_str)) - { - $_str = ($this->_escape_char !== '"') - ? array('"', "'") : array("'"); - } + $_str = ($this->_escape_char !== '"') + ? array('"', "'") : array("'"); return in_array($str[0], $_str, TRUE); } diff --git a/tests/codeigniter/database/Driver_escape_test.php b/tests/codeigniter/database/Driver_escape_test.php new file mode 100644 index 00000000000..35b6c3a12db --- /dev/null +++ b/tests/codeigniter/database/Driver_escape_test.php @@ -0,0 +1,37 @@ +mysql = new CI_DB_mysqli_driver(array()); + $this->postgre = new CI_DB_postgre_driver(array()); + } + + // -------------------------------------------------------------------- + + public function test_escape_identifiers_per_driver() + { + $this->assertSame('`table`.`col`', $this->mysql->escape_identifiers('table.col')); + $this->assertSame('"table"."col"', $this->postgre->escape_identifiers('table.col')); + $this->assertSame('`table`.`col`', $this->mysql->escape_identifiers('table.col')); + } + + // -------------------------------------------------------------------- + + public function test_is_literal_per_driver() + { + $is_literal = new ReflectionMethod('CI_DB_query_builder', '_is_literal'); + if (PHP_VERSION_ID < 80100) + { + $is_literal->setAccessible(TRUE); + } + + $this->assertTrue($is_literal->invoke($this->mysql, '"foo"')); + $this->assertFalse($is_literal->invoke($this->postgre, '"foo"')); + $this->assertTrue($is_literal->invoke($this->mysql, '"foo"')); + } + +}