Merge "Cleaned up upgrade steps for versions older than JB"
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 83f6195..b001653 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -137,6 +137,7 @@
      * </pre>
      */
     static final int DATABASE_VERSION = 1200;
+    private static final int MINIMUM_SUPPORTED_VERSION = 700;
 
     public interface Tables {
         public static final String CONTACTS = "contacts";
@@ -781,26 +782,6 @@
         public static final int ADDRESS = 2;
     }
 
-    private interface Upgrade303Query {
-        public static final String TABLE = Tables.DATA;
-
-        public static final String SELECTION =
-                DataColumns.MIMETYPE_ID + "=?" +
-                    " AND " + Data._ID + " NOT IN " +
-                    "(SELECT " + NameLookupColumns.DATA_ID + " FROM " + Tables.NAME_LOOKUP + ")" +
-                    " AND " + Data.DATA1 + " NOT NULL";
-
-        public static final String COLUMNS[] = {
-                Data._ID,
-                Data.RAW_CONTACT_ID,
-                Data.DATA1,
-        };
-
-        public static final int ID = 0;
-        public static final int RAW_CONTACT_ID = 1;
-        public static final int DATA1 = 2;
-    }
-
     private interface StructuredNameQuery {
         public static final String TABLE = Tables.DATA;
 
@@ -834,37 +815,6 @@
         public static final int NAME = 2;
     }
 
-    private interface StructName205Query {
-        String TABLE = Tables.DATA_JOIN_RAW_CONTACTS;
-        String COLUMNS[] = {
-                DataColumns.CONCRETE_ID,
-                Data.RAW_CONTACT_ID,
-                RawContacts.DISPLAY_NAME_SOURCE,
-                RawContacts.DISPLAY_NAME_PRIMARY,
-                StructuredName.PREFIX,
-                StructuredName.GIVEN_NAME,
-                StructuredName.MIDDLE_NAME,
-                StructuredName.FAMILY_NAME,
-                StructuredName.SUFFIX,
-                StructuredName.PHONETIC_FAMILY_NAME,
-                StructuredName.PHONETIC_MIDDLE_NAME,
-                StructuredName.PHONETIC_GIVEN_NAME,
-        };
-
-        int ID = 0;
-        int RAW_CONTACT_ID = 1;
-        int DISPLAY_NAME_SOURCE = 2;
-        int DISPLAY_NAME = 3;
-        int PREFIX = 4;
-        int GIVEN_NAME = 5;
-        int MIDDLE_NAME = 6;
-        int FAMILY_NAME = 7;
-        int SUFFIX = 8;
-        int PHONETIC_FAMILY_NAME = 9;
-        int PHONETIC_MIDDLE_NAME = 10;
-        int PHONETIC_GIVEN_NAME = 11;
-    }
-
     private interface RawContactNameQuery {
         public static final String RAW_SQL =
                 "SELECT "
@@ -907,21 +857,6 @@
         public static final int PHONETIC_NAME_STYLE = 12;               // data11
     }
 
-    private interface Organization205Query {
-        String TABLE = Tables.DATA_JOIN_RAW_CONTACTS;
-        String COLUMNS[] = {
-                DataColumns.CONCRETE_ID,
-                Data.RAW_CONTACT_ID,
-                Organization.COMPANY,
-                Organization.PHONETIC_NAME,
-        };
-
-        int ID = 0;
-        int RAW_CONTACT_ID = 1;
-        int COMPANY = 2;
-        int PHONETIC_NAME = 3;
-    }
-
     public final static class NameLookupType {
         public static final int NAME_EXACT = 0;
         public static final int NAME_VARIANT = 1;
@@ -1039,7 +974,7 @@
     protected ContactsDatabaseHelper(
             Context context, String databaseName, boolean optimizationEnabled,
             boolean isTestInstance) {
-        super(context, databaseName, null, DATABASE_VERSION);
+        super(context, databaseName, null, DATABASE_VERSION, MINIMUM_SUPPORTED_VERSION, null);
         boolean enableWal = android.provider.Settings.Global.getInt(context.getContentResolver(),
                 android.provider.Settings.Global.CONTACTS_DATABASE_WAL_ENABLED, 1) == 1;
         setWriteAheadLoggingEnabled(enableWal);
@@ -1070,6 +1005,12 @@
     }
 
     @Override
+    public void onBeforeDelete(SQLiteDatabase db) {
+        Log.w(TAG, "Database version " + db.getVersion() + " for " + DATABASE_NAME
+                + " is no longer supported. Data will be lost on upgrading to " + DATABASE_VERSION);
+    }
+
+    @Override
     public void onOpen(SQLiteDatabase db) {
         Log.d(TAG, "WAL enabled for " + getDatabaseName() + ": " + db.isWriteAheadLoggingEnabled());
         prepopulateCommonMimeTypes(db);
@@ -1163,7 +1104,7 @@
 
     @Override
     public void onCreate(SQLiteDatabase db) {
-        Log.i(TAG, "Bootstrapping database version: " + DATABASE_VERSION);
+        Log.i(TAG, "Bootstrapping database " + DATABASE_NAME + " version: " + DATABASE_VERSION);
 
         mSyncState.createDatabase(db);
 
@@ -1795,6 +1736,7 @@
         db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.STREAM_ITEMS + ";");
+        db.execSQL("DROP VIEW IF EXISTS " + Views.METADATA_SYNC_STATE + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.METADATA_SYNC + ";");
 
         String dataColumns =
@@ -2244,33 +2186,8 @@
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-        if (oldVersion < 99) {
-            Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion
-                    + ", data will be lost!");
-
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.RAW_CONTACTS + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.PACKAGES + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.MIMETYPES + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.DATA + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.PHONE_LOOKUP + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.NAME_LOOKUP + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.NICKNAME_LOOKUP + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.GROUPS + ";");
-            db.execSQL("DROP TABLE IF EXISTS activities;");
-            db.execSQL("DROP TABLE IF EXISTS calls;");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.SETTINGS + ";");
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.STATUS_UPDATES + ";");
-
-            // TODO: we should not be dropping agg_exceptions and contact_options. In case that
-            // table's schema changes, we should try to preserve the data, because it was entered
-            // by the user and has never been synched to the server.
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.AGGREGATION_EXCEPTIONS + ";");
-            onCreate(db);
-            return;
-        }
-
-        Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion);
+        Log.i(TAG,
+                "Upgrading " + DATABASE_NAME + " from version " + oldVersion + " to " + newVersion);
 
         prepopulateCommonMimeTypes(db);
 
@@ -2282,428 +2199,6 @@
         boolean rebuildSqliteStats = false;
         boolean upgradeLocaleSpecificData = false;
 
