Fix #3238

Close #3239
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index 12ab5bb..62cea75 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -1440,7 +1440,7 @@
 	 */
 	protected function _has_operator($str)
 	{
-		return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str));
+		return (bool) preg_match('/(<|>|!|=|\sIS\s|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str));
 	}
 
 	// --------------------------------------------------------------------
@@ -1464,8 +1464,7 @@
 				'\s*(?:<|>|!)?=\s*',		// =, <=, >=, !=
 				'\s*<>?\s*',			// <, <>
 				'\s*>\s*',			// >
-				'\s+IS NULL',			// IS NULL
-				'\s+IS NOT NULL',		// IS NOT NULL
+				'\s+IS(?:\sNOT)?(?:\sNULL)?',	// IS[ NOT] NULL
 				'\s+EXISTS\s*\([^\)]+\)',	// EXISTS(sql)
 				'\s+NOT EXISTS\s*\([^\)]+\)',	// NOT EXISTS(sql)
 				'\s+BETWEEN\s+\S+\s+AND\s+\S+',	// BETWEEN value AND value
diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
index f11f846..4e37e4c 100644
--- a/system/database/DB_query_builder.php
+++ b/system/database/DB_query_builder.php
@@ -663,11 +663,15 @@
 			}
 			else
 			{
-				$operator = trim($this->_get_operator($k));
-
-				if ($operator === '<>' OR $operator === '!=')
+				$operator = $this->_get_operator($k);
+				if (stripos($operator, 'NULL') === FALSE)
 				{
-					$k = str_replace($operator, ' IS NOT NULL', $k);
+					$op = strrpos($k, $operator);
+					if (strlen($k) === ($op + strlen($operator)))
+					{
+						$operator = strtr($operator, array('<>' => 'IS NOT', '!=' => 'IS NOT'));
+						$k = substr($k, 0, $op).rtrim($operator).' NULL';
+					}
 				}
 			}