Index: subversion/libsvn_wc/wc-queries.sql =================================================================== --- subversion/libsvn_wc/wc-queries.sql (revision 1342072) +++ subversion/libsvn_wc/wc-queries.sql (working copy) @@ -587,11 +587,15 @@ WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE +/* ### The Sqlite optimizer needs help here ### + * WHERE wc_id = ?1 + * AND (local_relpath = ?2 + * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) + * AND op_depth >= ?3 */ DELETE FROM nodes -WHERE wc_id = ?1 - AND (local_relpath = ?2 - OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) - AND op_depth >= ?3 +WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3) + OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) + AND op_depth >= ?3) -- STMT_DELETE_ACTUAL_NODE DELETE FROM actual_node @@ -828,16 +832,25 @@ /* If this query is updated, STMT_INSERT_DELETE_LIST should too. */ -- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE +/* ### The Sqlite optimizer needs help here ### + * WHERE wc_id = ?1 + * AND (local_relpath = ?2 + * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) + * AND op_depth = ?3 + * AND presence NOT IN ('base-deleted', 'not-present', 'excluded', + * 'absent') */ INSERT INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, presence, kind) SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, 'base-deleted', kind FROM nodes -WHERE wc_id = ?1 - AND (local_relpath = ?2 - OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) - AND op_depth = ?3 - AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'absent') +WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 + AND presence NOT IN ('base-deleted', 'not-present', 'excluded', + 'absent')) + OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) + AND op_depth = ?3 + AND presence NOT IN ('base-deleted', 'not-present', 'excluded', + 'absent')) -- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY INSERT INTO nodes ( @@ -1229,7 +1242,7 @@ /* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE. A subquery is used instead of nodes_current to avoid a table scan */ --- STMT_INSERT_DELETE_LIST +-- STMT_INSERT_DELETE_LIST_RECURSIVE INSERT INTO delete_list(local_relpath) SELECT local_relpath FROM nodes AS n WHERE wc_id = ?1 @@ -1241,6 +1254,17 @@ AND s.local_relpath = n.local_relpath) AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'absent') +-- STMT_INSERT_DELETE_LIST +INSERT INTO delete_list(local_relpath) +SELECT local_relpath FROM nodes AS n +WHERE wc_id = ?1 + AND (local_relpath = ?2) + AND op_depth >= ?3 + AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s + WHERE s.wc_id = ?1 + AND s.local_relpath = n.local_relpath) + AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'absent') + -- STMT_SELECT_DELETE_LIST SELECT local_relpath FROM delete_list ORDER BY local_relpath Index: subversion/libsvn_wc/wc_db.c =================================================================== --- subversion/libsvn_wc/wc_db.c (revision 1342072) +++ subversion/libsvn_wc/wc_db.c (working copy) @@ -6728,8 +6728,15 @@ } /* ### Put actual-only nodes into the list? */ - SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, - STMT_INSERT_DELETE_LIST)); + /* If LOCAL_RELPATH at SELECT_DEPTH is a file we can use + the (faster) non-recursive query. */ + if (kind == svn_kind_file) + SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, + STMT_INSERT_DELETE_LIST)); + else + SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, + STMT_INSERT_DELETE_LIST_RECURSIVE)); + SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, local_relpath, select_depth)); SVN_ERR(svn_sqlite__step_done(stmt));