-        if (oldVersion == 99) {
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 100) {
-            db.execSQL("CREATE INDEX IF NOT EXISTS mimetypes_mimetype_index ON "
-                    + Tables.MIMETYPES + " ("
-                            + MimetypesColumns.MIMETYPE + ","
-                            + MimetypesColumns._ID + ");");
-            updateIndexStats(db, Tables.MIMETYPES,
-                    "mimetypes_mimetype_index", "50 1 1");
-
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 101) {
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 102) {
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 103) {
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 104 || oldVersion == 201) {
-            LegacyApiSupport.createSettingsTable(db);
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 105) {
-            upgradeToVersion202(db);
-            upgradeNameLookup = true;
-            oldVersion = 202;
-        }
-
-        if (oldVersion == 202) {
-            upgradeToVersion203(db);
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 203) {
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 204) {
-            upgradeToVersion205(db);
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 205) {
-            upgradeToVersion206(db);
-            upgradeViewsAndTriggers = true;
-            oldVersion++;
-        }
-
-        if (oldVersion == 206) {
-            // Fix for the bug where name lookup records for organizations would get removed by
-            // unrelated updates of the data rows. No longer needed.
-            oldVersion = 300;
-        }
-
-        if (oldVersion == 300) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 301;
-        }
-
-        if (oldVersion == 301) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 302;
-        }
-
-        if (oldVersion == 302) {
-            upgradeEmailToVersion303(db);
-            upgradeNicknameToVersion303(db);
-            oldVersion = 303;
-        }
-
-        if (oldVersion == 303) {
-            upgradeToVersion304(db);
-            oldVersion = 304;
-        }
-
-        if (oldVersion == 304) {
-            upgradeNameLookup = true;
-            oldVersion = 305;
-        }
-
-        if (oldVersion == 305) {
-            upgradeToVersion306(db);
-            oldVersion = 306;
-        }
-
-        if (oldVersion == 306) {
-            upgradeToVersion307(db);
-            oldVersion = 307;
-        }
-
-        if (oldVersion == 307) {
-            upgradeToVersion308(db);
-            oldVersion = 308;
-        }
-
-        // Gingerbread upgrades.
-        if (oldVersion < 350) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 351;
-        }
-
-        if (oldVersion == 351) {
-            upgradeNameLookup = true;
-            oldVersion = 352;
-        }
-
-        if (oldVersion == 352) {
-            upgradeToVersion353(db);
-            oldVersion = 353;
-        }
-
-        // Honeycomb upgrades.
-        if (oldVersion < 400) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion400(db);
-            oldVersion = 400;
-        }
-
-        if (oldVersion == 400) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion401(db);
-            oldVersion = 401;
-        }
-
-        if (oldVersion == 401) {
-            upgradeToVersion402(db);
-            oldVersion = 402;
-        }
-
-        if (oldVersion == 402) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion403(db);
-            oldVersion = 403;
-        }
-
-        if (oldVersion == 403) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 404;
-        }
-
-        if (oldVersion == 404) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion405(db);
-            oldVersion = 405;
-        }
-
-        if (oldVersion == 405) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion406(db);
-            oldVersion = 406;
-        }
-
-        if (oldVersion == 406) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 407;
-        }
-
-        if (oldVersion == 407) {
-            oldVersion = 408;  // Obsolete.
-        }
-
-        if (oldVersion == 408) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion409(db);
-            oldVersion = 409;
-        }
-
-        if (oldVersion == 409) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 410;
-        }
-
-        if (oldVersion == 410) {
-            upgradeToVersion411(db);
-            oldVersion = 411;
-        }
-
-        if (oldVersion == 411) {
-            // Same upgrade as 353, only on Honeycomb devices.
-            upgradeToVersion353(db);
-            oldVersion = 412;
-        }
-
-        if (oldVersion == 412) {
-            upgradeToVersion413(db);
-            oldVersion = 413;
-        }
-
-        if (oldVersion == 413) {
-            upgradeNameLookup = true;
-            oldVersion = 414;
-        }
-
-        if (oldVersion == 414) {
-            upgradeToVersion415(db);
-            upgradeViewsAndTriggers = true;
-            oldVersion = 415;
-        }
-
-        if (oldVersion == 415) {
-            upgradeToVersion416(db);
-            oldVersion = 416;
-        }
-
-        if (oldVersion == 416) {
-            upgradeLegacyApiSupport = true;
-            oldVersion = 417;
-        }
-
-        // Honeycomb-MR1 upgrades.
-        if (oldVersion < 500) {
-            upgradeSearchIndex = true;
-        }
-
-        if (oldVersion < 501) {
-            upgradeSearchIndex = true;
-            upgradeToVersion501(db);
-            oldVersion = 501;
-        }
-
-        if (oldVersion < 502) {
-            upgradeSearchIndex = true;
-            upgradeToVersion502(db);
-            oldVersion = 502;
-        }
-
-        if (oldVersion < 503) {
-            upgradeSearchIndex = true;
-            oldVersion = 503;
-        }
-
-        if (oldVersion < 504) {
-            upgradeToVersion504(db);
-            oldVersion = 504;
-        }
-
-        if (oldVersion < 600) {
-            // This change used to add the profile raw contact ID to the Accounts table.  That
-            // column is no longer needed (as of version 614) since the profile records are stored in
-            // a separate copy of the database for security reasons.  So this change is now a no-op.
-            upgradeViewsAndTriggers = true;
-            oldVersion = 600;
-        }
-
-        if (oldVersion < 601) {
-            upgradeToVersion601(db);
-            oldVersion = 601;
-        }
-
-        if (oldVersion < 602) {
-            upgradeToVersion602(db);
-            oldVersion = 602;
-        }
-
-        if (oldVersion < 603) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 603;
-        }
-
-        if (oldVersion < 604) {
-            upgradeToVersion604(db);
-            oldVersion = 604;
-        }
-
-        if (oldVersion < 605) {
-            upgradeViewsAndTriggers = true;
-            // This version used to create the stream item and stream item photos tables, but
-            // a newer version of those tables is created in version 609 below. So omitting the
-            // creation in this upgrade step to avoid a create->drop->create.
-            oldVersion = 605;
-        }
-
-        if (oldVersion < 606) {
-            upgradeViewsAndTriggers = true;
-            upgradeLegacyApiSupport = true;
-            upgradeToVersion606(db);
-            oldVersion = 606;
-        }
-
-        if (oldVersion < 607) {
-            upgradeViewsAndTriggers = true;
-            // We added "action" and "action_uri" to groups here, but realized this was not a smart
-            // move. This upgrade step has been removed (all dogfood phones that executed this step
-            // will have those columns, but that shouldn't hurt. Unfortunately, SQLite makes it
-            // hard to remove columns).
-            oldVersion = 607;
-        }
-
-        if (oldVersion < 608) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion608(db);
-            oldVersion = 608;
-        }
-
-        if (oldVersion < 609) {
-            // This version used to create the stream item and stream item photos tables, but a
-            // newer version of those tables is created in version 613 below.  So omitting the
-            // creation in this upgrade step to avoid a create->drop->create.
-            oldVersion = 609;
-        }
-
-        if (oldVersion < 610) {
-            upgradeToVersion610(db);
-            oldVersion = 610;
-        }
-
-        if (oldVersion < 611) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion611(db);
-            oldVersion = 611;
-        }
-
-        if (oldVersion < 612) {
-            upgradeViewsAndTriggers = true;
-            upgradeToVersion612(db);
-            oldVersion = 612;
-        }
-
-        if (oldVersion < 613) {
-            upgradeToVersion613(db);
-            oldVersion = 613;
-        }
-
-        if (oldVersion < 614) {
-            // This creates the "view_stream_items" view.
-            upgradeViewsAndTriggers = true;
-            oldVersion = 614;
-        }
-
-        if (oldVersion < 615) {
-            upgradeToVersion615(db);
-            oldVersion = 615;
-        }
-
-        if (oldVersion < 616) {
-            // This updates the "view_stream_items" view.
-            upgradeViewsAndTriggers = true;
-            oldVersion = 616;
-        }
-
-        if (oldVersion < 617) {
-            // This version upgrade obsoleted the profile_raw_contact_id field of the Accounts
-            // table, but we aren't removing the column because it is very little data (and not
-            // referenced anymore).  We do need to upgrade the views to handle the simplified
-            // per-database "is profile" columns.
-            upgradeViewsAndTriggers = true;
-            oldVersion = 617;
-        }
-
-        if (oldVersion < 618) {
-            upgradeToVersion618(db);
-            oldVersion = 618;
-        }
-
-        if (oldVersion < 619) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 619;
-        }
-
-        if (oldVersion < 620) {
-            upgradeViewsAndTriggers = true;
-            oldVersion = 620;
-        }
-
-        if (oldVersion < 621) {
-            upgradeSearchIndex = true;
-            oldVersion = 621;
-        }
-
-        if (oldVersion < 622) {
-            upgradeToVersion622(db);
-            oldVersion = 622;
-        }
-
-        if (oldVersion < 623) {
-            // Change FTS to normalize names using collation key.
-            upgradeSearchIndex = true;
-            oldVersion = 623;
-        }
-
-        if (oldVersion < 624) {
-            // Upgraded the SQLite index stats.
-            upgradeViewsAndTriggers = true;
-            oldVersion = 624;
-        }
-
-        if (oldVersion < 625) {
-            // Fix for search for hyphenated names
-            upgradeSearchIndex = true;
-            oldVersion = 625;
-        }
-
-        if (oldVersion < 626) {
-            upgradeToVersion626(db);
-            upgradeViewsAndTriggers = true;
-            oldVersion = 626;
-        }
-
-        if (oldVersion < 700) {
-            rescanDirectories = true;
-            oldVersion = 700;
-        }
-
         if (oldVersion < 701) {
             upgradeToVersion701(db);
             oldVersion = 701;
@@ -3017,471 +2512,6 @@
         return oldVersion < version && newVersion >= version;
     }
 
