[ci skip] Partial patch for #2284

The issue description is about update_string(), which
I'm not sure if can be fixed at all. This patch only
addresses protect_identifiers().
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index 659664d..34d3a59 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -1788,12 +1788,15 @@
 		// with an alias. While we're at it, we will escape the components
 		if (strpos($item, '.') !== FALSE)
 		{
-			$parts	= explode('.', $item);
+			$parts = explode('.', $item);
 
 			// Does the first segment of the exploded item match
 			// one of the aliases previously identified? If so,
 			// we have nothing more to do other than escape the item
-			if (in_array($parts[0], $this->qb_aliased_tables))
+			//
+			// NOTE: The ! empty() condition prevents this method
+			//       from breaking when QB isn't enabled.
+			if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables))
 			{
 				if ($protect_identifiers === TRUE)
 				{
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index 7d8ef83..4988157 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -7,6 +7,10 @@
 
 Release Date: Not Released
 
+Bug fixes for 3.0.2
+-------------------
+
+-  Fixed a bug (#2284) - :doc:`Database <database/index>` method ``protect_identifiers()`` breaks when :doc:`Query Builder <database/query_builder>` isn't enabled.
 
 Version 3.0.1
 =============