Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42122bfe authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Bind update() args as Object[] for performance.

It's wasteful to convert them to String when SQLite already knows
how to bind specific data types, including funky types like byte[].

Also promote to public API, since they're generally useful.

Bug: 111085900
Test: atest packages/providers/DownloadProvider/tests/
Test: atest cts/tests/app/src/android/app/cts/DownloadManagerTest.java
Test: atest cts/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryBuilderTest.java
Change-Id: I5b418bca1204773fd2795156a2f47906ca1e1a6b
parent 13b3a907
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -12677,6 +12677,7 @@ package android.database.sqlite {
    method public java.lang.String buildUnionQuery(java.lang.String[], java.lang.String, java.lang.String);
    method public java.lang.String buildUnionQuery(java.lang.String[], java.lang.String, java.lang.String);
    method public java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    method public java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    method public deprecated java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.lang.String);
    method public deprecated java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.lang.String);
    method public int delete(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
    method public java.lang.String getTables();
    method public java.lang.String getTables();
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
@@ -12686,6 +12687,7 @@ package android.database.sqlite {
    method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
    method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
    method public void setStrict(boolean);
    method public void setStrict(boolean);
    method public void setTables(java.lang.String);
    method public void setTables(java.lang.String);
    method public int update(android.database.sqlite.SQLiteDatabase, android.content.ContentValues, java.lang.String, java.lang.String[]);
  }
  }
  public class SQLiteReadOnlyDatabaseException extends android.database.sqlite.SQLiteException {
  public class SQLiteReadOnlyDatabaseException extends android.database.sqlite.SQLiteException {
+12 −9
Original line number Original line Diff line number Diff line
@@ -29,7 +29,7 @@ import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Log;


import com.android.internal.util.ArrayUtils;
import libcore.util.EmptyArray;


import java.util.Arrays;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Iterator;
@@ -436,7 +436,6 @@ public class SQLiteQueryBuilder
     *   that they appear in the selection. The values will be bound
     *   that they appear in the selection. The values will be bound
     *   as Strings.
     *   as Strings.
     * @return the number of rows updated
     * @return the number of rows updated
     * @hide
     */
     */
    public int update(@NonNull SQLiteDatabase db, @NonNull ContentValues values,
    public int update(@NonNull SQLiteDatabase db, @NonNull ContentValues values,
            @Nullable String selection, @Nullable String[] selectionArgs) {
            @Nullable String selection, @Nullable String[] selectionArgs) {
@@ -471,14 +470,19 @@ public class SQLiteQueryBuilder
            sql = unwrappedSql;
            sql = unwrappedSql;
        }
        }


        if (selectionArgs == null) {
            selectionArgs = EmptyArray.STRING;
        }
        final ArrayMap<String, Object> rawValues = values.getValues();
        final ArrayMap<String, Object> rawValues = values.getValues();
        final String[] updateArgs = new String[rawValues.size()];
        final int valuesLength = rawValues.size();
        for (int i = 0; i < updateArgs.length; i++) {
        final Object[] sqlArgs = new Object[valuesLength + selectionArgs.length];
            final Object arg = rawValues.valueAt(i);
        for (int i = 0; i < sqlArgs.length; i++) {
            updateArgs[i] = (arg != null) ? arg.toString() : null;
            if (i < valuesLength) {
                sqlArgs[i] = rawValues.valueAt(i);
            } else {
                sqlArgs[i] = selectionArgs[i - valuesLength];
            }
        }
        }

        final String[] sqlArgs = ArrayUtils.concat(String.class, updateArgs, selectionArgs);
        if (Log.isLoggable(TAG, Log.DEBUG)) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            if (Build.IS_DEBUGGABLE) {
            if (Build.IS_DEBUGGABLE) {
                Log.d(TAG, sql + " with args " + Arrays.toString(sqlArgs));
                Log.d(TAG, sql + " with args " + Arrays.toString(sqlArgs));
@@ -502,7 +506,6 @@ public class SQLiteQueryBuilder
     *   that they appear in the selection. The values will be bound
     *   that they appear in the selection. The values will be bound
     *   as Strings.
     *   as Strings.
     * @return the number of rows deleted
     * @return the number of rows deleted
     * @hide
     */
     */
    public int delete(@NonNull SQLiteDatabase db, @Nullable String selection,
    public int delete(@NonNull SQLiteDatabase db, @Nullable String selection,
            @Nullable String[] selectionArgs) {
            @Nullable String[] selectionArgs) {