-    private void upgradeToVersion202(SQLiteDatabase db) {
-        db.execSQL(
-                "ALTER TABLE " + Tables.PHONE_LOOKUP +
-                " ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;");
-
-        db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" +
-                PhoneLookupColumns.MIN_MATCH + "," +
-                PhoneLookupColumns.RAW_CONTACT_ID + "," +
-                PhoneLookupColumns.DATA_ID +
-        ");");
-
-        updateIndexStats(db, Tables.PHONE_LOOKUP,
-                "phone_lookup_min_match_index", "10000 2 2 1");
-
-        final SQLiteStatement update = db.compileStatement(
-                "UPDATE " + Tables.PHONE_LOOKUP +
-                " SET " + PhoneLookupColumns.MIN_MATCH + "=?" +
-                " WHERE " + PhoneLookupColumns.DATA_ID + "=?");
-
-        // Populate the new column
-        Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " + Tables.DATA +
-                " ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")",
-                new String[] {Data._ID, Phone.NUMBER}, null, null, null, null, null);
-        try {
-            while (c.moveToNext()) {
-                long dataId = c.getLong(0);
-                String number = c.getString(1);
-                if (!TextUtils.isEmpty(number)) {
-                    update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number));
-                    update.bindLong(2, dataId);
-                    update.execute();
-                }
-            }
-        } finally {
-            c.close();
-        }
-    }
-
-    private void upgradeToVersion203(SQLiteDatabase db) {
-        // Garbage-collect first. A bug in Eclair was sometimes leaving
-        // raw_contacts in the database that no longer had contacts associated
-        // with them.  To avoid failures during this database upgrade, drop
-        // the orphaned raw_contacts.
-        db.execSQL(
-                "DELETE FROM raw_contacts" +
-                " WHERE contact_id NOT NULL" +
-                " AND contact_id NOT IN (SELECT _id FROM contacts)");
-
-        db.execSQL(
-                "ALTER TABLE " + Tables.CONTACTS +
-                " ADD " + Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)");
-        db.execSQL(
-                "ALTER TABLE " + Tables.RAW_CONTACTS +
-                " ADD contact_in_visible_group INTEGER NOT NULL DEFAULT 0");
-
-        // For each Contact, find the RawContact that contributed the display name
-        db.execSQL(
-                "UPDATE " + Tables.CONTACTS +
-                        " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" +
-                        " SELECT " + RawContacts._ID +
-                        " FROM " + Tables.RAW_CONTACTS +
-                        " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID +
-                        " AND " + RawContactsColumns.CONCRETE_DISPLAY_NAME + "=" +
-                        Tables.CONTACTS + "." + Contacts.DISPLAY_NAME +
-                        " ORDER BY " + RawContacts._ID +
-                        " LIMIT 1)"
-        );
-
-        db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" +
-                Contacts.NAME_RAW_CONTACT_ID +
-        ");");
-
-        // If for some unknown reason we missed some names, let's make sure there are
-        // no contacts without a name, picking a raw contact "at random".
-        db.execSQL(
-                "UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" +
-                        " SELECT " + RawContacts._ID +
-                        " FROM " + Tables.RAW_CONTACTS +
-                        " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID +
-                        " ORDER BY " + RawContacts._ID +
-                        " LIMIT 1)" +
-                " WHERE " + Contacts.NAME_RAW_CONTACT_ID + " IS NULL"
-        );
-
-        // Wipe out DISPLAY_NAME on the Contacts table as it is no longer in use.
-        db.execSQL(
-                "UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.DISPLAY_NAME + "=NULL"
-        );
-
-        // Copy the IN_VISIBLE_GROUP flag down to all raw contacts to allow
-        // indexing on (display_name, in_visible_group)
-        db.execSQL(
-                "UPDATE " + Tables.RAW_CONTACTS +
-                " SET contact_in_visible_group=(" +
-                        "SELECT " + Contacts.IN_VISIBLE_GROUP +
-                        " FROM " + Tables.CONTACTS +
-                        " WHERE " + Contacts._ID + "=" + RawContacts.CONTACT_ID + ")" +
-                " WHERE " + RawContacts.CONTACT_ID + " NOT NULL"
-        );
-
-        db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" +
-                "contact_in_visible_group" + "," +
-                RawContactsColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC" +
-        ");");
-
-        db.execSQL("DROP INDEX contacts_visible_index");
-        db.execSQL("CREATE INDEX contacts_visible_index ON " + Tables.CONTACTS + " (" +
-                Contacts.IN_VISIBLE_GROUP +
-        ");");
-    }
-
-    private void upgradeToVersion205(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS
-                + " ADD " + RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT;");
-        db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS
-                + " ADD " + RawContacts.PHONETIC_NAME + " TEXT;");
-        db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS
-                + " ADD " + RawContacts.PHONETIC_NAME_STYLE + " INTEGER;");
-        db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS
-                + " ADD " + RawContacts.SORT_KEY_PRIMARY
-                + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";");
-        db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS
-                + " ADD " + RawContacts.SORT_KEY_ALTERNATIVE
-                + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";");
-
-        NameSplitter splitter = createNameSplitter();
-
-        final SQLiteStatement rawContactUpdate = db.compileStatement(
-                "UPDATE " + Tables.RAW_CONTACTS +
-                " SET " +
-                        RawContacts.DISPLAY_NAME_PRIMARY + "=?," +
-                        RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," +
-                        RawContacts.PHONETIC_NAME + "=?," +
-                        RawContacts.PHONETIC_NAME_STYLE + "=?," +
-                        RawContacts.SORT_KEY_PRIMARY + "=?," +
-                        RawContacts.SORT_KEY_ALTERNATIVE + "=?" +
-                " WHERE " + RawContacts._ID + "=?");
-
-        upgradeStructuredNamesToVersion205(db, rawContactUpdate, splitter);
-        upgradeOrganizationsToVersion205(db, rawContactUpdate, splitter);
-
-        db.execSQL("DROP INDEX raw_contact_sort_key1_index");
-        db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" +
-                "contact_in_visible_group" + "," +
-                RawContacts.SORT_KEY_PRIMARY +
-        ");");
-
-        db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" +
-                "contact_in_visible_group" + "," +
-                RawContacts.SORT_KEY_ALTERNATIVE +
-        ");");
-    }
-
-    private void upgradeStructuredNamesToVersion205(
-            SQLiteDatabase db, SQLiteStatement rawContactUpdate, NameSplitter splitter) {
-
-        // Process structured names to detect the style of the full name and phonetic name.
-        long mMimeType;
-        try {
-            mMimeType = DatabaseUtils.longForQuery(db,
-                    "SELECT " + MimetypesColumns._ID +
-                    " FROM " + Tables.MIMETYPES +
-                    " WHERE " + MimetypesColumns.MIMETYPE
-                            + "='" + StructuredName.CONTENT_ITEM_TYPE + "'", null);
-
-        } catch (SQLiteDoneException e) {
-            // No structured names in the database.
-            return;
-        }
-
-        final SQLiteStatement structuredNameUpdate = db.compileStatement(
-                "UPDATE " + Tables.DATA +
-                        " SET " +
-                        StructuredName.FULL_NAME_STYLE + "=?," +
-                        StructuredName.DISPLAY_NAME + "=?," +
-                        StructuredName.PHONETIC_NAME_STYLE + "=?" +
-                        " WHERE " + Data._ID + "=?");
-
-        NameSplitter.Name name = new NameSplitter.Name();
-        Cursor cursor = db.query(StructName205Query.TABLE,
-                StructName205Query.COLUMNS,
-                DataColumns.MIMETYPE_ID + "=" + mMimeType, null, null, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long dataId = cursor.getLong(StructName205Query.ID);
-                long rawContactId = cursor.getLong(StructName205Query.RAW_CONTACT_ID);
-                int displayNameSource = cursor.getInt(StructName205Query.DISPLAY_NAME_SOURCE);
-
-                name.clear();
-                name.prefix = cursor.getString(StructName205Query.PREFIX);
-                name.givenNames = cursor.getString(StructName205Query.GIVEN_NAME);
-                name.middleName = cursor.getString(StructName205Query.MIDDLE_NAME);
-                name.familyName = cursor.getString(StructName205Query.FAMILY_NAME);
-                name.suffix = cursor.getString(StructName205Query.SUFFIX);
-                name.phoneticFamilyName = cursor.getString(StructName205Query.PHONETIC_FAMILY_NAME);
-                name.phoneticMiddleName = cursor.getString(StructName205Query.PHONETIC_MIDDLE_NAME);
-                name.phoneticGivenName = cursor.getString(StructName205Query.PHONETIC_GIVEN_NAME);
-
-                upgradeNameToVersion205(dataId, rawContactId, displayNameSource, name,
-                        structuredNameUpdate, rawContactUpdate, splitter);
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private void upgradeNameToVersion205(
-            long dataId,
-            long rawContactId,
-            int displayNameSource,
-            NameSplitter.Name name,
-            SQLiteStatement structuredNameUpdate,
-            SQLiteStatement rawContactUpdate,
-            NameSplitter splitter) {
-
-        splitter.guessNameStyle(name);
-        int unadjustedFullNameStyle = name.fullNameStyle;
-        name.fullNameStyle = splitter.getAdjustedFullNameStyle(name.fullNameStyle);
-        String displayName = splitter.join(name, true, true);
-
-        // Don't update database with the adjusted fullNameStyle as it is locale
-        // related
-        structuredNameUpdate.bindLong(1, unadjustedFullNameStyle);
-        DatabaseUtils.bindObjectToProgram(structuredNameUpdate, 2, displayName);
-        structuredNameUpdate.bindLong(3, name.phoneticNameStyle);
-        structuredNameUpdate.bindLong(4, dataId);
-        structuredNameUpdate.execute();
-
-        if (displayNameSource == DisplayNameSources.STRUCTURED_NAME) {
-            String displayNameAlternative = splitter.join(name, false, false);
-            String phoneticName = splitter.joinPhoneticName(name);
-            String sortKey = null;
-            String sortKeyAlternative = null;
-
-            if (phoneticName != null) {
-                sortKey = sortKeyAlternative = phoneticName;
-            } else if (name.fullNameStyle == FullNameStyle.CHINESE ||
-                    name.fullNameStyle == FullNameStyle.CJK) {
-                sortKey = sortKeyAlternative = displayName;
-            }
-
-            if (sortKey == null) {
-                sortKey = displayName;
-                sortKeyAlternative = displayNameAlternative;
-            }
-
-            updateRawContact205(rawContactUpdate, rawContactId, displayName,
-                    displayNameAlternative, name.phoneticNameStyle, phoneticName, sortKey,
-                    sortKeyAlternative);
-        }
-    }
-
-    private void upgradeOrganizationsToVersion205(
-            SQLiteDatabase db, SQLiteStatement rawContactUpdate, NameSplitter splitter) {
-
-        final long mimeType = lookupMimeTypeId(db, Organization.CONTENT_ITEM_TYPE);
-        final SQLiteStatement organizationUpdate = db.compileStatement(
-                "UPDATE " + Tables.DATA +
-                " SET " +
-                        Organization.PHONETIC_NAME_STYLE + "=?" +
-                " WHERE " + Data._ID + "=?");
-
-        Cursor cursor = db.query(Organization205Query.TABLE, Organization205Query.COLUMNS,
-                DataColumns.MIMETYPE_ID + "=" + mimeType + " AND "
-                        + RawContacts.DISPLAY_NAME_SOURCE + "=" + DisplayNameSources.ORGANIZATION,
-                null, null, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long dataId = cursor.getLong(Organization205Query.ID);
-                long rawContactId = cursor.getLong(Organization205Query.RAW_CONTACT_ID);
-                String company = cursor.getString(Organization205Query.COMPANY);
-                String phoneticName = cursor.getString(Organization205Query.PHONETIC_NAME);
-
-                int phoneticNameStyle = splitter.guessPhoneticNameStyle(phoneticName);
-
-                organizationUpdate.bindLong(1, phoneticNameStyle);
-                organizationUpdate.bindLong(2, dataId);
-                organizationUpdate.execute();
-
-                String sortKey = company;
-
-                updateRawContact205(rawContactUpdate, rawContactId, company,
-                        company, phoneticNameStyle, phoneticName, sortKey, sortKey);
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private void updateRawContact205(SQLiteStatement rawContactUpdate, long rawContactId,
-            String displayName, String displayNameAlternative, int phoneticNameStyle,
-            String phoneticName, String sortKeyPrimary, String sortKeyAlternative) {
-        bindString(rawContactUpdate, 1, displayName);
-        bindString(rawContactUpdate, 2, displayNameAlternative);
-        bindString(rawContactUpdate, 3, phoneticName);
-        rawContactUpdate.bindLong(4, phoneticNameStyle);
-        bindString(rawContactUpdate, 5, sortKeyPrimary);
-        bindString(rawContactUpdate, 6, sortKeyAlternative);
-        rawContactUpdate.bindLong(7, rawContactId);
-        rawContactUpdate.execute();
-    }
-
-    private void upgradeToVersion206(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS
-                + " ADD name_verified INTEGER NOT NULL DEFAULT 0;");
-    }
-
-    /**
-     * The {@link ContactsProvider2#update} method was deleting name lookup for new
-     * emails during the sync.  We need to restore the lost name lookup rows.
-     */
-    private void upgradeEmailToVersion303(SQLiteDatabase db) {
-        final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE);
-        if (mimeTypeId == -1) {
-            return;
-        }
-
-        ContentValues values = new ContentValues();
-
-        // Find all data rows with the mime type "email" that are missing name lookup
-        Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS,
-                Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)},
-                null, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long dataId = cursor.getLong(Upgrade303Query.ID);
-                long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID);
-                String value = cursor.getString(Upgrade303Query.DATA1);
-                value = extractHandleFromEmailAddress(value);
-
-                if (value != null) {
-                    values.put(NameLookupColumns.DATA_ID, dataId);
-                    values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId);
-                    values.put(NameLookupColumns.NAME_TYPE, NameLookupType.EMAIL_BASED_NICKNAME);
-                    values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value));
-                    db.insert(Tables.NAME_LOOKUP, null, values);
-                }
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    /**
-     * The {@link ContactsProvider2#update} method was deleting name lookup for new
-     * nicknames during the sync.  We need to restore the lost name lookup rows.
-     */
-    private void upgradeNicknameToVersion303(SQLiteDatabase db) {
-        final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE);
-        if (mimeTypeId == -1) {
-            return;
-        }
-
-        ContentValues values = new ContentValues();
-
-        // Find all data rows with the mime type "nickname" that are missing name lookup
-        Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS,
-                Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)},
-                null, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long dataId = cursor.getLong(Upgrade303Query.ID);
-                long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID);
-                String value = cursor.getString(Upgrade303Query.DATA1);
-
-                values.put(NameLookupColumns.DATA_ID, dataId);
-                values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId);
-                values.put(NameLookupColumns.NAME_TYPE, NameLookupType.NICKNAME);
-                values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value));
-                db.insert(Tables.NAME_LOOKUP, null, values);
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private void upgradeToVersion304(SQLiteDatabase db) {
-        // Mimetype table requires an index on mime type.
-        db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS mime_type ON " + Tables.MIMETYPES + " (" +
-                MimetypesColumns.MIMETYPE +
-        ");");
-    }
-
-    private void upgradeToVersion306(SQLiteDatabase db) {
-        // Fix invalid lookup that was used for Exchange contacts (it was not escaped)
-        // It happened when a new contact was created AND synchronized
-        final StringBuilder lookupKeyBuilder = new StringBuilder();
-        final SQLiteStatement updateStatement = db.compileStatement(
-                "UPDATE contacts " +
-                "SET lookup=? " +
-                "WHERE _id=?");
-        final Cursor contactIdCursor = db.rawQuery(
-                "SELECT DISTINCT contact_id " +
-                "FROM raw_contacts " +
-                "WHERE deleted=0 AND account_type='com.android.exchange'",
-                null);
-        try {
-            while (contactIdCursor.moveToNext()) {
-                final long contactId = contactIdCursor.getLong(0);
-                lookupKeyBuilder.setLength(0);
-                final Cursor c = db.rawQuery(
-                        "SELECT account_type, account_name, _id, sourceid, display_name " +
-                        "FROM raw_contacts " +
-                        "WHERE contact_id=? " +
-                        "ORDER BY _id",
-                        new String[] {String.valueOf(contactId)});
-                try {
-                    while (c.moveToNext()) {
-                        ContactLookupKey.appendToLookupKey(lookupKeyBuilder,
-                                c.getString(0),
-                                c.getString(1),
-                                c.getLong(2),
-                                c.getString(3),
-                                c.getString(4));
-                    }
-                } finally {
-                    c.close();
-                }
-
-                if (lookupKeyBuilder.length() == 0) {
-                    updateStatement.bindNull(1);
-                } else {
-                    updateStatement.bindString(1, Uri.encode(lookupKeyBuilder.toString()));
-                }
-                updateStatement.bindLong(2, contactId);
-
-                updateStatement.execute();
-            }
-        } finally {
-            updateStatement.close();
-            contactIdCursor.close();
-        }
-    }
-
-    private void upgradeToVersion307(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE properties (" +
-                "property_key TEXT PRIMARY_KEY, " +
-                "property_value TEXT" +
-        ");");
-    }
-
-    private void upgradeToVersion308(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE accounts (" +
-                "account_name TEXT, " +
-                "account_type TEXT " +
-        ");");
-
-        db.execSQL("INSERT INTO accounts " +
-                "SELECT DISTINCT account_name, account_type FROM raw_contacts");
-    }
-
-    private void upgradeToVersion400(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE " + Tables.GROUPS
-                + " ADD " + Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0;");
-        db.execSQL("ALTER TABLE " + Tables.GROUPS
-                + " ADD " + Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0;");
-    }
-
-    private void upgradeToVersion353(SQLiteDatabase db) {
-        db.execSQL("DELETE FROM contacts " +
-                "WHERE NOT EXISTS (SELECT 1 FROM raw_contacts WHERE contact_id=contacts._id)");
-    }
-
     private void rebuildNameLookup(SQLiteDatabase db, boolean rebuildSqliteStats) {
         db.execSQL("DROP INDEX IF EXISTS name_lookup_index");
         insertNameLookup(db);
@@ -3699,443 +2729,6 @@
         stmt.executeInsert();
     }
 
-    /**
-     * Changing the VISIBLE bit from a field on both RawContacts and Contacts to a separate table.
-     */
-    private void upgradeToVersion401(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" +
-                Contacts._ID + " INTEGER PRIMARY KEY" +
-                ");");
-        db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS +
-                " SELECT " + Contacts._ID +
-                " FROM " + Tables.CONTACTS +
-                " WHERE " + Contacts.IN_VISIBLE_GROUP + "!=0");
-        db.execSQL("DROP INDEX contacts_visible_index");
-    }
-
-    /**
-     * Introducing a new table: directories.
-     */
-    private void upgradeToVersion402(SQLiteDatabase db) {
-        createDirectoriesTable(db);
-    }
-
-    private void upgradeToVersion403(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS directories;");
-        createDirectoriesTable(db);
-
-        db.execSQL("ALTER TABLE raw_contacts"
-                + " ADD raw_contact_is_read_only INTEGER NOT NULL DEFAULT 0;");
-
-        db.execSQL("ALTER TABLE data"
-                + " ADD is_read_only INTEGER NOT NULL DEFAULT 0;");
-    }
-
-    private void upgradeToVersion405(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS phone_lookup;");
-        // Private phone numbers table used for lookup
-        db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" +
-                PhoneLookupColumns.DATA_ID
-                + " INTEGER REFERENCES data(_id) NOT NULL," +
-                PhoneLookupColumns.RAW_CONTACT_ID
-                + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," +
-                PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," +
-                PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" +
-        ");");
-
-        db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" +
-                PhoneLookupColumns.NORMALIZED_NUMBER + "," +
-                PhoneLookupColumns.RAW_CONTACT_ID + "," +
-                PhoneLookupColumns.DATA_ID +
-        ");");
-
-        db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" +
-                PhoneLookupColumns.MIN_MATCH + "," +
-                PhoneLookupColumns.RAW_CONTACT_ID + "," +
-                PhoneLookupColumns.DATA_ID +
-        ");");
-
-        final long mimeTypeId = lookupMimeTypeId(db, Phone.CONTENT_ITEM_TYPE);
-        if (mimeTypeId == -1) {
-            return;
-        }
-
-        Cursor cursor = db.rawQuery(
-                    "SELECT _id, " + Phone.RAW_CONTACT_ID + ", " + Phone.NUMBER +
-                    " FROM " + Tables.DATA +
-                    " WHERE " + DataColumns.MIMETYPE_ID + "=" + mimeTypeId
-                            + " AND " + Phone.NUMBER + " NOT NULL", null);
-
-        ContentValues phoneValues = new ContentValues();
-        try {
-            while (cursor.moveToNext()) {
-                long dataID = cursor.getLong(0);
-                long rawContactID = cursor.getLong(1);
-                String number = cursor.getString(2);
-                String normalizedNumber = PhoneNumberUtils.normalizeNumber(number);
-                if (!TextUtils.isEmpty(normalizedNumber)) {
-                    phoneValues.clear();
-                    phoneValues.put(PhoneLookupColumns.RAW_CONTACT_ID, rawContactID);
-                    phoneValues.put(PhoneLookupColumns.DATA_ID, dataID);
-                    phoneValues.put(PhoneLookupColumns.NORMALIZED_NUMBER, normalizedNumber);
-                    phoneValues.put(PhoneLookupColumns.MIN_MATCH,
-                            PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber));
-                    db.insert(Tables.PHONE_LOOKUP, null, phoneValues);
-                }
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private void upgradeToVersion406(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE calls ADD countryiso TEXT;");
-    }
-
-    private void upgradeToVersion409(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS directories;");
-        createDirectoriesTable(db);
-    }
-
-    /**
-     * Adding DEFAULT_DIRECTORY table.
-     * DEFAULT_DIRECTORY should contain every contact which should be shown to users in default.
-     * - if a contact doesn't belong to any account (local contact), it should be in
-     *   default_directory
-     * - if a contact belongs to an account that doesn't have a "default" group, it should be in
-     *   default_directory
-     * - if a contact belongs to an account that has a "default" group (like Google directory,
-     *   which has "My contacts" group as default), it should be in default_directory.
-     *
-     * This logic assumes that accounts with the "default" group should have at least one
-     * group with AUTO_ADD (implying it is the default group) flag in the groups table.
-     */
-    private void upgradeToVersion411(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS " + Tables.DEFAULT_DIRECTORY);
-        db.execSQL("CREATE TABLE default_directory (_id INTEGER PRIMARY KEY);");
-
-        // Process contacts without an account
-        db.execSQL("INSERT OR IGNORE INTO default_directory " +
-                " SELECT contact_id " +
-                " FROM raw_contacts " +
-                " WHERE raw_contacts.account_name IS NULL " +
-                "   AND raw_contacts.account_type IS NULL ");
-
-        // Process accounts that don't have a default group (e.g. Exchange).
-        db.execSQL("INSERT OR IGNORE INTO default_directory " +
-                " SELECT contact_id " +
-                " FROM raw_contacts " +
-                " WHERE NOT EXISTS" +
-                " (SELECT _id " +
-                "  FROM groups " +
-                "  WHERE raw_contacts.account_name = groups.account_name" +
-                "    AND raw_contacts.account_type = groups.account_type" +
-                "    AND groups.auto_add != 0)");
-
-        final long mimetype = lookupMimeTypeId(db, GroupMembership.CONTENT_ITEM_TYPE);
-
-        // Process accounts that do have a default group (e.g. Google)
-        db.execSQL("INSERT OR IGNORE INTO default_directory " +
-                " SELECT contact_id " +
-                " FROM raw_contacts " +
-                " JOIN data " +
-                "   ON (raw_contacts._id=raw_contact_id)" +
-                " WHERE mimetype_id=" + mimetype +
-                " AND EXISTS" +
-                " (SELECT _id" +
-                "  FROM groups" +
-                "  WHERE raw_contacts.account_name = groups.account_name" +
-                "    AND raw_contacts.account_type = groups.account_type" +
-                "    AND groups.auto_add != 0)");
-    }
-
-    private void upgradeToVersion413(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS directories;");
-        createDirectoriesTable(db);
-    }
-
-    private void upgradeToVersion415(SQLiteDatabase db) {
-        db.execSQL(
-                "ALTER TABLE " + Tables.GROUPS +
-                " ADD " + Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0");
-        db.execSQL(
-                "UPDATE " + Tables.GROUPS +
-                        "   SET " + Groups.GROUP_IS_READ_ONLY + "=1" +
-                        " WHERE " + Groups.SYSTEM_ID + " NOT NULL");
-    }
-
-    private void upgradeToVersion416(SQLiteDatabase db) {
-        db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP +
-                " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");");
-    }
-
-    private void upgradeToVersion501(SQLiteDatabase db) {
-        // Remove organization rows from the name lookup, we now use search index for that
-        db.execSQL("DELETE FROM name_lookup WHERE name_type=5");
-    }
-
-    private void upgradeToVersion502(SQLiteDatabase db) {
-        // Remove Chinese and Korean name lookup - this data is now in the search index
-        db.execSQL("DELETE FROM name_lookup WHERE name_type IN (6, 7)");
-    }
-
-    private void upgradeToVersion504(SQLiteDatabase db) {
-        // Find all names with prefixes and recreate display name
-        Cursor cursor = db.rawQuery(
-                "SELECT " + StructuredName.RAW_CONTACT_ID +
-                " FROM " + Tables.DATA +
-                " WHERE " + DataColumns.MIMETYPE_ID + "=?"
-                        + " AND " + StructuredName.PREFIX + " NOT NULL",
-                new String[] {
-                        String.valueOf(
-                                mCommonMimeTypeIdsCache.get(StructuredName.CONTENT_ITEM_TYPE))
-                });
-
-        try {
-            while(cursor.moveToNext()) {
-                long rawContactId = cursor.getLong(0);
-                updateRawContactDisplayName(db, rawContactId);
-            }
-
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private void upgradeToVersion601(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE data_usage_stat(" +
-                "stat_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
-                "data_id INTEGER NOT NULL, " +
-                "usage_type INTEGER NOT NULL DEFAULT 0, " +
-                "times_used INTEGER NOT NULL DEFAULT 0, " +
-                "last_time_used INTEGER NOT NULL DEFAULT 0, " +
-                "FOREIGN KEY(data_id) REFERENCES data(_id));");
-        db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " +
-                "data_usage_stat (data_id, usage_type)");
-    }
-
-    private void upgradeToVersion602(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE calls ADD voicemail_uri TEXT;");
-        db.execSQL("ALTER TABLE calls ADD _data TEXT;");
-        db.execSQL("ALTER TABLE calls ADD has_content INTEGER;");
-        db.execSQL("ALTER TABLE calls ADD mime_type TEXT;");
-        db.execSQL("ALTER TABLE calls ADD source_data TEXT;");
-        db.execSQL("ALTER TABLE calls ADD source_package TEXT;");
-        db.execSQL("ALTER TABLE calls ADD state INTEGER;");
-    }
-
-    private void upgradeToVersion604(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE voicemail_status (" +
-                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
-                "source_package TEXT UNIQUE NOT NULL," +
-                "settings_uri TEXT," +
-                "voicemail_access_uri TEXT," +
-                "configuration_state INTEGER," +
-                "data_channel_state INTEGER," +
-                "notification_channel_state INTEGER" +
-        ");");
-    }
-
-    private void upgradeToVersion606(SQLiteDatabase db) {
-        db.execSQL("DROP VIEW IF EXISTS view_contacts_restricted;");
-        db.execSQL("DROP VIEW IF EXISTS view_data_restricted;");
-        db.execSQL("DROP VIEW IF EXISTS view_raw_contacts_restricted;");
-        db.execSQL("DROP VIEW IF EXISTS view_raw_entities_restricted;");
-        db.execSQL("DROP VIEW IF EXISTS view_entities_restricted;");
-        db.execSQL("DROP VIEW IF EXISTS view_data_usage_stat_restricted;");
-        db.execSQL("DROP INDEX IF EXISTS contacts_restricted_index");
-
-        // We should remove the restricted columns here as well, but unfortunately SQLite doesn't
-        // provide ALTER TABLE DROP COLUMN. As they have DEFAULT 0, we can keep but ignore them
-    }
-
-    private void upgradeToVersion608(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE contacts ADD photo_file_id INTEGER REFERENCES photo_files(_id);");
-
-        db.execSQL("CREATE TABLE photo_files(" +
-                "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
-                "height INTEGER NOT NULL, " +
-                "width INTEGER NOT NULL, " +
-                "filesize INTEGER NOT NULL);");
-    }
-
-    private void upgradeToVersion610(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE calls ADD is_read INTEGER;");
-    }
-
-    private void upgradeToVersion611(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE raw_contacts ADD data_set TEXT DEFAULT NULL;");
-        db.execSQL("ALTER TABLE groups ADD data_set TEXT DEFAULT NULL;");
-        db.execSQL("ALTER TABLE accounts ADD data_set TEXT DEFAULT NULL;");
-
-        db.execSQL("CREATE INDEX raw_contacts_source_id_data_set_index ON raw_contacts " +
-                "(sourceid, account_type, account_name, data_set);");
-
-        db.execSQL("CREATE INDEX groups_source_id_data_set_index ON groups " +
-                "(sourceid, account_type, account_name, data_set);");
-    }
-
-    private void upgradeToVersion612(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE calls ADD geocoded_location TEXT DEFAULT NULL;");
-        // Old calls will not have a geocoded location; new calls will get it when inserted.
-    }
-
-    private void upgradeToVersion613(SQLiteDatabase db) {
-        // The stream item and stream item photos APIs were not in-use by anyone in the time
-        // between their initial creation (in v609) and this update.  So we're just dropping
-        // and re-creating them to get appropriate columns.  The delta is as follows:
-        // - In stream_items, package_id was replaced by res_package.
-        // - In stream_item_photos, picture was replaced by photo_file_id.
-        // - Instead of resource IDs for icon and label, we use resource name strings now
-        // - Added sync columns
-        // - Removed action and action_uri
-        // - Text and comments are now nullable
-
-        db.execSQL("DROP TABLE IF EXISTS stream_items");
-        db.execSQL("DROP TABLE IF EXISTS stream_item_photos");
-
-        db.execSQL("CREATE TABLE stream_items(" +
-                "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
-                "raw_contact_id INTEGER NOT NULL, " +
-                "res_package TEXT, " +
-                "icon TEXT, " +
-                "label TEXT, " +
-                "text TEXT, " +
-                "timestamp INTEGER NOT NULL, " +
-                "comments TEXT, " +
-                "stream_item_sync1 TEXT, " +
-                "stream_item_sync2 TEXT, " +
-                "stream_item_sync3 TEXT, " +
-                "stream_item_sync4 TEXT, " +
-                "FOREIGN KEY(raw_contact_id) REFERENCES raw_contacts(_id));");
-
-        db.execSQL("CREATE TABLE stream_item_photos(" +
-                "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
-                "stream_item_id INTEGER NOT NULL, " +
-                "sort_index INTEGER, " +
-                "photo_file_id INTEGER NOT NULL, " +
-                "stream_item_photo_sync1 TEXT, " +
-                "stream_item_photo_sync2 TEXT, " +
-                "stream_item_photo_sync3 TEXT, " +
-                "stream_item_photo_sync4 TEXT, " +
-                "FOREIGN KEY(stream_item_id) REFERENCES stream_items(_id));");
-    }
-
-    private void upgradeToVersion615(SQLiteDatabase db) {
-        // Old calls will not have up to date values for these columns, they will be filled in
-        // as needed.
-        db.execSQL("ALTER TABLE calls ADD lookup_uri TEXT DEFAULT NULL;");
-        db.execSQL("ALTER TABLE calls ADD matched_number TEXT DEFAULT NULL;");
-        db.execSQL("ALTER TABLE calls ADD normalized_number TEXT DEFAULT NULL;");
-        db.execSQL("ALTER TABLE calls ADD photo_id INTEGER NOT NULL DEFAULT 0;");
-    }
-
-    private void upgradeToVersion618(SQLiteDatabase db) {
-        // The Settings table needs a data_set column which technically should be part of the
-        // primary key but can't be because it may be null.  Since SQLite doesn't support nuking
-        // the primary key, we'll drop the old table, re-create it, and copy the settings back in.
-        db.execSQL("CREATE TEMPORARY TABLE settings_backup(" +
-                "account_name STRING NOT NULL," +
-                "account_type STRING NOT NULL," +
-                "ungrouped_visible INTEGER NOT NULL DEFAULT 0," +
-                "should_sync INTEGER NOT NULL DEFAULT 1" +
-        ");");
-        db.execSQL("INSERT INTO settings_backup " +
-                "SELECT account_name, account_type, ungrouped_visible, should_sync" +
-                " FROM settings");
-        db.execSQL("DROP TABLE settings");
-        db.execSQL("CREATE TABLE settings (" +
-                "account_name STRING NOT NULL," +
-                "account_type STRING NOT NULL," +
-                "data_set STRING," +
-                "ungrouped_visible INTEGER NOT NULL DEFAULT 0," +
-                "should_sync INTEGER NOT NULL DEFAULT 1" +
-        ");");
-        db.execSQL("INSERT INTO settings " +
-                "SELECT account_name, account_type, NULL, ungrouped_visible, should_sync " +
-                "FROM settings_backup");
-        db.execSQL("DROP TABLE settings_backup");
-    }
-
-    private void upgradeToVersion622(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE calls ADD formatted_number TEXT DEFAULT NULL;");
-    }
-
-    private void upgradeToVersion626(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS accounts");
-
-        db.execSQL("CREATE TABLE accounts (" +
-                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
-                "account_name TEXT, " +
-                "account_type TEXT, " +
-                "data_set TEXT" +
-        ");");
-
-        // Add "account_id" column to groups and raw_contacts
-        db.execSQL("ALTER TABLE raw_contacts ADD " +
-                "account_id INTEGER REFERENCES accounts(_id)");
-        db.execSQL("ALTER TABLE groups ADD " +
-                "account_id INTEGER REFERENCES accounts(_id)");
-
-        // Update indexes.
-        db.execSQL("DROP INDEX IF EXISTS raw_contacts_source_id_index");
-        db.execSQL("DROP INDEX IF EXISTS raw_contacts_source_id_data_set_index");
-        db.execSQL("DROP INDEX IF EXISTS groups_source_id_index");
-        db.execSQL("DROP INDEX IF EXISTS groups_source_id_data_set_index");
-
-        db.execSQL("CREATE INDEX raw_contacts_source_id_account_id_index ON raw_contacts ("
-                + "sourceid, account_id);");
-        db.execSQL("CREATE INDEX groups_source_id_account_id_index ON groups ("
-                + "sourceid, account_id);");
-
-        // Migrate account_name/account_type/data_set to accounts table
-
-        final ArraySet<AccountWithDataSet> accountsWithDataSets = new ArraySet<>();
-        upgradeToVersion626_findAccountsWithDataSets(accountsWithDataSets, db, "raw_contacts");
-        upgradeToVersion626_findAccountsWithDataSets(accountsWithDataSets, db, "groups");
-
-        for (AccountWithDataSet accountWithDataSet : accountsWithDataSets) {
-            db.execSQL("INSERT INTO accounts (account_name,account_type,data_set)VALUES(?, ?, ?)",
-                    new String[] {
-                            accountWithDataSet.getAccountName(),
-                            accountWithDataSet.getAccountType(),
-                            accountWithDataSet.getDataSet()
-                    });
-        }
-        upgradeToVersion626_fillAccountId(db, "raw_contacts");
-        upgradeToVersion626_fillAccountId(db, "groups");
-    }
-
-    private static void upgradeToVersion626_findAccountsWithDataSets(
-            Set<AccountWithDataSet> result, SQLiteDatabase db, String table) {
-        Cursor c = db.rawQuery(
-                "SELECT DISTINCT account_name, account_type, data_set FROM " + table, null);
-        try {
-            while (c.moveToNext()) {
-                result.add(AccountWithDataSet.get(c.getString(0), c.getString(1), c.getString(2)));
-            }
-        } finally {
-            c.close();
-        }
-    }
-
-    private static void upgradeToVersion626_fillAccountId(SQLiteDatabase db, String table) {
-        StringBuilder sb = new StringBuilder();
-
-        // Set account_id and null out account_name, account_type and data_set
-
-        sb.append("UPDATE " + table + " SET account_id = (SELECT _id FROM accounts WHERE ");
-
-        addJoinExpressionAllowingNull(sb, table + ".account_name", "accounts.account_name");
-        sb.append("AND");
-        addJoinExpressionAllowingNull(sb, table + ".account_type", "accounts.account_type");
-        sb.append("AND");
-        addJoinExpressionAllowingNull(sb, table + ".data_set", "accounts.data_set");
-
-        sb.append("), account_name = null, account_type = null, data_set = null");
-        db.execSQL(sb.toString());
-    }
-
     private void upgradeToVersion701(SQLiteDatabase db) {
         db.execSQL("UPDATE raw_contacts SET last_time_contacted =" +
                 " max(ifnull(last_time_contacted, 0), " +
@@ -4744,18 +3337,6 @@
     }
 
     /**
-     * Add a string like "(((column1) = (column2)) OR ((column1) IS NULL AND (column2) IS NULL))"
-     */
-    private static StringBuilder addJoinExpressionAllowingNull(
-            StringBuilder sb, String column1, String column2) {
-
-        sb.append("(((").append(column1).append(")=(").append(column2);
-        sb.append("))OR((");
-        sb.append(column1).append(") IS NULL AND (").append(column2).append(") IS NULL))");
-        return sb;
-    }
-
-    /**
      * Adds index stats into the SQLite database to force it to always use the lookup indexes.
      *
      * Note if you drop a table or an index, the corresponding row will be removed from this table.